# Bacs ダイレクトデビットの銀行詳細を保存する 今後の Bacs ダイレクトデビット支払いに備えて、Checkout を使用して支払い方法の詳細を保存する方法を紹介します。 [Stripe Checkout](https://docs.stripe.com/payments/checkout.md) を使用して、事前に Bacs ダイレクトデビット支払いの詳細を収集し、後から最終的な金額や支払い日を決定します。この機能が役立つ用途を紹介します。 - 支払い方法をウォレットに保存して、以降の購入を効率化する。 - サービスの提供後に追加料金を回収する。 - [サブスクリプションの無料トライアルを開始する](https://docs.stripe.com/billing/subscriptions/trials.md)。 ## Stripe を設定する [サーバ側] まず、Stripe アカウントが必要です。[今すぐ登録](https://dashboard.stripe.com/register)してください。 アプリケーションから Stripe API にアクセスするには、Stripe の公式ライブラリを使用します。 #### Ruby ```bash # Available as a gem sudo gem install stripe ``` ```ruby # If you use bundler, you can add this line to your Gemfile gem 'stripe' ``` ## 顧客を作成または取得する [サーバ側] 次回以降の支払いで Bacs ダイレクトデビットの決済手段を再利用するには、その決済手段を顧客を表すオブジェクトに紐付けます。 > #### Accounts v2 API を使用した顧客の表現 > > Accounts v2 API では、Connect ユーザーには一般提供され、その他の Stripe ユーザーには公開プレビューで提供されます。Accounts v2 プレビューの一部である場合は、コードで[プレビューバージョン](https://docs.stripe.com/api-v2-overview.md#sdk-and-api-versioning)を指定する必要があります。 > > Accounts v2 のプレビューに参加するには、ダッシュボードの [Account previews and features](https://dashboard.stripe.com/settings/previews) に移動して、**Global Payouts の再利用可能な決済手段**を有効にします。 > > ほとんどのユースケースでは、[Customer](https://docs.stripe.com/api/customers.md) オブジェクトを使用するのではなく、[顧客を顧客設定済みの Account オブジェクトとしてモデル化する](https://docs.stripe.com/accounts-v2/use-accounts-as-customers.md)ことをお勧めします。 顧客がビジネスでアカウントを作成するとき、または決済手段を保存するときに、顧客設定の [Account](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer) または [Customer](https://docs.stripe.com/api/customers/create.md) を作成する。オブジェクトの ID を、顧客を表す独自の内部表現に関連付ける。 この決済に関連付ける新しい顧客を作成するか、既存の顧客を取得する。 #### Accounts v2 ```curl curl -X POST https://api.stripe.com/v2/core/accounts \ -H "Authorization: Bearer <>" \ -H "Stripe-Version: 2026-06-24.preview" \ --json '{ "contact_email": "jenny.rosen@example.com", "display_name": "Jenny Rosen", "configuration": { "customer": {} }, "include": [ "configuration.customer" ] }' ``` #### Customers v1 ```curl curl https://api.stripe.com/v1/customers \ -u "<>:" \ -d "name=Jenny Rosen" \ --data-urlencode "email=jenny.rosen@example.com" ``` ## Checkout セッションを作成する [クライアント側] [サーバ側] [Stripe Checkout](https://docs.stripe.com/payments/checkout.md) は、Bacs ダイレクトデビットのルールに準拠したオンラインの支払いページを提供します。 自社の Bacs ダイレクトデビットフォームを設計する場合は、営業チームに[お問い合わせ](https://stripe.com/contact/sales)ください。 ダイレクトデビットによる支払いを受け付ける前に、顧客は Stripe Checkout を介して銀行口座情報を提供し、口座からの引き落としを許可する必要があります ([同意書](https://docs.stripe.com/payments/payment-methods/bacs-debit.md#mandates)とも呼ばれます)。 Web サイトに決済ボタンを追加し、サーバー側のエンドポイントを呼び出して Checkout セッションを作成します。 ```html Checkout
``` 必要な情報を収集するには、`setup` モードで Checkout Session を作成します。Checkout Session を作成した後、レスポンスで返された [URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url) に顧客をリダイレクトします。ダッシュボードで[決済手段を有効にします](https://dashboard.stripe.com/settings/payment_methods)。Stripe は対象となる決済手段を自動的に表示します。 #### Accounts v2 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d "customer_account={{CUSTOMERACCOUNT_ID}}" \ -d mode=setup \ --data-urlencode "success_url=https://example.com/success?session_id={CHECKOUT_SESSION_ID}" ``` #### Customers v1 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d "customer={{CUSTOMER_ID}}" \ -d mode=setup \ --data-urlencode "success_url=https://example.com/success?session_id={CHECKOUT_SESSION_ID}" ``` 顧客は支払い方法の詳細を指定すると、`success_url` にリダイレクトされます。これはお客様のウェブサイト上にあり、支払い方法が正常に保存されたことを顧客に知らせるページです。上記の例のように、`success_url` に `{CHECKOUT_SESSION_ID}` テンプレート変数を含めて、成功ページでセッション ID を使用できるようにします。 > 決済開始の検出にあたっては、`success_url` へのリダイレクトのみに依存しないでください。その理由は次のとおりです。 > > - 悪意を持つユーザが、支払いをせずに `success_url` に直接アクセスし、商品やサービスにアクセスできるようになる可能性があります。 - 決済が成功した後で、顧客が `success_url` にリダイレクトされる前にブラウザタブを閉じる可能性あります。 > Bacs ダイレクトデビットのルールでは、支払い詳細を収集したときに、顧客にメール通知を送信することが義務付けられています。デフォルトでは、これらのメールは Stripe によって自動的に送信されます。[独自の Bacs 通知を送信する](https://docs.stripe.com/payments/payment-methods/bacs-debit.md#debit-notifications)ことも選択できます。 ## 支払い方法を取得する [サーバ側] 顧客が支払いの詳細を送信した後に、[PaymentMethod (決済手段)](https://docs.stripe.com/payments/payment-methods.md) オブジェクトを取得します。*PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) は、顧客のbank account情報を保存して今後の支払いに利用できるようにします。PaymentMethod は、`success_url` を使用して同期的に取得することも、*Webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) を使用して非同期的に取得することもできます。 顧客が支払いの成功後に必ず `success_url` に到達するとは限らないため (たとえば、リダイレクトが行われる前に顧客がブラウザータブを閉じることもあります)、PaymentMethod を同期的に取得するか非同期的に取得するかは、ドロップオフの許容度によって異なります。Webhook を使用すると、組み込みでこの種のドロップオフを防止できます。 #### Webhook Session オブジェクトを含む `checkout.session.completed` Webhook を処理します。詳細については、[Webhook を設定する](https://docs.stripe.com/webhooks.md)をご覧ください。以下は、`checkout.session.completed` レスポンスの例です。 ```json { "id": "evt_1Ep24XHssDVaQm2PpwS19Yt0", "object": "event", "api_version": "2019-03-14", "created": 1561420781, "data": { "object": { "id": "cs_test_MlZAaTXUMHjWZ7DcXjusJnDU4MxPalbtL5eYrmS2GKxqscDtpJq8QM0k", "object": "checkout.session", "billing_address_collection": null, "client_reference_id": null, "customer": null, "customer_email": null, "display_items": [], "mode": "setup","setup_intent": "seti_1EzVO3HssDVaQm2PJjXHmLlM", "submit_type": null, "subscription": null, "success_url": "https://example.com/success" } }, "livemode": false, "pending_webhooks": 1, "request": { "id": null, "idempotency_key": null }, "type": "checkout.session.completed" } ``` Checkout Session で作成された SetupIntent の ID である `setup_intent` キーの値を書き留めます。[SetupIntent](https://docs.stripe.com/payments/setup-intents.md) は、今後の支払いに利用できるように顧客のbank account情報を設定するために使用されるオブジェクトです。この ID を使用して SetupIntent オブジェクトを[取得](https://docs.stripe.com/api/setup_intents/retrieve.md)します。返されるオブジェクトには `payment_method` ID が含まれます。 ```curl curl https://api.stripe.com/v1/setup_intents/{{SETUPINTENT_ID}} \ -u "<>:" ``` #### 成功時の URL ユーザーがリダイレクトによってサイトに戻ったら、URL から `session_id` を取得し、Session オブジェクトを[取得](https://docs.stripe.com/api/checkout/sessions/retrieve.md) します。 ```curl curl -G https://api.stripe.com/v1/checkout/sessions/{{SESSION_ID}} \ -u "<>:" \ -d "expand[]=setup_intent" ``` > URL から `session_id` を確実に使用できるようにするには、Checkout セッションを作成する際に `success_url` に `session_id={CHECKOUT_SESSION_ID}` テンプレート変数を含めます。 Checkout Session 中に作成された SetupIntent を書き留めます。[SetupIntent](https://docs.stripe.com/payments/setup-intents.md) は、今後の支払いに利用できるように顧客のbank account情報を設定するために使用されるオブジェクトです。返されるオブジェクトには `payment_method` ID が含まれます。 ## 設定後のイベントを処理する [サーバ側] Checkout セッションが完了すると、支払い詳細が同意書として銀行に送信されます。 同意書は、収集後にいつでも変更される可能があります。同意書の変更が行われるのは、顧客が銀行に同意書の修正を指示した場合や、銀行自体が変更された場合 (たとえば、顧客が別の銀行に変更した場合など) などが考えられます。同意書が変更されると、Stripe は 以下のイベントを送信します。 | イベント名 | 説明 | 支払いの受け付けが可能か | | --- | --- | --- | | `mandate.updated` | 同意書が Bacs ネットワークによって拒否、キャンセル、または再度有効化された場合に発生します。[mandate.status](https://docs.stripe.com/api/mandates/object.md#mandate_object-status) を確認し、同意書を引き続き使用できるかどうかを判断してください。 | はい (新しいステータスが `active` の場合) | | `payment_method.automatically_updated` | 顧客の銀行口座詳細が変わった場合に発生します。 | はい | これらのイベントは [ダッシュボード](https://dashboard.stripe.com/events) で利用可能ですが、*Webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) をセットアップすることで、プログラムでこれらのイベントを処理することができます。 ## 組み込みをテストする この組み込みの準備が整っていることを確認するために、*サンドボックス* (A sandbox is an isolated test environment that allows you to test Stripe functionality in your account without affecting your live integration. Use sandboxes to safely experiment with new features and changes)で使用できる[テスト用銀行口座番号](https://docs.stripe.com/keys.md#test-live-modes)がいくつかあります。対応するトークンを使用して、銀行口座の詳細を手動で入力する手間を省くこともできます。 | ソートコード | 口座番号 | トークン | 説明 | | --- | --- | --- | --- | | `108800` | `00012345` | `pm_bacsDebit_success` | 支払いが成功し、PaymentIntent が `processing` から `succeeded` に変化します。 | | `108800` | `90012345` | `pm_bacsDebit_successDelayed` | 支払いが 3 分後に成功し、PaymentIntent が `processing` から `succeeded` に変化します。 | | `108800` | `33333335` | `pm_bacsDebit_debitNotAuthorized` | 支払いが承認されますが、すぐに `debit_not_authorized` エラーコードによって失敗し、PaymentIntent が `processing` から `requires_payment_method` に変わります。同意書は `inactive` になり、この PaymentMethod を再び使用することはできません。 | | `108800` | `93333335` | `pm_bacsDebit_debitNotAuthorizedDelayed` | 支払いが `debit_not_authorized` エラーコードによって 3 分後に失敗し、PaymentIntent が `processing` から `requires_payment_method` に変化します。同意書は `inactive` になり、この PaymentMethod を再び使用することはできません。 | | `108800` | `22222227` | `pm_bacsDebit_insufficientFunds` | 支払いが `insufficient_funds` エラーコードによって失敗し、PaymentIntent が `processing` から `requires_payment_method` に変化します。同意書は `active` のままで、この PaymentMethod は再使用が可能です。 | | `108800` | `92222227` | `pm_bacsDebit_insufficientFundsDelayed` | 支払いが `insufficient_funds` エラーコードによって 3 分後に失敗し、PaymentIntent が `processing` から `requires_payment_method` に変化します。同意書は `active` のままで、この PaymentMethod は再使用が可能です。 | | `108800` | `55555559` | `pm_bacsDebit_dispute` | 支払いが 3 分後に成功し、PaymentIntent が `processing` から `succeeded` に変わりますが、不審請求の申請が直ちに作成されます。 | | `108800` | `00033333` | `pm_bacsDebit_mandateRefused` | 決済手段の作成は成功しますが、同意書が顧客の銀行に拒否され、即座に `inactive` に移行します。 | | `108800` | `00044444` | — | Bacs ダイレクトデビットを設定するリクエストは、口座番号が無効なため直ちに失敗し、顧客には送信前に情報を更新するよう促されます。決済情報は収集されないため、このシナリオに対応する合成トークンはありません。 | | `108800` | `34343434` | `pm_bacsDebit_exceedsWeeklyLimit` | 支払い額がアカウントの週次支払い額の上限を超えているため、支払いは `charge_exceeds_source_limit` エラーコードで失敗します。 | | `108800` | `12121212` | `pm_bacsDebit_exceedsTransactionLimit` | 決済金額がアカウントの取引額上限を超えたため、決済は `charge_exceeds_transaction_limit` の失敗コードで失敗します。 | テストの実行には前述の任意の口座番号を使用できます。ただし、Bacs ダイレクトデビットによる支払いは処理に数日かかるため、3 分の遅延で動作するテスト用口座番号を使用して、本番環境の支払いの動作のシミュレーションをしやすくします。 > デフォルトでは、Stripe は決済情報が初めて収集されたときと、顧客の口座から引き落としが行われるたびに、顧客に[メール](https://docs.stripe.com/payments/payment-methods/bacs-debit.md#debit-notifications)を送信します。これらの通知は、サンドボックスでは送信されません。 ## 支払い方法を将来の支払いに使用する [サーバ側] *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) を設定した後、[PaymentIntent](https://docs.stripe.com/payments/payment-intents.md) を作成して確定することで、将来の Bacs ダイレクトデビットによる支払いの受け付けが可能になります。 #### Accounts v2 ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d "automatic_payment_methods[enabled]=true" \ -d "payment_method={{PAYMENTMETHOD_ID}}" \ -d "customer_account={{CUSTOMERACCOUNT_ID}}" \ -d confirm=true \ -d amount=100 \ -d currency=gbp ``` #### Customers v1 ```curl curl https://api.stripe.com/v1/payment_intents \ -u "<>:" \ -d "automatic_payment_methods[enabled]=true" \ -d "payment_method={{PAYMENTMETHOD_ID}}" \ -d "customer={{CUSTOMER_ID}}" \ -d confirm=true \ -d amount=100 \ -d currency=gbp ```