# 注文のフルフィルメント Checkout Sessions API で受け取った支払いをフルフィルメントする方法をご紹介します。 # ホスト型ページ > This is a ホスト型ページ for when payment-ui is stripe-hosted. View the full page at https://docs.stripe.com/checkout/fulfillment?payment-ui=stripe-hosted. Checkout Sessions API (Payment Links を含む) で支払いを受け取ると、顧客に支払い内容を提供するためのアクションが必要になる場合があります。サービスへのアクセス許可や、物品の配送がこの例です。このプロセスはフルフィルメントと呼ばれます。このプロセスを処理するには 2 つの方法があります。 - **手動**: Stripe が提供した情報を使用して、手動で注文のフルフィルメントを履行できます。例えば、[ダッシュボード](https://docs.stripe.com/dashboard/basics.md) を監視したり、支払い通知メールを確認したり、レポート確認後に注文のフルフィルメントを履行したりすることができます。 - **自動**: 自動化されたフルフィルメントシステムを構築できます。 (Recommended) 1 つ目のオプションは、取引額が少額のプロジェクトまたは実験的なプロジェクトに適していますが、多くの場合、フルフィルメントの自動化をお勧めします。このガイドの以降の部分では、自動フルフィルメントシステムの構築方法を説明します。 ## 自動フルフィルメント 以下に説明する自動フルフィルメントシステムは、*Webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) とお客様のウェブサイトへのリダイレクトを組み合わせてフルフィルメントをトリガーします。支払いごとにフルフィルメントが発生するように Webhook を使用する必要があり、リダイレクトによって顧客は支払い後すぐにサービスやフルフィルメントの詳細にアクセスできます。 > Payment Links は Checkout を使用するため、以下の情報は特に記載のない限り、すべて Payment Links と Checkout の両方に適用されます。 ## フルフィルメント関数を作成 [サーバ側] 支払いを正常にフルフィルメントするための関数をサーバー上に作成します。Webhook によってこの関数がトリガーされ、この関数は、決済完了後に顧客が貴社のウェブサイトに誘導されたときに呼び出されます。本ガイドでは、この関数を `fulfill_checkout` と呼んでいますが、関数の名前は自由に設定できます。 支払いごとに 1 回のみフルフィルメントを履行します。この導入とインターネットの動作が原因で、同じ Checkout セッションに対して `fulfill_checkout` 関数が複数回、場合によっては同時に呼び出されることがあります。フルフィルメントを 1 回のみ実行することにより、不要な動作が発生しないようになります。 `fulfill_checkout` 関数では、次のことを行う必要があります。 1. 同じ Checkout セッション ID で複数回呼び出されたケースを正しく処理します。 1. 引数として *Checkout セッション* (A Checkout Session represents your customer's session as they pay for one-time purchases or subscriptions through Checkout. After a successful payment, the Checkout Session contains a reference to the Customer, and either the successful PaymentIntent or an active Subscription) ID を受け入れます。 1. [拡張](https://docs.stripe.com/api/expanding_objects.md)した[line_items](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-line_items) プロパティを使って、API で Checkout セッションを取得します。 1. [payment_status](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-payment_status) プロパティを確認して、フルフィルメントが必要かどうかを判断します。 1. ラインアイテムのフルフィルメントを実行します。 1. 指定された Checkout セッションのフルフィルメントステータスを記録します。 以下のコードを `fulfill_checkout` 関数の開始点として使用します。`TODO` コメントは、導入する必要のある機能を示します。 > 以下のコードスニペットでは、選択した言語に応じて `fulfill_checkout` 関数に `fulfillCheckout` または `FulfillCheckout` という名前が付けられていますが、これらはすべて同じ関数を表しています。 #### Ruby ```ruby def fulfill_checkout(session_id) # 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 = '<>' puts "Fullfilling Checkout Session #{session_id}" # TODO: Make this function safe to run multiple times, # even concurrently, with the same session ID # TODO: Make sure fulfillment hasn't already been # performed for this Checkout Session # Retrieve the Checkout Session from the API with line_items expanded checkout_session = Stripe::Checkout::Session.retrieve({ id: session_id, expand: ['line_items'], }) # Check the Checkout Session's payment_status property # to determine if fulfillment should be performed if checkout_session.payment_status != 'unpaid' # TODO: Perform fulfillment of the line items # TODO: Record/save fulfillment status for this # Checkout Session end end ``` > Checkout セッションに多数のラインアイテムがある場合は、[自動ページ分割](https://docs.stripe.com/api/pagination/auto.md)と [Checkout ラインアイテムを操作する API](https://docs.stripe.com/api/checkout/sessions/line_items.md) を使用して、すべてのラインアイテムを取得します。 受け付ける決済手段とビジネスニーズに応じて、`fulfill_checkout` 関数で次の処理を行うことができます。 - サービスへのアクセス権をプロビジョニングする。 - 商品の配送をトリガーする。 - 支払い詳細とラインアイテムのコピーを自社のデータベースに保存する。 - [Stripe の領収書](https://docs.stripe.com/receipts.md)を有効にしていない場合に、顧客にカスタムの領収書メールを送信する。 - 顧客が Checkout で数量を調整できるようにする場合に、ラインアイテムと購入数量を照合する。 - 在庫または在庫レコードを更新する。 ## 支払いイベントハンドラーを作成 [サーバ側] フルフィルメントをトリガーするには、Webhook イベントハンドラーを作成して支払いイベントをリッスンし、`fulfill_checkout` 関数をトリガーします。 貴社に対して支払いがあると、`checkout.session.completed` イベントが作成されます。これらのイベントの受け付け、処理、受領確認を行うように、サーバー上のエンドポイントを設定します。 ### 即時の決済手段と遅延型の決済手段 [ACH Direct Debit](https://docs.stripe.com/payments/ach-direct-debit.md) やその他の銀行振込など、一部の決済手段は[即時](https://docs.stripe.com/payments/payment-methods.md#payment-notification)ではありません。このため、Checkout が完了しても、売上はすぐ利用できるようにはなりません。決済手段が遅延した場合、後で支払いが成功すると [checkout.session.async_payment_succeeded](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.async_payment_succeeded) イベントが生成されます。オブジェクトのステータスは、決済ステータスが成功または失敗になるまで処理中になります。 > 以下のコードに表示されている Webhook シークレット (`whsec_...`) は、Stripe CLI または Webhook エンドポイントから取得しています。ローカルテストには Stripe CLI を使用できます。また、Stripe は Webhook エンドポイントを使用して、ハンドラーがサーバーで実行されているときにイベントを送信します。詳細については、次のセクションをご覧ください。 #### Ruby ```ruby require 'sinatra' # Use the secret provided by Stripe CLI for local testing # or your webhook endpoint's secret. endpoint_secret = 'whsec_...' post '/webhook' do event = nil # Verify webhook signature and extract the event # See https://stripe.com/docs/webhooks#verify-events for more information. begin sig_header = request.env['HTTP_STRIPE_SIGNATURE'] payload = request.body.read event = Stripe::Webhook.construct_event(payload, sig_header, endpoint_secret) rescue JSON::ParserError => e # Invalid payload return status 400 rescue Stripe::SignatureVerificationError => e # Invalid signature return status 400 end if event['type'] == 'checkout.session.completed' || event['type'] == 'checkout.session.async_payment_succeeded' fulfill_checkout(event['data']['object']['id']) end status 200 end ``` また、`checkout.session.async_payment_failed` イベントをリッスンして処理することもできます。たとえば、遅延していた支払いが失敗した場合に顧客にメールを送信できます。 ## イベントハンドラーをローカルでテスト Webhook イベントハンドラーを開発およびテストする最も簡単な方法は、[Stripe CLI](https://docs.stripe.com/stripe-cli.md) です。Stripe CLI をお持ちでない場合は、[インストールガイド](https://docs.stripe.com/stripe-cli/install.md)に従って開始してください。 Stripe CLI がインストールされている場合は、イベントハンドラーをローカルでテストできます。サーバーを (`localhost:4242` などで) 実行し、次に [stripe listen](https://docs.stripe.com/cli/listen) コマンドを実行すると、Stripe CLI がイベントをローカルサーバーに転送します。 ```bash stripe listen --forward-to localhost:4242/webhook Ready! Your webhook signing secret is 'whsec_' (^C to quit) ``` Webhook secret (`whsec_...`) をイベント処理コードに追加し、顧客として Checkout を実行してフルフィルメントをテストします。 - 購入ボタンを押して Checkout に進むか、決済用リンクにアクセスします。 - Checkout で次のテストデータを指定します。 - カード番号として `4242 4242 4242 4242` を入力する - カードの有効期限として将来の任意の日付を入力する - 3 桁の任意のセキュリティコードを入力する - 請求先の任意の郵便番号 (`90210`) を入力する - **支払う**ボタンを押します。 支払いが完了したら、次の点を確認します。 - `stripe listen` が実行されているコマンドラインに、ローカルサーバーへ転送された `checkout.session.completed` イベントが表示されます。 - サーバーログには、`fulfill_checkout` 関数から想定される出力が表示されます。 ## Webhook エンドポイントを作成 ローカルでテストした後、Webhook イベントハンドラーをサーバーで設定して実行します。次に、[Webhook エンドポイントを作成](https://docs.stripe.com/webhooks.md#register-webhook)し `checkout.session.completed` イベントをサーバーに送信し、Checkout フローを再度テストします。 ## ランディングページの URL を設定 [推奨] 決済を設定することで、顧客の決済完了後にお客様のウェブサイトのページにリダイレクトします。ページの URL に `{CHECKOUT_SESSION_ID}` プレースホルダーを含めると、顧客が決済からリダイレクトされるときにプレースホルダーが Checkout セッション ID に置き換えられます。 ### ホストされた Checkout 決済セッションのデフォルトの [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) が `hosted_page` の場合は、`success_url` を設定します。 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d "line_items[0][price]={{PRICE_ID}}" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ --data-urlencode "success_url=https://example.com/after-checkout?session_id={CHECKOUT_SESSION_ID}" ``` `checkout.session.completed` イベントを監視する Webhook エンドポイントを設定し、さらに `success_url` を設定した場合、Checkout はサーバーが Webhook イベントの応答を 10 秒待ってから顧客をリダイレクトします。この方法を使用する場合は、サーバーができるだけ早く `checkout.session.completed` イベントに応答するようにしてください。ローカルテストに Stripe CLI を使用する場合は、Checkout は即座に `success_url` にリダイレクトします。 この動作は、[組織](https://docs.stripe.com/get-started/account/orgs.md)アカウントに登録されている Webhook エンドポイントではサポートされていません。Stripe は、Checkout 顧客をリダイレクトする際に `checkout.session.completed` をリッスンする組織の Webhook エンドポイントの応答を待機しません。 ### Payment Links API を使用して作成する Payment Links では、[after_completion.redirect.url](https://docs.stripe.com/api/payment-link/create.md#create_payment_link-after_completion-redirect-url) を設定します。 ```curl curl https://api.stripe.com/v1/payment_links \ -u "<>:" \ -d "line_items[0][price]={{PRICE_ID}}" \ -d "line_items[0][quantity]=1" \ -d "after_completion[type]=redirect" \ --data-urlencode "after_completion[redirect][url]=https://example.com/after-checkout?session_id={CHECKOUT_SESSION_ID}" ``` Payment Links の場合、次のように[ダッシュボードで作成](https://dashboard.stripe.com/payment-links/create)します。 1. **支払い後**タブに移動します。 1. **確認ページを表示しない**を選択します。 1. `{CHECKOUT_SESSION_ID}` プレースホルダーが含まれたランディングページの URL を指定します (例: `https://example.com/after-checkout?session_id={CHECKOUT_SESSION_ID}`)。 ## ランディングページでフルフィルメントをトリガーする [推奨] [Webhook の監視](https://docs.stripe.com/checkout/fulfillment.md#create-payment-event-handler)は、各支払いのフルフィルメントを常にトリガーするために必要ですが、Webhook は遅延することがあります。決済フローを最適化し、顧客がアクセスしているときにすぐにフルフィルメントを履行できるようにするには、ランディングページからもフルフィルメントをトリガーする必要があります。 前のステップで指定した URL の Checkout セッション ID を使用して、次の手順を行います。 1. サーバーが Checkout のランディングページに対するリクエストを受信したときに、URL から Checkout セッション ID を抽出します。 1. 提供された ID で `fulfill_checkout` 関数を実行します。 1. フルフィルメントの試行が完了した後にページをレンダリングします。 ランディングページをレンダリングすると、次の情報を表示できます。 - フルフィルメントプロセスの詳細 - 顧客が現在アクセスできるサービスに関するリンクまたは情報 - 物品の配送先や物流の詳細 > #### Webhook は必須 > > 顧客は Checkout ランディングページにアクセスできることを保証されていないため、Checkout ランディングページに限定してフルフィルメントをトリガーすることはできません。Checkout で決済が完了した後、ランディングページが読み込まれる前にインターネットの接続が失われることがあります。 > > [Webhook イベントハンドラーを設定](https://docs.stripe.com/checkout/fulfillment.md#create-payment-event-handler)して、Stripe からクライアントを完全にバイパスして、支払いイベントをサーバーに直接送信できるようにします。Webhook は、支払いの受け取り時期を最も確実に確認できる方法を提供します。Webhook イベントの配信に失敗した場合、Stripe は[複数回再試行します](https://docs.stripe.com/webhooks.md#automatic-retries)。 # 埋め込みページ > This is a 埋め込みページ for when payment-ui is embedded-form. View the full page at https://docs.stripe.com/checkout/fulfillment?payment-ui=embedded-form. Checkout Sessions API (Payment Links を含む) で支払いを受け取ると、顧客に支払い内容を提供するためのアクションが必要になる場合があります。サービスへのアクセス許可や、物品の配送がこの例です。このプロセスはフルフィルメントと呼ばれます。このプロセスを処理するには 2 つの方法があります。 - **手動**: Stripe が提供した情報を使用して、手動で注文のフルフィルメントを履行できます。例えば、[ダッシュボード](https://docs.stripe.com/dashboard/basics.md) を監視したり、支払い通知メールを確認したり、レポート確認後に注文のフルフィルメントを履行したりすることができます。 - **自動**: 自動化されたフルフィルメントシステムを構築できます。 (Recommended) 1 つ目のオプションは、取引額が少額のプロジェクトまたは実験的なプロジェクトに適していますが、多くの場合、フルフィルメントの自動化をお勧めします。このガイドの以降の部分では、自動フルフィルメントシステムの構築方法を説明します。 ## 自動フルフィルメント 以下に説明する自動フルフィルメントシステムは、*Webhook* (A webhook is a real-time push notification sent to your application as a JSON payload through HTTPS requests) とお客様のウェブサイトへのリダイレクトを組み合わせてフルフィルメントをトリガーします。支払いごとにフルフィルメントが発生するように Webhook を使用する必要があり、リダイレクトによって顧客は支払い後すぐにサービスやフルフィルメントの詳細にアクセスできます。 ## フルフィルメント関数を作成 [サーバ側] 支払いを正常にフルフィルメントするための関数をサーバー上に作成します。Webhook によってこの関数がトリガーされ、この関数は、決済完了後に顧客が貴社のウェブサイトに誘導されたときに呼び出されます。本ガイドでは、この関数を `fulfill_checkout` と呼んでいますが、関数の名前は自由に設定できます。 支払いごとに 1 回のみフルフィルメントを履行します。この導入とインターネットの動作が原因で、同じ Checkout セッションに対して `fulfill_checkout` 関数が複数回、場合によっては同時に呼び出されることがあります。フルフィルメントを 1 回のみ実行することにより、不要な動作が発生しないようになります。 `fulfill_checkout` 関数では、次のことを行う必要があります。 1. 同じ Checkout セッション ID で複数回呼び出されたケースを正しく処理します。 1. 引数として *Checkout セッション* (A Checkout Session represents your customer's session as they pay for one-time purchases or subscriptions through Checkout. After a successful payment, the Checkout Session contains a reference to the Customer, and either the successful PaymentIntent or an active Subscription) ID を受け入れます。 1. [拡張](https://docs.stripe.com/api/expanding_objects.md)した[line_items](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-line_items) プロパティを使って、API で Checkout セッションを取得します。 1. [payment_status](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-payment_status) プロパティを確認して、フルフィルメントが必要かどうかを判断します。 1. ラインアイテムのフルフィルメントを実行します。 1. 指定された Checkout セッションのフルフィルメントステータスを記録します。 以下のコードを `fulfill_checkout` 関数の開始点として使用します。`TODO` コメントは、導入する必要のある機能を示します。 > 以下のコードスニペットでは、選択した言語に応じて `fulfill_checkout` 関数に `fulfillCheckout` または `FulfillCheckout` という名前が付けられていますが、これらはすべて同じ関数を表しています。 #### Ruby ```ruby def fulfill_checkout(session_id) # 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 = '<>' puts "Fullfilling Checkout Session #{session_id}" # TODO: Make this function safe to run multiple times, # even concurrently, with the same session ID # TODO: Make sure fulfillment hasn't already been # performed for this Checkout Session # Retrieve the Checkout Session from the API with line_items expanded checkout_session = Stripe::Checkout::Session.retrieve({ id: session_id, expand: ['line_items'], }) # Check the Checkout Session's payment_status property # to determine if fulfillment should be performed if checkout_session.payment_status != 'unpaid' # TODO: Perform fulfillment of the line items # TODO: Record/save fulfillment status for this # Checkout Session end end ``` > Checkout セッションに多数のラインアイテムがある場合は、[自動ページ分割](https://docs.stripe.com/api/pagination/auto.md)と [Checkout ラインアイテムを操作する API](https://docs.stripe.com/api/checkout/sessions/line_items.md) を使用して、すべてのラインアイテムを取得します。 受け付ける決済手段とビジネスニーズに応じて、`fulfill_checkout` 関数で次の処理を行うことができます。 - サービスへのアクセス権をプロビジョニングする。 - 商品の配送をトリガーする。 - 支払い詳細とラインアイテムのコピーを自社のデータベースに保存する。 - [Stripe の領収書](https://docs.stripe.com/receipts.md)を有効にしていない場合に、顧客にカスタムの領収書メールを送信する。 - 顧客が Checkout で数量を調整できるようにする場合に、ラインアイテムと購入数量を照合する。 - 在庫または在庫レコードを更新する。 ## 支払いイベントハンドラーを作成 [サーバ側] フルフィルメントをトリガーするには、Webhook イベントハンドラーを作成して支払いイベントをリッスンし、`fulfill_checkout` 関数をトリガーします。 貴社に対して支払いがあると、`checkout.session.completed` イベントが作成されます。これらのイベントの受け付け、処理、受領確認を行うように、サーバー上のエンドポイントを設定します。 ### 即時の決済手段と遅延型の決済手段 [ACH Direct Debit](https://docs.stripe.com/payments/ach-direct-debit.md) やその他の銀行振込など、一部の決済手段は[即時](https://docs.stripe.com/payments/payment-methods.md#payment-notification)ではありません。このため、Checkout が完了しても、売上はすぐ利用できるようにはなりません。決済手段が遅延した場合、後で支払いが成功すると [checkout.session.async_payment_succeeded](https://docs.stripe.com/api/events/types.md#event_types-checkout.session.async_payment_succeeded) イベントが生成されます。オブジェクトのステータスは、決済ステータスが成功または失敗になるまで処理中になります。 > 以下のコードに表示されている Webhook シークレット (`whsec_...`) は、Stripe CLI または Webhook エンドポイントから取得しています。ローカルテストには Stripe CLI を使用できます。また、Stripe は Webhook エンドポイントを使用して、ハンドラーがサーバーで実行されているときにイベントを送信します。詳細については、次のセクションをご覧ください。 #### Ruby ```ruby require 'sinatra' # Use the secret provided by Stripe CLI for local testing # or your webhook endpoint's secret. endpoint_secret = 'whsec_...' post '/webhook' do event = nil # Verify webhook signature and extract the event # See https://stripe.com/docs/webhooks#verify-events for more information. begin sig_header = request.env['HTTP_STRIPE_SIGNATURE'] payload = request.body.read event = Stripe::Webhook.construct_event(payload, sig_header, endpoint_secret) rescue JSON::ParserError => e # Invalid payload return status 400 rescue Stripe::SignatureVerificationError => e # Invalid signature return status 400 end if event['type'] == 'checkout.session.completed' || event['type'] == 'checkout.session.async_payment_succeeded' fulfill_checkout(event['data']['object']['id']) end status 200 end ``` また、`checkout.session.async_payment_failed` イベントをリッスンして処理することもできます。たとえば、遅延していた支払いが失敗した場合に顧客にメールを送信できます。 ## イベントハンドラーをローカルでテスト Webhook イベントハンドラーを開発およびテストする最も簡単な方法は、[Stripe CLI](https://docs.stripe.com/stripe-cli.md) です。Stripe CLI をお持ちでない場合は、[インストールガイド](https://docs.stripe.com/stripe-cli/install.md)に従って開始してください。 Stripe CLI がインストールされている場合は、イベントハンドラーをローカルでテストできます。サーバーを (`localhost:4242` などで) 実行し、次に [stripe listen](https://docs.stripe.com/cli/listen) コマンドを実行すると、Stripe CLI がイベントをローカルサーバーに転送します。 ```bash stripe listen --forward-to localhost:4242/webhook Ready! Your webhook signing secret is 'whsec_' (^C to quit) ``` Webhook secret (`whsec_...`) をイベント処理コードに追加し、顧客として Checkout を実行してフルフィルメントをテストします。 - 購入ボタンを押して Checkout に進むか、決済用リンクにアクセスします。 - Checkout で次のテストデータを指定します。 - カード番号として `4242 4242 4242 4242` を入力する - カードの有効期限として将来の任意の日付を入力する - 3 桁の任意のセキュリティコードを入力する - 請求先の任意の郵便番号 (`90210`) を入力する - **支払う**ボタンを押します。 支払いが完了したら、次の点を確認します。 - `stripe listen` が実行されているコマンドラインに、ローカルサーバーへ転送された `checkout.session.completed` イベントが表示されます。 - サーバーログには、`fulfill_checkout` 関数から想定される出力が表示されます。 ## Webhook エンドポイントを作成 ローカルでテストした後、Webhook イベントハンドラーをサーバーで設定して実行します。次に、[Webhook エンドポイントを作成](https://docs.stripe.com/webhooks.md#register-webhook)し `checkout.session.completed` イベントをサーバーに送信し、Checkout フローを再度テストします。 ## ランディングページの URL を設定 [推奨] 決済の完了後に顧客のウェブサイトのページにリダイレクトするように Checkout を設定します。ページの URL に `{CHECKOUT_SESSION_ID}` プレースホルダーを含めると、顧客が決済プロセスを完了したときにプレースホルダーが Checkout セッション ID に置き換えられます。 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d "line_items[0][price]={{PRICE_ID}}" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ -d ui_mode=embedded_page \ --data-urlencode "return_url=https://example.com/after-checkout?session_id={CHECKOUT_SESSION_ID}" ``` ## ランディングページでフルフィルメントをトリガーする [推奨] [Webhook の監視](https://docs.stripe.com/checkout/fulfillment.md#create-payment-event-handler)は、各支払いのフルフィルメントを常にトリガーするために必要ですが、Webhook は遅延することがあります。決済フローを最適化し、顧客がアクセスしているときにすぐにフルフィルメントを履行できるようにするには、ランディングページからもフルフィルメントをトリガーする必要があります。 前のステップで指定した URL の Checkout セッション ID を使用して、次の手順を行います。 1. サーバーが Checkout のランディングページに対するリクエストを受信したときに、URL から Checkout セッション ID を抽出します。 1. 提供された ID で `fulfill_checkout` 関数を実行します。 1. フルフィルメントの試行が完了した後にページをレンダリングします。 ランディングページをレンダリングすると、次の情報を表示できます。 - フルフィルメントプロセスの詳細 - 顧客が現在アクセスできるサービスに関するリンクまたは情報 - 物品の配送先や物流の詳細 > #### Webhook は必須 > > 顧客は Checkout ランディングページにアクセスできることを保証されていないため、Checkout ランディングページに限定してフルフィルメントをトリガーすることはできません。Checkout で決済が完了した後、ランディングページが読み込まれる前にインターネットの接続が失われることがあります。 > > [Webhook イベントハンドラーを設定](https://docs.stripe.com/checkout/fulfillment.md#create-payment-event-handler)して、Stripe からクライアントを完全にバイパスして、支払いイベントをサーバーに直接送信できるようにします。Webhook は、支払いの受け取り時期を最も確実に確認できる方法を提供します。Webhook イベントの配信に失敗した場合、Stripe は[複数回再試行します](https://docs.stripe.com/webhooks.md#automatic-retries)。