StripeのCheckoutセッションで「銀行振込」をできるようにする方法です。
変更前はクレジットカード決済だけを提供していたのでこんな感じのコードになっていました。
checkout_session = stripe.checkout.Session.create(
mode="payment",
payment_method_types=["card"],
customer=stripe_customer_id,
line_items=[
{
"price": stripe_price_id,
"quantity": 1,
},
],
payment_intent_data={
"metadata": {
"product_name": product_name,
},
"setup_future_usage": "off_session",
},
success_url=success_url,
cancel_url=cancel_url,
)
payment_method_types
で "card"
を指定しています。また、 "setup_future_usage": "off_session"
で支払い情報を保存するようにしています。
銀行振込を追加しようとすると以下のようなコードになります。
checkout_session = stripe.checkout.Session.create(
mode="payment",
payment_method_types=["card", "customer_balance"], # 追加
customer=stripe_customer_id,
line_items=[
{
"price": stripe_price_id,
"quantity": 1,
},
],
payment_intent_data={
"metadata": {
"product_name": product_name,
},
},
payment_method_options={
"customer_balance": {
"funding_type": "bank_transfer",
"bank_transfer": {
"type": "jp_bank_transfer",
},
},
"card": {
"setup_future_usage": "off_session",
},
},
success_url=success_url,
cancel_url=cancel_url,
)
payment_method_types
に"customer_balance"
を追加します。payment_intent_data
で定義していたsetup_future_usage
をpayment_method_options
で定義します。"setup_future_usage": "off_session"
は「銀行振込」に対しては使えません。そのため"customer_balance"
を指定する場合はpayment_method_options
で個別に指定します。
payment_method_options
に銀行振込用の設定を追加します。(決済手段としてBank Transferを有効にする)
これによりStripeのチェックアウト画面で銀行振込が選択できるようになります。
webhook処理の対応
変更前はクレジットカードで支払いが行われた時に "checkout.session.completed"
のイベントをリッスンして処理をしていました。しかし、銀行振込の場合、ユーザーに口座情報が表示された(まだ支払いがされていない)時点で"checkout.session.completed"
のwebhookが飛んできてしまいます。(注文のフルフィルメントを実行する)
そのため、以下のような対応が必要となります。
if (
event.type == "checkout.session.completed"
and event.data.object.payment_status == "paid"
):
# クレジットカードの支払いが完了した時の処理
payment_status == "paid"
であることを確認しています。銀行振込の口座情報が表示された時点では "paid"
にはならないのでこの処理は実行されません。
また、銀行振込の場合は支払い完了時に checkout.session.async_payment_succeeded
というイベントタイプのwebhookが飛んでくるため、これを処理します。(遅延通知型の支払い方法を処理する)
if event.type == "checkout.session.async_payment_succeeded":
# 銀行振込の支払いが完了した時の処理
銀行振込の動作確認
テスト環境で、銀行振込で支払いがされた際にwebhookの処理がちゃんと実行されるかを確認します。
簡単な方法は、Stripeのダッシュボードで購入する顧客のページに行き、「支払い方法 > JPYの現金残高」から資金を追加しておきます。
残高がある状態で銀行振込のページを開くと支払いが行われ、webhookも飛んできます。(組み込みをテストする)