# 初回決済のないサブスクリプションに対応する決済手段を設定する

サブスクリプションで初回決済が不要な場合に、将来の決済に備えて決済手段をオーソリして保存します。

[無料トライアル](https://docs.stripe.com/billing/subscriptions/trials/free-trials.md)、[従量課金](https://docs.stripe.com/products-prices/pricing-models.md#usage-based-pricing)、クーポン付きの請求書、または適用された顧客のクレジット残高を含むサブスクでは、多くの場合、支払いなしの請求書が生成されます。これは、サブスクの作成時に顧客に即時請求が行われないことを意味します。

顧客に対して最初の請求書の請求を行わない場合でも、クレジットカードを認証して承認することで、ゼロ以外の最初の支払いが成功する確率が高くなります。この種の支払いは、*オフセッション支払* (A payment is described as off-session if it occurs without the direct involvement of the customer, using previously-collected payment information)と呼ばれます。Stripe はこれらのシナリオを管理するために、[SetupIntents](https://docs.stripe.com/api/setup_intents.md) を使用します。

## SetupIntents を使用する

[SetupIntents (支払い方法設定インテント)](https://docs.stripe.com/api/setup_intents.md) を使用して、以下を実行できます。

- 決済情報を収集します。
- 顧客のカードを認証して、後で*免除* (Some transactions that are deemed low risk, based on the volume of fraud rates associated with the payment provider or bank, may be exempt from Europe's Strong Customer Authentication requirements)を請求する。
- 請求せずに顧客のカードを承認します。

決済を認証すると、顧客はカードへの請求を許可できます。これは[強力な顧客認証](https://docs.stripe.com/strong-customer-authentication.md)での要求事項であり、[3DS](https://docs.stripe.com/payments/3d-secure.md) はこの認証を完了するため方法として一般的です。支払い方法情報を収集してオーソリすることにより、その支払い方法への請求が確実に成功するようになります。

オフセッションのシナリオでは、SetupIntents によってゼロ以外の金額の初めての支払いを顧客に請求することができ、その際、認証のために顧客を Web サイトやアプリに戻す必要はありません。この結果、顧客の負担が軽減します。

初回の決済を必要としないサブスクリプションに対して、SetupIntent が自動的に作成されます。必要に応じ、この時点で認証と承認のプロセスも実行されます。認証と承認の両方が成功した場合、またはどちらも不要な場合は、アクションは不要で、`subscription.pending_setup_intent` フィールドは `null` となります。いずれかの手順が失敗した場合には、フロントエンドで SetupIntent を使用し、顧客がオンセッションの間に問題を解決することをお勧めします。

サブスクリプションの [pending_setup_intent](https://docs.stripe.com/api/subscriptions/object.md#subscription_object-pending_setup_intent) フィールドは、サブスクリプションが終了しても自動的にキャンセルされません。[customer.subscription.deleted](https://docs.stripe.com/billing/subscriptions/webhooks.md#events) イベントをリッスンし、必要に応じて手動で[サブスクリプションの SetupIntent をキャンセル](https://docs.stripe.com/api/setup_intents/cancel.md)してください。

次の 2 つのセクションでは、認証または承認が失敗するシナリオの対処方法について説明します。

## 認証の失敗の管理(クライアント側)

認証の失敗は、Stripe が顧客のカード発行会社との間で顧客を認証できない場合に発生します。この場合、SetupIntent の `status` が `requires_action` に設定されます。
![サブスクリプションの決済の認証失敗に対処する方法。](https://b.stripecdn.com/docs-statics-srv/assets/authentication_failure.2eaec43cac8c688f0ff3438fbe3b50e4.svg)

このようなシナリオを解決するには、フロントエンドで [confirmCardSetup](https://docs.stripe.com/js.md#stripe-confirm-card-setup) を呼び出して、顧客が認証フローを手動で完了できるようにする必要があります。以下のコード例では、[pending_setup_intent](https://docs.stripe.com/api/subscriptions/object.md#subscription_object-pending_setup_intent) を[拡張](https://docs.stripe.com/api/expanding_objects.md)してフローを完了しています。

```javascript
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_setup_intent` が `null` に更新されます。

## オーソリの失敗の管理(クライアント側)

カードが請求可能であることを Stripe が確認できない場合、支払いの承認が失敗します。この場合、SetupIntent の [status](https://docs.stripe.com/api/setup_intents/object.md#setup_intent_object-status) は、`requires_payment_method` に設定されます。通常、当該カードを使用した後続の請求は失敗することになります。
![サブスクリプションの決済のオーソリ失敗に対処する方法。](https://b.stripecdn.com/docs-statics-srv/assets/authorization_failure.0b6ca4a2e2bbeba11710bf22fb0a5d00.svg)

このようなシナリオを解決するには、[新しい支払い方法を収集](https://docs.stripe.com/billing/subscriptions/overview.md#requires-payment-method)してから、顧客またはサブスクリプションのデフォルトの支払い方法を更新する必要があります。以下のコード例では、[pending_setup_intent](https://docs.stripe.com/api/subscriptions/object.md#subscription_object-pending_setup_intent) を[拡張](https://docs.stripe.com/api/expanding_objects.md)してフローを完了しています。

```javascript
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.
  }
}
```
