# カナダのプレオーソリデビットを使用したサブスクリプションを設定する カナダのプレオーソリデビットを使用したサブスクリプションの作成と請求の方法をご紹介します。 > [Checkout](https://docs.stripe.com/payments/checkout.md) のサブスクリプションモードはまだサポートされていません。この機能が提供されたときに早期アクセスをご希望の場合は、[Stripe までお問い合わせ](mailto:payment-methods-feedback@stripe.com?subject=PADs%20Subscription%20Mode%20User%20Interest)いただき、待機リストに登録してください。 ## 商品と価格を作成する [ダッシュボード] [Products (商品)](https://docs.stripe.com/api/products.md) は、販売しているアイテムまたはサービスを表します。[Prices (価格)](https://docs.stripe.com/api/prices.md) は、商品の価格と請求頻度を定義します。これには、商品の価格、受け付ける通貨、および 1 回限りの支払いか継続支払いかが含まれます。商品と価格が数個のみの場合は、ダッシュボードでそれらを作成および管理します。 このガイドでは、例としてストックフォトサービスを使用し、15 CAD の月次サブスクリプションを顧客に請求します。これをモデル化するには、次のようにします。 1. [商品](https://dashboard.stripe.com/products?active=true)ページに移動し、**商品を作成**をクリックします。 1. 商品の**名前**を入力します。オプションで**説明**を追加して、商品の画像をアップロードできます。 1. **商品税コード**を選択します。[商品税コード](https://docs.stripe.com/tax/tax-codes.md)の詳細をご確認ください。 1. **継続**を選択します。次に、価格に**15**を入力し、通貨として**\**を選択します。 1. **価格に税金を含める**かどうかを選択します。[税金設定](https://dashboard.stripe.com/test/settings/tax)のデフォルト値を使用するか、値を手動で設定できます。この例では、**自動**を選択します。 1. **請求期間**で**月次**を選択します。 1. **その他の料金体系オプション**をクリックします。次に、この例の料金体系モデルとして**定額**を選択します。[定額料金](https://docs.stripe.com/products-prices/pricing-models.md#flat-rate)とその他の[料金体系モデル](https://docs.stripe.com/products-prices/pricing-models.md)の詳細をご確認ください。 1. 将来的に特定の価格を整理、クエリ、更新するために、内部**価格の説明**と[検索キー](https://docs.stripe.com/products-prices/manage-prices.md#lookup-keys) 追加します。 1. **次へ**をクリックします。次に、**商品を追加**をクリックします。 商品と価格を作成したら、価格 ID を記録しておき、後続のステップで使用できるようにします。ID は料金体系ページで `price_G0FvDp6vZvdwRZ` のように表示されます。 ## サブスクリプションを作成する [サーバー側] > 無料のトライアル期間付きのサブスクリプションの作成については、[サブスクリプションのトライアル](https://docs.stripe.com/billing/subscriptions/acss-debit.md#trial-periods)をご覧ください。 [payment_behavior](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-payment_behavior) パラメーターの値として `default_incomplete` を指定して、ステータスが `incomplete` の価格と顧客の [Subscription (サブスクリプション)](https://docs.stripe.com/api/subscriptions.md) を作成します。 #### curl ```bash curl https://api.stripe.com/v1/subscriptions \ -u <>: \ -d "customer"="{{CUSTOMER_ID}}" \ -d "items[0][price]"="price_F52b2UdntfQsfR" \ -d "payment_behavior"="default_incomplete" \ -d "payment_settings[payment_method_types][]"="acss_debit" \ -d "expand[0]"="latest_invoice.payment_intent" ``` レスポンスには、*サブスクリプション* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis)の最初の [Invoice (請求書)](https://docs.stripe.com/api/invoices.md) が含まれます。これには請求書の支払いが格納され、Stripe がこのインボイスに対して生成したデフォルトの PaymentIntent と、PaymentIntent オブジェクト全体を渡す代わりに、クライアント側で決済プロセスを安全に完了するために使用できる、confirmation secret が含まれます。`latest_invoice.confirmation_secret.client_secret` をフロントエンドに返して、支払いを完了します。 ## 支払い方法の詳細と同意書承認を収集する [クライアント側] カナダのプレオーソリデビットを使用するには、プレオーソリデビット利用規約を使用して、1 回限りの引き落としと継続的な引き落としについて顧客から承認を得る必要があります ([PAD 同意書](https://docs.stripe.com/payments/acss-debit.md#mandates) を参照)。[Mandate (同意書)](https://docs.stripe.com/api/mandates.md) オブジェクトは、この利用契約と承認を記録します。 Stripe がお客様に代わってサブスクリプションと*請求書* (Invoices are statements of amounts owed by a customer. They track the status of payments from draft through paid or otherwise finalized. Subscriptions automatically generate invoices, or you can manually create a one-off invoice)の同意書を自動的に設定します。顧客が同意書の条件を一度承認するだけで、それ以上介入しなくても、後続のサブスクリプションの支払いは成功します。 顧客が Canadian pre-authorized debitでの支払いをクリックしたときに、Stripe.js を使用してその支払いを Stripe に送信することをお勧めします。[Stripe.js](https://docs.stripe.com/payments/elements.md) は、決済フローを構築するための Stripe の基本的な JavaScript ライブラリです。これにより、実装に関する複雑な処理が自動的に行われ、将来、他の決済手段にも対応できるように実装を簡単に拡張できます。 Stripe.js スクリプトを決済ページに含めるには、このスクリプトを HTML ファイルの `head` に追加します。 ```html Checkout ``` 決済ページで以下の JavaScript を使用して、Stripe.js のインスタンスを作成します。 ```javascript // Set your publishable key. Remember to change this to your live publishable key in production! // See your keys here: https://dashboard.stripe.com/apikeys const stripe = Stripe('<>'); ``` PaymentIntent オブジェクト全体をクライアントに送信する代わりに、前のステップからの *client secret* (The client secret is a unique key returned from Stripe as part of a PaymentIntent. This key lets the client access important fields from the PaymentIntent (status, amount, currency) while hiding sensitive ones (metadata, customer)) を使用します。これは、Stripe API リクエストを認証する API キーとは異なります。 それでも、client secret は支払いを完了できるため、慎重に扱う必要があります。記録したり、URL に埋め込んだり、その顧客以外に公開されることがないようにしてください。 ユーザーがフォームを送信したら、[stripe.confirmAcssDebitPayment](https://docs.stripe.com/js/payment_intents/confirm_acss_debit_payment) を使用して、銀行口座の詳細と銀行口座の確認を収集し、同意書を確認し、支払いを完了します。PAD の決済手段を作成するには、`payment_method` パラメーターの `billing_details` プロパティに顧客のメールアドレスと口座名義人を含める必要があります。 ```javascript const form = document.getElementById('payment-form'); const accountholderName = document.getElementById('accountholder-name'); const email = document.getElementById('email'); const submitButton = document.getElementById('submit-button'); const clientSecret = submitButton.dataset.secret; form.addEventListener('submit', async (event) => { event.preventDefault(); const {paymentIntent, error} = await stripe.confirmAcssDebitPayment( clientSecret, { payment_method: { billing_details: { name: accountholderName.value, email: email.value, }, }, } ); if (error) { // Inform the customer that there was an error. console.log(error.message); } else { // Handle next step based on PaymentIntent's status. console.log("PaymentIntent ID: " + paymentIntent.id); console.log("PaymentIntent status: " + paymentIntent.status); } }); ``` Stripe.js は、ページ上のモーダル UI をロードして、銀行口座の詳細の収集と銀行口座の確認を処理し、オンライン同意書を提示して承認を収集します。 > `stripe.confirmAcssDebitPayment` の完了には数秒かかる場合があります。この間、フォームが再送信されないように無効化し、スピナーのような待機中のインジケーターを表示します。エラーが発生した場合は、それを顧客に表示し、フォームを再度有効化し、待機中のインジケーターを非表示にします。 顧客が即時確認を完了すると、サブスクリプションは自動的に `active` になります。それ以外の場合は、サブスクリプションが `incomplete` の状態のままである場合の少額入金による確認の取り扱いについて、以下のセクションをご確認ください。 ## 少額入金で銀行口座を確認する [クライアント側] > 顧客はサブスクリプションに対する少額入金を、[サブスクリプションのライフサイクル](https://docs.stripe.com/billing/subscriptions/overview.md#subscription-lifecycle)で通常指定されている 23 時間以内ではなく、10 日以内に確認する必要があります。ただし、この有効期限は[請求期間の日付](https://docs.stripe.com/billing/subscriptions/acss-debit.md#billing-cycle)より後にできません。 すべての顧客が銀行口座を即座に確認できるとは限りません。このステップは、顧客が前のステップで即時確認フローからオプトアウトした場合にのみ適用されます。 この場合、Stripe は顧客の銀行口座に 2 回に分けて少額入金を自動的に行います。これらの入金が顧客のオンライン明細書に表示され、`ACCTVERIFY` 明細書表記が付けられるまでに 1〜2 営業日かかります。 前のステップで行った `stripe.confirmAcssDebitPayment` メソッドの呼び出しの結果として、`requires_action` 状態の PaymentIntent が返されます。この PaymentIntent には、確認を完了するための有益な情報を含む `next_action` フィールドが含まれています。 Stripe は[請求書メール](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-billing_details-email)で入金の到着予定日を顧客に通知します。このメールには、Stripe がオンラインで提供する確認ページへのリンクが含まれ、顧客はそのページで入金額を確認して銀行口座の確認を完了することができます。 確認の失敗は 3 回までです。この上限を超えると、銀行口座の確認ができなくなります。また、少額入金の確認は 10 日経過するとタイムアウトになります。少額入金がこの期間内に確認されない場合、PaymentIntent は新しい決済手段の詳細を要求する状態に戻ります。少額入金とは何か、どのように使用するのかを顧客に明確に伝えることで、顧客は確認に関連する問題を回避できます。 ### オプション: カスタムのメールと確認ページ [カスタムのメール通知](https://docs.stripe.com/payments/acss-debit.md#mandate-and-debit-notification-emails)の送信を選択した場合は、顧客にメールを送信する必要があります。このためには、`next_action` オブジェクトの `verify_with_microdeposits[hosted_verification_url]` の URL を使用して、顧客に確認プロセスを完了するよう指示します。 カスタムメールを送信していて、Stripe がオンラインで提供する確認ページを使用しない場合、[Stripe.js](https://docs.stripe.com/js/payment_intents/verify_microdeposits_for_payment) を使用して、顧客がこれらの金額をお客様に伝えて銀行口座を確認するためのフォームを自社サイトに作成できます。 ```javascript stripe.verifyMicrodepositsForPayment(clientSecret, { amounts: [32, 45], }); ``` ## デフォルトの支払い方法を設定する [サーバー] これで、支払い方法が指定された顧客の有効な*サブスクリプション* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis)を作成できましたが、この支払い方法は以降の支払いで自動的には使用されません。これ以降もこの支払い方法に自動的に請求するには、*Webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) Consumer を使用して、新しいサブスクリプションの `invoice.payment_succeeded` イベントをリッスンし、デフォルトの支払い方法を設定します。 #### Ruby ```ruby # Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. # Find your keys at https://dashboard.stripe.com/apikeys. Stripe.api_key = '<>' if event.type == 'invoice.payment_succeeded' invoice = event.data.object if invoice['billing_reason'] == 'subscription_create' subscription_id = invoice['parent']['subscription_details']['subscription'] # This example assumes you're using the default PaymentIntent that Stripe generated for the invoice. invoice_payments = Stripe::InvoicePayment.list({invoice: invoice['id']}) payment_intent_id = invoice_payments.data[0].payment.payment_intent # Retrieve the payment intent used to pay the subscription payment_intent = Stripe::PaymentIntent.retrieve(payment_intent_id) # Set the default payment method Stripe::Subscription.update( subscription_id, default_payment_method: payment_intent.payment_method ) end end ``` ## サブスクリプションのステータスを管理する [クライアント側] 初回の支払いが完了すると、サブスクリプションのステータスは `active` になり、それ以上のアクションは不要になります。支払いが失敗した場合は、ステータスが [自動回収設定](https://docs.stripe.com/invoicing/automatic-collection.md) で設定された **Subscription status** に変わります。支払いが失敗した場合は顧客にその旨を通知して、[別の支払い方法で請求してください](https://docs.stripe.com/billing/subscriptions/overview.md#requires-payment-method)。 > カナダのプレオーソリデビット支払いは、他の支払い方法に[再試行スケジュール](https://docs.stripe.com/invoicing/automatic-collection.md)が設定されている場合でも、自動的に再試行することはありません。 ## 組み込みをテストする ### テスト用の決済手段トークン テスト用の決済手段トークンを使用すると、銀行口座の詳細を手動で入力することなく、連携をテストできます。これらのトークンを使用すると、銀行口座情報の収集と確認のステップが省略できます。 | トークン | シナリオ | | --------------------------------- | ----------------------------- | | `pm_acssDebit_success` | 同意書が承認されると、直ちに決済できます。 | | `pm_acssDebit_noAccount` | 口座が見つからないため、支払いは失敗します。 | | `pm_acssDebit_accountClosed` | 口座が解約済みであるため、支払いは失敗します。 | | `pm_acssDebit_insufficientFunds` | 残高不足のため、支払いは失敗します。 | | `pm_acssDebit_debitNotAuthorized` | 引き落としがオーソリされていないため、支払いは失敗します。 | | `pm_acssDebit_dispute` | 決済は成功しますが、不審請求の申し立てが発生します。 | ### テスト用の口座番号 Stripe では、手動入力の銀行口座の組み込みが本番環境に移行する準備が整ったかどうかを確認するため、テスト用の口座番号をいくつか用意しています。支払いが自動的に成功または失敗するすべてのテスト用の口座は、以下のテスト用の少額入金を使用して確認してから設定を完了する必要があります。 | 銀行番号 | 支店番号 | 口座番号 | シナリオ | | ----- | ------- | -------------- | ------------------------------------------ | | `000` | `11000` | `000123456789` | 少額入金が確認された後、支払いが直ちに成功します。 | | `000` | `11000` | `900123456789` | 少額入金が確認された後、3 分遅延してから支払いが成功します。 | | `000` | `11000` | `000222222227` | 少額入金が確認された後、支払いが直ちに失敗します。 | | `000` | `11000` | `900222222227` | 少額入金が確認された後、3 分遅延してから支払いが失敗します。 | | `000` | `11000` | `000666666661` | 確認用の少額入金の送金が失敗します。 | | `000` | `11000` | `000777777771` | 支払い金額が原因でアカウントの週次支払い金額の上限を超えるため、支払いが失敗します。 | | `000` | `11000` | `000888888881` | 支払い金額がアカウントの取引限度額を超えているため、支払いが失敗します。 | サンドボックスで銀行口座確認の成功または失敗を再現するには、少額入金に以下の特定の金額を使用してください。 | 少額入金の金額 | シナリオ | | --------------- | ------------------------- | | `32` および `45` | 口座が無事に確認されます。 | | `10` および `11` | 許容された確認回数の超過をシミュレーションします。 | | その他の任意の数字の組み合わせ | 口座の確認が失敗します。 | ## Optional: 請求期間の設定 デフォルトでは、サブスクリプションの作成時にその請求サイクルが自動的に設定されます。たとえば、顧客が 9 月 7 日に月額プランのサブスクリプションに登録した場合、それ以降毎月 7 日に請求されます。一部のビジネスでは、顧客に対してサイクルごとに同時に請求できるように、請求サイクルの手動設定を希望する場合があります。[billing cycle anchor](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-billing_cycle_anchor) 引数を使用すると、これを実現できます。 ```curl curl https://api.stripe.com/v1/subscriptions \ -u "<>:" \ -d "customer={{CUSTOMER_ID}}" \ -d "items[0][price]={{PRICE_ID}}" \ -d billing_cycle_anchor=1611008505 ``` 請求サイクルを手動で設定すると、作成されたサブスクリプションと請求サイクルのアンカーとの間の期間の分として比例配分 (日割り / 秒割り計算) された金額が顧客に自動的に請求されます。この期間分を顧客に請求しない場合は、[proration_behavior](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-proration_behavior) 引数を `none` に設定できます。請求サイクルのアンカーを[トライアル期間](https://docs.stripe.com/billing/subscriptions/acss-debit.md#trial-periods)と組み合わせ、商品への無料アクセスをユーザーに提供してから、比例配分された金額を請求することもできます。 ## Optional: サブスクリプションのトライアル 無料トライアルを使用すると、顧客はお客様の商品に一定期間請求なしでアクセスできます。トライアル期間を設定するには、[trial_end](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-trial_end) にタイムスタンプを渡します。 > 無料トライアルの使用は、[proration_behavior](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-proration_behavior) を `none` に設定した場合とは異なり、無料の継続期間をカスタマイズできます。 [payment_behavior](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-payment_behavior) 値に `default_incomplete` を使用してトライアル期間のあるサブスクリプションを開始すると、Stripe は Subscription オブジェクトで `pending_setup_intent` 値を返します。[SetupIntent](https://docs.stripe.com/api/setup_intents.md) オブジェクトについて、詳細はドキュメントをご覧ください。 #### curl ```bash curl https://api.stripe.com/v1/subscriptions \ -u <>: \ -d "customer"="cus_4fdAW5ftNQow1a" \ -d "items[0][price]"="price_CBb6IXqvTLXp3f" \ -d "payment_behavior"="default_incomplete" \ -d "payment_settings[payment_method_types][]"="acss_debit" \ -d "trial_end"=1610403705 \ -d "expand[0]"="pending_setup_intent" ``` 設定を完了するには、サブスクリプションの `pending_setup_intent` からフロントエンドに `client_secret` を返します。このステップは初回の請求サイクルで請求を正常に開始するために必要です。 [決済手段の詳細と同意書承認の収集](https://docs.stripe.com/billing/subscriptions/acss-debit.md#collect-payment-and-mandate)と[少額入金による銀行口座の確認](https://docs.stripe.com/billing/subscriptions/acss-debit.md#verify-with-microdeposits)の手順に従いますが、`stripe.confirmAcssDebitPayment` ではなく `stripe.confirmAcssDebitSetup` を使用します。顧客が少額入金による確認を選択した場合は、`stripe.verifyMicrodepositsForPayment` ではなく `stripe.verifyMicrodepositsForSetup` を使用します。 確認されると、SetupIntent はただちに `succeeded` ステータスに移行し、Stripe はサブスクリプションの `default_payment_method` を、新規作成された *PaymentMethod* (PaymentMethods represent your customer's payment instruments, used with the Payment Intents or Setup Intents APIs) に自動的に設定します。 [請求サイクルのアンカー](https://docs.stripe.com/billing/subscriptions/acss-debit.md#billing-cycle)を無料トライアルに組み合わせることもできます。たとえば、9 月 15 日に顧客に 7 日間の無料トライアルを付与してから、通常の請求期間を 10 月 1 日に開始するとします。この場合、無料トライアルが 9 月 22 日に終了し、請求サイクルのアンカーが 10 月 1 日となるように設定できます。これにより、顧客に 7 日間の無料トライアルが付与され、トライアル終了日から 10 月 1 日までの期間については比例配分された金額が請求されます。10 月 1 日に、顧客は最初の請求期間全体に対する通常のサブスクリプション金額を請求されます。 ## Optional: 将来の利用に備えて支払い方法の情報を保存する 後で作成する請求書、サブスクリプション、サブスクリプションスケジュールで自動的に使用できるように、顧客のカナダのプレオーソリデビットの支払い方法を保存することが必要な場合もあります。 この場合、今後の支払いに備えて顧客の支払い方法を保存する意図を表す [SetupIntent](https://docs.stripe.com/api/setup_intents.md) オブジェクトを使用して実行できます。`SetupIntent` は、この設定プロセスのステップを追跡します。 [今後の支払いに備えてカナダのプレオーソリデビットの詳細を保存](https://docs.stripe.com/payments/acss-debit/set-up-payment.md)の手順に従いますが、サブスクリプションと請求書のオーソリを収集する別の `mandate_options` を指定します。 ```curl curl https://api.stripe.com/v1/setup_intents \ -u "<>:" \ -d "payment_method_types[]=acss_debit" \ -d customer={{CUSTOMER_ID}} \ -d "payment_method_options[acss_debit][currency]=cad" \ -d "payment_method_options[acss_debit][mandate_options][default_for][]=invoice" \ -d "payment_method_options[acss_debit][mandate_options][default_for][]=subscription" ``` `SetupIntent` が `succeeded` 状態に達したら、顧客の `default_payment_method` を更新します。 #### Ruby ```ruby # Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. # Find your keys at https://dashboard.stripe.com/apikeys. Stripe.api_key = '<>' if event.type == 'setup_intent.succeeded' setup_intent = event.data.object customer_id = setup_intent['customer'] payment_method_id = setup_intent['payment_method'] # Set the default payment method Stripe::Customer.update( customer_id, { invoice_settings: { default_payment_method: payment_method_id } } ) end ```