Open2

stripeでの決済方法手順について整理する

gontagonta

前提

  • 下記のようなenvをstripeの管理画面から取得をしておく
NEXT_PUBLIC_STRIPE_KEY=pk_test_hogehogehoge
STRIPE_SECRET_API_KEY=sk_test_hogehogehoge
  • 動作確認をするときは必ずtestモードのapikeyを使う

next.jsのapp routerのtrpcの構成で作っている。
stripeの決済でECシステムの単体での購入を想定。サブスクではない。

やること1、paymentintentを作って、client_secretをサーバーで発行をする。

client_secretがないとstripeのpaymentElementが表示できない。

export const resolver = async ({ ctx, input }: AuthProcedureArg<SecretStripeServerSchema>) => {
  const { amount } = input
  const user = await ctx.repository.user.findById(ctx.user.id)
  if (user === null) {
    throw new Error('ユーザー情報の取得に失敗しました。')
  }
  const paymentIntent = await ctx.stripe.paymentIntents.create({
    amount: amount,
    currency: 'jpy',
    customer: user.customerId,
    receipt_email: user.email,
  })

  return {
    clientSecret: paymentIntent.client_secret,
  }
}
gontagonta

その他のメモ

IntegrationError: stripe.confirmPayment(): do not pass setup_future_usage at confirm time. Instead, pass setup_future_usage when the PaymentIntent is created.

stripe.confirmPaymentにsetup_future_usageを直接渡すことができない。paymentIntentを作成するときにつけろと言われる。
ただ、決済情報を次回に使い回すかをユーザーに選択をさせるようにするにはどうしたらいいのか。

おそらくはpaymentIntentをupdateするのがいいのだろう。