# 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' ``` ## Customer の作成 [サーバ側] 将来の支払いで Bacs ダイレクトデビットの支払い方法を再利用するには、この支払い方法を *Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments) に関連付ける必要があります。顧客がお客様のビジネスでアカウントを作成するときに Customer オブジェクトを作成し、その Customer オブジェクトの ID を顧客を表す独自の内部表現に関連付け、保存した支払い方法の詳細を後で使用できるようにします。既存の Customer オブジェクトがある場合は、このステップをスキップしてください。 ```curl curl -X POST https://api.stripe.com/v1/customers \ -u "<>:" ``` ## 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 セッションを作成して、必要な情報を収集します。Checkout セッションを作成したら、レスポンスで返された [URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url) に顧客をリダイレクトします。 #### curl ```bash curl https://api.stripe.com/v1/checkout/sessions \ -u <>: \ -d "payment_method_types[]"="bacs_debit" \ -d mode=setup \ -d customer="{{CUSTOMER_ID}}" \ -d 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/seti_1EzVO3HssDVaQm2PJjXHmLlM \ -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 | 支払いが成功し、PaymentIntent が `processing` から `succeeded` に変化します。 | | 108800 | 90012345 | 支払いが 3 分後に成功し、PaymentIntent が `processing` から `succeeded` に変化します。 | | 108800 | 33333335 | 支払いが承認されますが、すぐに `debit_not_authorized` エラーコードによって失敗し、PaymentIntent が `processing` から `requires_payment_method` に変わります。同意書は `inactive` になり、この PaymentMethod を再び使用することはできません。 | | 108800 | 93333335 | 支払いが `debit_not_authorized` エラーコードによって 3 分後に失敗し、PaymentIntent が `processing` から `requires_payment_method` に変化します。同意書は `inactive` になり、この PaymentMethod を再び使用することはできません。 | | 108800 | 22222227 | 支払いが `insufficient_funds` エラーコードによって失敗し、PaymentIntent が `processing` から `requires_payment_method` に変化します。同意書は `active` のままで、この PaymentMethod は再使用が可能です。 | | 108800 | 92222227 | 支払いが `insufficient_funds` エラーコードによって 3 分後に失敗し、PaymentIntent が `processing` から `requires_payment_method` に変化します。同意書は `active` のままで、この PaymentMethod は再使用が可能です。 | | 108800 | 55555559 | 支払いが 3 分後に成功し、PaymentIntent が `processing` から `succeeded` に変わりますが、不審請求の申請が直ちに作成されます。 | | 108800 | 00033333 | 支払い方法の作成は成功しますが、同意書が顧客の銀行によって拒否され、即座に inactive に変化します。 | | 108800 | 00044444 | Bacs ダイレクトデビットの設定を求めるリクエストが、口座番号が無効なため即座に失敗し、顧客は送信前に情報を更新するように求められます。支払いの詳細は回収されません。 | | 108800 | 34343434 | 支払い額がアカウントの週次支払い額の上限を超えているため、支払いは `charge_exceeds_source_limit` エラーコードで失敗します。 | | 108800 | 12121212 | 支払い額がアカウントの取引金額の上限を超えているため、支払いは `charge_exceeds_weekly_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 ダイレクトデビットによる支払いの受け付けが可能になります。 #### curl ```bash curl https://api.stripe.com/v1/payment_intents \ -u <>: \ -d "payment_method_types[]"="bacs_debit" \ -d payment_method="{{PAYMENT_METHOD_ID}}" \ -d customer="{{CUSTOMER_ID}}" \ -d confirm=true \ -d amount=100 \ -d currency=gbp ```