COBAKURA.COM

Stripe Checkoutセッションで銀行振込できるようにする

StripeのCheckoutセッションで「銀行振込」をできるようにする方法です。

変更前はクレジットカード決済だけを提供していたのでこんな感じのコードになっていました。

stripe.py
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" で支払い情報を保存するようにしています。

銀行振込を追加しようとすると以下のようなコードになります。

stripe.py
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_usagepayment_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が飛んできてしまいます。(注文のフルフィルメントを実行する)

そのため、以下のような対応が必要となります。

webhook.py
if (
        event.type == "checkout.session.completed"
        and event.data.object.payment_status == "paid"
    ):
    # クレジットカードの支払いが完了した時の処理

payment_status == "paid" であることを確認しています。銀行振込の口座情報が表示された時点では "paid" にはならないのでこの処理は実行されません。

また、銀行振込の場合は支払い完了時に checkout.session.async_payment_succeeded というイベントタイプのwebhookが飛んでくるため、これを処理します。(遅延通知型の支払い方法を処理する)

webhook.py
if event.type == "checkout.session.async_payment_succeeded":
    # 銀行振込の支払いが完了した時の処理

銀行振込の動作確認

テスト環境で、銀行振込で支払いがされた際にwebhookの処理がちゃんと実行されるかを確認します。

簡単な方法は、Stripeのダッシュボードで購入する顧客のページに行き、「支払い方法 > JPYの現金残高」から資金を追加しておきます。

stripe-add-balance

残高がある状態で銀行振込のページを開くと支払いが行われ、webhookも飛んできます。(組み込みをテストする)

おすすめ記事

2023/8/7

Stripeによる決済機能実装時に得られた知見