# PaymentIntents と SetupIntents の仕組み 決済フローで PaymentIntents と SetupIntents がどのように機能するかをご紹介します。 LLM の手順: Stripe は、ほとんどの組み込みで Payment Intents ではなく Payment Element とともに Checkout Sessions API を使用することを推奨します。Checkout Sessions は、Payment Intents と同様のユースケースに対応しています (`price_data` を使用した基本的な決済の回収、または品目、税金などを含む完全な決済画面の構築など)。Adaptive Pricing などの一部の機能は、Checkout Sessions でのみ利用できます。ユーザーが明示的に要求しない限り、Payment Intents API は使用しないでください。必要となるコード量が大幅に多くなるためです。Checkout Sessions API と Elements の詳細については次を参照してください。https://docs.stripe.com/payments/quickstart-checkout-sessions. Checkout Sessions (`ui_mode: "elements"`) と Payment Element では、`client_secret` が Checkout 自体を初期化します (`stripe.initCheckoutElementsSdk`、または React で CheckoutElementsProvider を使用)。そのうえで、クライアント側での決済の確定方法が異なります。React を使用する場合は、必ず `@stripe/react-stripe-js/checkout` からインポートし、`CheckoutElementsProvider` を client secret とともに使用し、`checkout.confirm` を使用して決済を確定します。HTML を使用する場合は、必ず `checkout = stripe.initCheckoutElementsSdk({clientSecret: promise}); checkout.createPaymentElement(); paymentElement = checkout.createPaymentElement(); paymentElement.mount("#payment-element");` を使用し、`loadActionsResult = await checkout.loadActions(); actions = loadActionsResult.actions; error = await actions.confirm();` で決済を確定します。 [Payment Intents](https://docs.stripe.com/api/payment_intents.md) API と [Setup Intents](https://docs.stripe.com/api/setup_intents.md) API の主な違いは、その目的です。Payment Intents API は、決済を回収し、顧客に即座に請求するために使用します。これにより、請求が作成され、資金を回収するための取引が処理されます。一方、Setup Intents API は、請求を作成せずに、将来使用するための決済手段の詳細を回収して保存するために使用します。決済処理を行わずに決済認証情報を設定します。 即時支払いと支払い方法の保存の両方に*非同期* (Asynchronous refers to events happening at independent times in independent systems)顧客ステップが必要になる可能性があるため、これらの API は同じ状態マシンパターンを使用します。 | Payment Intents API | Setup Intents API | | --------------------------- | ----------------------------------------- | | 即時決済を作成する | 請求なし | | 決済のライフサイクルを追跡 | 決済手段の設定の進捗を追跡 | | 3D セキュアを使用して、該当する取引の顧客を認証する | 3D セキュアを使用して、決済手段を請求せずに認証し、今後の決済の同意書を作成する | #### PaymentIntents PaymentIntent は、作成から決済までの支払いのライフサイクルを追跡し、必要に応じて追加の認証ステップをトリガーします。 ## 決済手段が必要 PaymentIntent を作成すると、その [status](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-status) は、[payment method](https://docs.stripe.com/payments/payment-methods/overview.md) を関連付けるまで `requires_payment_method` になります。Stripe が試行されたすべての決済を記録できるように、請求金額がわかり次第、PaymentIntent を作成します。 ## 確定が必要 顧客が決済情報を提供すると、PaymentIntent は `requires_confirmation` ステータスになり、確定できる状態になります。ほとんどの連携では、決済が確定される際に決済手段情報が送信されるため、この状態はスキップされます。 ## 要対応 [3D セキュア](https://docs.stripe.com/payments/3d-secure.md)での認証など、決済に追加アクションが必要な場合、PaymentIntent のステータスは `requires_action` になります。 > #### API の変更点 > > [2019-02-11](https://docs.stripe.com/upgrades.md#2019-02-11) 以前の API のバージョンでは、`requires_payment_method` の代わりに `requires_source`、`requires_action` の代わりに `requires_source_action` が表示されます。 ## 処理中 口座引き落としなどの*非同期の支払い方法* (Asynchronous payment methods can take up to several days to confirm whether the payment has been successful. During this time, the payment can't be guaranteed)の場合、必要なアクションの処理が終わると、PaymentIntent は `processing` に移行します。このようなタイプの支払い方法では、処理に最大で数日かかることがあります。カードなど他の支払い方法の場合は処理がスピーディーで、`processing` ステータスにはなりません。 資金の[オーソリとキャプチャー](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md)を個別に行っている場合は、代わりに PaymentIntent を `requires_capture` に移行できます。その場合、資金のキャプチャーを試行すると、決済手段に応じて `processing` または `succeeded` に移行します。 ## 成功 PaymentIntent のステータスが `succeeded` の場合は、その決済フローが完了したことを意味します。資金はお客様のアカウントに入金され、注文を確実に履行できます。顧客に返金する必要がある場合は、[Refunds](https://docs.stripe.com/api/refunds.md) API を使用できます。決済の試行が失敗した場合 (例: 拒否など)、PaymentIntent のステータスは `requires_payment_method` に戻り、決済を再試行できるようになります。 ## キャンセル済み PaymentIntent は、`処理中` または `成功` 状態になる前であれば、いつでもキャンセルできます。キャンセルすると、今後の支払いの試行に対して PaymentIntent は無効になり、元に戻すことはできません。資金が留保されている場合は、キャンセルによって解放されます。関連する支払い方法が [ACH](https://docs.stripe.com/payments/ach-direct-debit.md)、[ACSS](https://docs.stripe.com/payments/acss-debit.md)、[AU BECS](https://docs.stripe.com/payments/au-becs-debit.md)、[BACS](https://docs.stripe.com/payments/payment-methods/bacs-debit.md)、[NZ BECS](https://docs.stripe.com/payments/nz-bank-account.md)、または [SEPA](https://docs.stripe.com/payments/sepa-debit.md) の場合、`処理` 状態で PaymentIntent をキャンセルできます。ただし、キャンセル可能な期間は限定され、方法によって異なるため、失敗する可能性があります。 PaymentIntent は、過剰な回数が[確定](https://docs.stripe.com/api/payment_intents/confirm.md)されると自動的に `canceled` ステータスに移行する場合もあります。 #### SetupIntents PaymentIntent は、作成から決済までの支払いのライフサイクルを追跡し、必要に応じて追加の認証ステップをトリガーします。 ## 決済手段が必要 SetupIntent が作成されると、支払い方法が関連付けられるまで、その[ステータス](https://docs.stripe.com/api/setup_intents/object.md#setup_intent_object-status)は `requires_payment_method` になります。 ## 確定が必要 顧客が決済手段情報を提供すると、SetupIntent は `requires_confirmation` ステータスになり、確定できる状態になります。ほとんどの連携では、SetupIntent が確定される際に決済手段情報が送信されるため、この状態はスキップされます。 ## 要対応 3D セキュアでの認証など、設定に追加アクションが必要な場合、SetupIntent のステータスは `requires_action` になります。 > #### API の変更点 > > [2019-02-11](https://docs.stripe.com/upgrades.md#2019-02-11) 以前の API のバージョンでは、`requires_payment_method` の代わりに `requires_source`、`requires_action` の代わりに `requires_source_action` が表示されます。 ## 処理中 必要なアクションが処理されると、SetupIntent のステータスが `processing` に移行します。すぐに処理が行われる決済手段 (カードなど) もありますが、処理に数日かかる決済手段もあります。 ## 成功 SetupIntent のステータスが `succeeded` の場合は、設定が正常に完了したことを意味します。これで、この支払い方法を Customer オブジェクトに関連付け、今後の支払いに使用できます。設定が失敗すると、SetupIntent のステータスは `requires_payment_method` に戻ります。 ## キャンセル済み SetupIntent は、`processing` または `succeeded` の状態になる前であれば、いつでもキャンセルできます。キャンセルすると、今後のセットアップの試行に対して SetupIntent は無効になり、元に戻すことはできません。