# インドの継続支払い RBI の電子同意書に対応するために組み込みを更新する方法をご紹介します。 インド準備銀行 (RBI) は、インドで発行されたカードでの継続支払いに対するセキュリティ対策を強化する対策を導入する[指令](https://www.rbi.org.in/Scripts/NotificationUser.aspx?Id=11668)を発布しました (その後、[2020 年 12 月](https://www.rbi.org.in/Scripts/NotificationUser.aspx?Id=12002)および [2021 年 3 月](https://www.rbi.org.in/Scripts/NotificationUser.aspx?Id=12051&Mode=0)に改正)。以下のような対策が導入されています。 - 銀行は、*3D セキュア (3DS)* (3D Secure (3DS) provides an additional layer of authentication for credit card transactions that protects businesses from liability for fraudulent card payments) などの追加要素認証 (AFA) を使用して、1 回限りのプロセスでカード保有者を登録し、*電子同意書* (An e-mandate is a form of authorization provided by cardholders to issuing banks that grants permission for recurring payments on their card. Any recurring payment arrangements (for example, monthly subscriptions to OTT services) need an associated e-mandate to be successful. The e-mandate needs to be registered and then validated through AFA, such as 3DS)を作成する必要があります。 - 銀行/発行会社は、支払いが行われる 24 時間以上前にカード保有者に通知して、取引をオプトアウトできるようにする必要があります。 - 15,000 INR (または他の通貨での相当額) を超える継続取引では、毎回 AFA を使用する必要があります。 インド所在の Stripe ユーザーまたは国際的な (IN 以外の) Stripe ユーザーのビジネスは、インドのカードを以下の目的で使用する顧客が存在する場合に影響を受けます。 - *オフセッション* (A payment is described as off-session if it occurs without the direct involvement of the customer, using previously-collected payment information)支払い - `collection_method` が `charge_automatically` に設定されているサブスクリプションまたは請求書 ## 電子同意書を使用する支払いの仕組み Stripe は、パートナープラットフォームと連携して、電子同意書の登録と顧客への引き落としの事前通知の送信をサポートしています。 > 現時点では、メキシコの Stripe ユーザーは電子同意書をご利用いただけません。 Stripe の導入方法によっては、同意書を設定するための追加情報を Stripe に送信しなければならない場合があります。顧客が同意書を登録するには、AFA (3DS) を実行する必要があります。 サブスクリプションの後続のオフセッション支払いや自動引き落としについては重大な変更があります。実際の支払いの 24 時間以上前に、正確な引き落とし金額が記載された引き落としの事前通知が顧客に届いていなければなりません。引き落としの事前通知には、支払いに関する情報と、同意書をキャンセルするオプションが記載されます。支払い額が 15,000 INR または同意書の最大金額を超える場合は、引き落としの事前通知にリンクが記載され、そのリンクから AFA (3DS) を実行して支払いを承認します。 Stripe は、パートナープラットフォームと提携しているため、支払いリクエストの受信後、26 時間待機してから顧客に請求します (26 時間前の事前通知が必要となるダウンストリームでの問題の発生に備えて調整時間を追加します)。そのため、Stripe は支払いの回収を 26 時間延期します。 オフセッションの支払いの同意書がない場合、支払いは拒否されます。 ## 実装 RBI 規制は、`collection_method=charge_automatically` を使用してインドで発行されたカードに請求するするサブスクリプションに影響します。 > Stripe は、`PaymentIntents` または `SetupIntents` によるインドの継続支払いの電子委任状をサポートしていません。継続支払いの同意書を管理するには、以下で説明するようにサブスクリプションを使用します。 ### サブスクリプションの作成 #### カスタムコード API を使用して新しいサブスクリプションを作成する場合 - デフォルトの支払い方法が設定されている場合、サブスクリプションは、支払い方法で最新の SetupIntent を使用して、対応する同意書を見つけようとします。 - 同意書がない場合、[mandate_options](https://docs.stripe.com/api/subscriptions/create.md#create_subscription-payment_settings-payment_method_options-card-mandate_options) で関連パラメーターを渡していなくても、Stripe は自動的に作成を試行します。その後、顧客は支払いを認証する必要があります。 #### Stripe がオンラインで提供するページ `mode=subscription` の Stripe [Checkout](https://docs.stripe.com/payments/checkout.md) または [Payment Links](https://docs.stripe.com/payment-links.md) を使用して、顧客がサブスクリプションに登録できるようにしている場合、Stripe はサブスクリプションの関連パラメーターを使用して同意書を自動的に作成します。同意書のパラメーターをカスタマイズすることはできません。 新しいサブスクリプションを作成する方法については、[サブスクリプションの実装を構築する](https://docs.stripe.com/billing/subscriptions/build-subscriptions.md)をご覧ください。 ### サブスクリプションの売上回収 Stripe は、失敗した可能性がある決済の回収に役立つ自動リカバリ機能を多数用意しています。これらの決済失敗を独自に処理する場合は、[継続課金の失敗に対する独自処理を構築する](https://docs.stripe.com/india-recurring-payments.md#failed-payments)をご覧ください。それ以外の場合は、以下の推奨事項を参照してください。 > インドで発行されたカードによる支払いは、一度だけ試行されます。この動作は、支払い再試行の設定による影響を受けません。インドで発行されたカードによる支払いが失敗した場合でも、サブスクリプションと請求書のステータスは、 「支払いの再試行がすべて失敗した場合」の[サブスクリプションとメール通知の設定](https://dashboard.stripe.com/settings/billing/automatic)に基づき、更新されます。 #### 3D セキュアのメール サブスクリプションの更新時にデフォルトの支払い方法に同意書が存在しない場合、Stripe は新しい同意書を作成しようとします。同意書を登録するには、顧客は、AFA (3DS) を完了する必要があります。[サブスクリプションとメール通知の設定](https://dashboard.stripe.com/settings/billing/automatic) で `Send a Stripe-hosted link for customers to confirm their payments when required` を有効にして、必要に応じて顧客をオンセッションに戻し、認証を完了できるようにしてください。 > サブスクリプションで現在使用されている同意書が `inactive` である場合、Stripe は新しい同意書の作成はしません。 #### 失敗した支払いを管理する サブスクリプションの支払いが失敗して、サブスクリプションが一時停止されたときの顧客への通知を有効にすることをお勧めします。[サブスクリプションとメール通知の設定](https://dashboard.stripe.com/settings/billing/automatic)で有効にすると、Stripe は、失敗したカードの支払い方法の更新を求めるメールを顧客に送信できます。 ### 同意書の作成 Stripe によって同意書が自動的に作成されるようにしている場合、同意書の詳細は請求書の基盤となる PaymentIntent と対応する Charge で返されます。また、トライアルを含むサブスクリプションを作成している場合には SetupIntent で返されます。 以下のいずれかに該当する場合、Stripe は同意書 ID を返しません。 - カードがインドで発行されたカードではない。 - 同意書の通貨が、カード発行会社または Stripe アカウントの国でサポートされていない。 - インドで発行されたカードが Visa でも Mastercard でもない。Stripe は、この 2 つのカードブランドでのみ同意書をサポートしています。 Stripe は、すべてのビジネスで INR の同意書をサポートします。以下の通貨は、国際的な (IN 以外の) ビジネスでのみサポートされています。 - AUD - USD - EUR - GBP - SGD - CAD - CHF - SEK - AED - JPY - NOK - MYR - HKD インドには、100 以上のカード発行銀行/会社があり、新しい要件のすべてに対応するためのプロセスには時間がかかると思われます。カード発行元が、まだ特定の通貨で電子同意書に対応していない場合があります。その場合は、Stripe は同意書 ID を返しません。 顧客が [Adaptive Pricing](https://docs.stripe.com/payments/currencies/localize-prices/adaptive-pricing.md) でサブスクリプションを開始し、同意書が選択した通貨をサポートする場合、Stripe はその通貨で電子同意書を自動的に作成します。 ### 同意書のステータスとトラブルシューティング Stripe が同意書を作成できない場合は、別のカードの使用を提案するか、サブスクリプションの `send_invoice` として [collection_method](https://docs.stripe.com/api/subscriptions/object.md#subscription_object-collection_method) を設定するなどの別のオプションを提供することができます。 また、顧客が同意書をキャンセルした場合などには、有効だった同意書が無効になることがあります。この場合、同意書は `inactive` になり、Stripe から `mandate.updated` イベントが送信されます。 Webhook の受信について、詳細は [Webhook を受信するためのステップ](https://docs.stripe.com/webhooks.md#webhooks-summary)をご覧ください。 ### サブスクリプションの更新 銀行が送信する引き落としの事前通知は、少なくともビジネスの名前、取引金額、引き落としの日付または時刻、同意書の参照番号、引き落としの理由をカード保有者に通知するものです。混乱や支払い拒否を防止するために、同意書の詳細が顧客に対する実際の引き落としの内容と一致していることを確認してください。 Stripe によってサブスクリプションの同意書が自動的に作成される場合に、サブスクリプションを更新するには、顧客をオンセッションに戻して元のサブスクリプションをキャンセルすることをお勧めします。そうすると、以下のシナリオで新しいサブスクリプションが作成され、サブスクリプションの詳細が正確に反映された新しい同意書が作成されます。 - サブスクリプションの請求期間の変更 - 顧客が更新のたびに支払いを承認しなくても済むようにするサブスクリプションのアップグレード。コンテキストとして、Stripe は、デフォルトで `amount_type=maximum` を指定して同意書を作成します。`amount_type=maximum` を指定すると、最大金額を超える金額を顧客に請求できます。ただし、`mandate_options[amount]` または 15,000 INR (どちらか少ない方の金額) を超える金額の支払いは、顧客による承認が必要です。 例: - `amount_type=maximum`、 `amount=100000` を設定している場合は、顧客が 1,000 INR 以上の金額を認証する必要があります。 - `amount=2000000` を設定している場合、15,000 INR 以上の金額では顧客による認証が必要になります。 ### 引き落としの事前通知 オフセッションの PaymentIntent が[確定](https://docs.stripe.com/api/payment_intents/confirm.md)されると、カード発行会社は、引き落としの事前通知を顧客に送信します。PaymentIntent は、引き落としの事前通知の期間全体 (26 時間) にわたって `processing` ステータスに移行し、キャンセルすることはできません。 ```json { "object": "payment_intent", ... "processing": { "card": { "customer_notification": { "approval_requested": true, "completes_at": 1677307005 } }, "type": "card" }, ... "status": "processing", ... } ``` [processing.card.customer_notification.approval_requested](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-processing-card-customer_notification-approval_requested) が `true` である場合、顧客は、カード発行会社から送信された引き落としの事前通知を使用して支払いを認証する必要があります。 [processing.card.customer_notification.completes_at](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-processing-card-customer_notification-completes_at) 属性は、Stripe がカードへの請求を試行する時刻を指定します。顧客の承認が必要な支払いが正常に処理された場合、顧客は、指定された時刻までに支払いを認証する必要があります。 ### エラーおよび拒否コード 以下のシナリオではエラー[コード](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-last_payment_error-decline_code) が返されます。 | エラーコード | 説明 | | ------------------------------------------ | ------------------------------------------------------------------------------- | | `payment_intent_mandate_invalid` | 無効な同意書を使用して継続支払いを試行するとこのコードが返されます。支払いを試行する前に同意書のステータスを確認することで、これを防ぐことができます。 | | `india_recurring_payment_mandate_canceled` | 無効な同意書を使用して継続支払いを試行するとこのコードが返されます。この時点で同意書がキャンセルされていることのみが明らかな場合に、発生する可能性があります。 | | `processing_error` | (通常は一時的な) 処理中のエラーが見つかると、このコードが返されます。 | 電子同意書では、特定の[拒否コード](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-last_payment_error-decline_code)に、[一般的なシナリオ](https://docs.stripe.com/declines/codes.md)よりも具体的な説明が含まれる可能性が高くなります。 | 拒否コード | 説明 | | -------------------------- | ------------------------------------------------------------------- | | `transaction_not_approved` | 顧客が自動引き落としの権限を一時停止したか、必要な時点で支払いを認証していない場合に、後続の支払いを試行するとこのコードが返されます。 | ## テスト これらの[テストカード番号](https://docs.stripe.com/testing.md#testing-interactively)を使用して、さまざまなシナリオをシミュレートできます。 *サンドボックス* (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)では、オフセッション PaymentIntent が `processing` ステータスから移行するのに約 15 分かかります。初回支払いのオンセッション PaymentIntent が `processing` ステータスになることはありません。 #### クレジットカード番号 | 番号 | シナリオ | | ---------------- | -------------------------------------------------------------------------------------- | | 4000003560000123 | 同意書の正常な設定と更新をシミュレーションします。 | | 4000003560000297 | カード保有者がオフセッションの支払いに対する引き落としの事前通知を受け取り、任意の金額の同意書による支払いのキャンセルまたは一時停止を行うシナリオをシミュレーションします。 | | 4000003560000248 | 任意の金額の同意書によるオフセッションの支払いの際に、カード発行会社がカード保有者への引き落としの事前通知の送信に失敗するシナリオをシミュレーションします。 | | 4000003560000263 | カード保有者による任意の金額の同意書のキャンセルをシミュレーションします。 | #### PaymentMethods | PaymentMethod | シナリオ | | ------------------------------------------------------------------ | -------------------------------------------------------------------------------------- | | `pm_card_indiaRecurringMandateSetupAndRenewalsSuccess` | 同意書の正常な設定と更新をシミュレーションします。 | | `pm_card_indiaRecurringPaymentFailureAfterPreDebitNotification` | カード保有者がオフセッションの支払いに対する引き落としの事前通知を受け取り、任意の金額の同意書による支払いのキャンセルまたは一時停止を行うシナリオをシミュレーションします。 | | `pm_card_indiaRecurringPaymentFailureUndeliveredDebitNotification` | 任意の金額の同意書によるオフセッションの支払いの際に、カード発行会社がカード保有者への引き落としの事前通知の送信に失敗するシナリオをシミュレーションします。 | | `pm_card_indiaRecurringPaymentFailureCanceledMandate` | カード保有者による任意の金額の同意書のキャンセルをシミュレーションします。 | ## 制限事項 以下の制限事項にご注意ください。 - Stripe は、2021 年 10 月 1 日以降に作成されたサブスクリプションでのみ同意書の自動作成を試みます。それより前に作成されたサブスクリプションがある場合は、サブスクリプションをキャンセルして新しいサブスクリプションを作成して、同意書が作成されるようにします。 - [Charges](https://docs.stripe.com/api/charges.md)および [Sources](https://docs.stripe.com/api/sources.md) API を使用して同意書を作成することはできません。 - 通貨が INR 以外のサブスクリプションの場合、同意書は、サブスクリプションの作成時にインドの支払い方法が顧客に添付されている場合にのみ登録されます。支払い方法なしで非 INR サブスクリプションを作成し、後でインドカードを追加した場合、同意書は作成されません。適切な同意書の作成を確実に行うには、サブスクリプションを作成する前にインドのクレジットカードを添付してください。 - 既存の同意書をサブスクリプションに渡すことはできません。 - 同意書はキャンセルや更新ができません。