後払い支払いによるサブスクリプションの処理
即時支払いを必要としないサブスクリプションの処理方法について紹介します。
無料トライアルや従量課金を含むサブスクリプション、またはクーポンや顧客のクレジット残高が適用された請求書は、未払いになることがよくあります。これは、サブスクリプションの作成時に顧客にすぐに請求を行わないことが原因です。
顧客に対して最初の請求書の請求を行わない場合でも、クレジットカードを認証して承認することで、ゼロ以外の最初の支払いが成功する確率が高くなります。この種の支払いは、オフセッション支払と呼ばれます。Stripe はこれらのシナリオを管理するために、SetupIntents を使用します。
SetupIntents を使用する
SetupIntents (支払い方法設定インテント) を使用して、以下を実行できます。
- 決済情報を収集します。
- 顧客のカードを認証して、後で免除を請求する。
- 請求せずに顧客のカードを承認します。
決済を認証すると、顧客はカードへの請求を許可できます。これは強力な顧客認証での要求事項であり、3DS はこの認証を完了するため方法として一般的です。支払い方法情報を収集してオーソリすることにより、その支払い方法への請求が確実に成功するようになります。
オフセッションのシナリオでは、SetupIntents によってゼロ以外の金額の初めての支払いを顧客に請求することができ、その際、認証のために顧客を Web サイトやアプリに戻す必要はありません。この結果、顧客の負担が軽減します。
初回の決済を必要としないサブスクリプションに対して、SetupIntent が自動的に作成されます。必要に応じ、この時点で認証と承認のプロセスも実行されます。認証と承認の両方が成功した場合、またはどちらも不要な場合は、アクションは不要で、subscription.
フィールドは null
となります。いずれかの手順が失敗した場合には、フロントエンドで SetupIntent を使用し、顧客がオンセッションの間に問題を解決することをお勧めします。
サブスクリプションの pending_setup_intent フィールドは、サブスクリプションが終了しても自動的にキャンセルされません。customer.subscription.deleted イベントをリッスンし、必要に応じて手動でサブスクリプションの SetupIntent をキャンセルしてください。
次の 2 つのセクションでは、認証または承認が失敗するシナリオの対処方法について説明します。
認証の失敗の管理Client-side
認証の失敗は、Stripe が顧客のカード発行会社との間で顧客を認証できない場合に発生します。この場合、SetupIntent の status
が requires_
に設定されます。
このようなシナリオを解決するには、フロントエンドで confirmCardSetup を呼び出して、顧客が認証フローを手動で完了できるようにする必要があります。以下のコード例では、pending_setup_intent を拡張してフローを完了しています。
const {pending_setup_intent} = subscription; if (pending_setup_intent) { const {client_secret, status} = subscription.pending_setup_intent; if (status === "requires_action") { const {setupIntent, error} = await stripe.confirmCardSetup(client_secret); if (error) { // Display error.message in your UI. } else { // The setup has succeeded. Display a success message. } } }
このフローが完了すると、必要に応じて承認が実行されます。承認が成功した場合、または承認が不要な場合、完了時に pending_
が null
に更新されます。
オーソリの失敗の管理Client-side
カードが請求可能であることを Stripe が確認できない場合、支払いの承認が失敗します。この場合、SetupIntent の status は、requires_
に設定されます。通常、当該カードを使用した後続の請求は失敗することになります。
このようなシナリオを解決するには、新しい支払い方法を収集してから、顧客またはサブスクリプションのデフォルトの支払い方法を更新する必要があります。以下のコード例では、pending_setup_intent を拡張してフローを完了しています。
const {pending_setup_intent, latest_invoice} = subscription; if (pending_setup_intent) { const {client_secret, status} = subscription.pending_setup_intent; if (status === "requires_action") { const {setupIntent, error} = await stripe.confirmCardSetup(client_secret); if (error) { // Display error.message in your UI. } else { // The setup has succeeded. Display a success message. } } else if (status === "requires_payment_method") { // Collect new payment method. } }