コンテンツにスキップ
アカウントを作成
または
サインイン
Stripe ドキュメントのロゴ
/
AI に質問する
アカウントを作成
サインイン
始める
支払い
売上
プラットフォームおよびマーケットプレイス
資金管理
開発者向けリソース
概要
Stripe Payments について
構築済みのシステムをアップグレード
支払いの分析
オンライン決済
概要ユースケースを見つけるManaged Payments
Payment Links を使用する
決済ページを構築
    概要
    クイックスタート
    デザインをカスタマイズする
    追加情報を収集する
    税金を徴収する
    決済フローを動的に更新
      配送オプションを動的にカスタマイズ
      ラインアイテムを動的に更新する
      トライアル期間を動的に更新する
      Dynamically update discounts
    商品カタログを管理する
    サブスクリプション
    決済手段を管理
    顧客が現地通貨で支払いできるようにする
    割引、アップセル、オプション品目を追加する
    将来の支払いを設定する
    支払い中に支払い詳細を保存する
    サーバーで支払いを手動で承認する
    支払い後
    Elements with Checkout Sessions API ベータ版の変更ログ
    従来の Checkout からの移行
    Checkout を移行して Prices を使用
高度なシステムを構築
アプリ内実装を構築
決済手段
決済手段を追加
決済手段を管理
Link による購入の迅速化
支払いインターフェイス
Payment Links
Checkout
Web Elements
アプリ内 Elements
決済シナリオ
複数の通貨を扱う
カスタムの決済フロー
柔軟なアクワイアリング
オーケストレーション
店頭支払い
端末
決済にとどまらない機能
会社を設立する
仮想通貨
Financial Connections
Climate
ホーム支払いBuild a checkout pageDynamically update checkout

ラインアイテムを動的に更新する非公開プレビュー

決済時に行われた変更に応じてラインアイテムを更新します。

非公開ベータ

この機能は非公開ベータの段階です。Request access to dynamic updates to checkout.

Checkout Session (セッション) に含まれる項目を動的に追加、削除、更新する方法をご紹介します。

ご利用事例

このガイドでは、項目を更新してサブスクリプションをアップセルする方法を示しますが、以下を行うこともできます。

  • 在庫の確認:在庫チェックを実行し、顧客がアイテムの数量を変更しようとしたときに保留します。
  • 新しい商品を追加する:注文合計額が一定の金額を超えている場合に、補完商品を追加します。
  • 配送料金を更新する:注文合計額が変更された場合は、このガイドの購入時に配送オプションをカスタマイズするで説明されている方法を組み合わせて、配送料金を更新します。
  • 税率を更新する:Stripe Tax を使用していない場合は、入力された配送先住所に基づいて項目の税率を動的に更新できます。

SDK を設定する
サーバー側

Stripe の公式ライブラリを使用して、アプリケーションから Stripe API にアクセスします。

Command Line
Ruby
gem install stripe -v 15.1.0-beta.2

サーバー SDK の更新
サーバー側

このベータ版を使用するには、まず checkout_server_update_beta=v1 のベータ版ヘッダーを使用するように SDK を更新します。

Ruby
# Set your secret key. Remember to switch to your live secret key in production. # See your keys here: https://dashboard.stripe.com/apikeys Stripe.api_key =
'sk_test_BQokikJOvBiI2HlWgH4olfQ2'
Stripe.api_version = '2025-03-31.basil; checkout_server_update_beta=v1;'

Checkout セッションの更新権限の設定
サーバー側

Checkout セッションの作成時に permissions.update_line_items=server_only を渡して、サーバーから項目を更新できるようにします。このオプションを渡すと、updateLineItemQuantity などの項目に対するクライアント側の更新も無効になり、すべての更新がサーバーを経由するようになります。

Command Line
cURL
curl https://api.stripe.com/v1/checkout/sessions \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -H "Stripe-Version: 2025-03-31.basil; checkout_server_update_beta=v1;" \ -d ui_mode=custom \ -d "permissions[update_line_items]"=server_only \ -d "line_items[0][price]"=
{{PRICE_ID}}
\ -d "line_items[0][quantity]"=1 \ -d mode=subscription \ --data-urlencode return_url="https://example.com/return"

ラインアイテムを動的に更新する
サーバー側

サーバー上に新しいエンドポイントを作成して、Checkout セッションのラインアイテムを更新します。これは、後の手順でフロントエンドから呼び出します。

セキュリティのヒント

クライアント側のコードは、ユーザーが完全に制御可能な環境で実行できることを確認しておかなければなりません。悪意のあるユーザーは、クライアント側の検証をバイパスしたり、リクエストを傍受して内容を変更したり、サーバーにまったく新しいリクエストを送信したりする可能性があります。

エンドポイントを設計する際は、以下を考慮することをお勧めします。

  • エンドポイントは過度に汎用的にするのではなく、特定の顧客とのやり取りに対応するように設計します (たとえば、一般的な「更新」アクションではなく「クロスセル商品の追加」アクションなど)。特定のエンドポイントは目的がわかりやすく、検証ロジックの記述と維持が簡単になります。
  • セッションデータをクライアントからエンドポイントに直接渡さないようにしてください。悪意のあるクライアントがリクエストデータを変更する可能性があり、Checkout セッションの状態を判断するためのソースとしての信頼性が低くなってしまいます。代わりに、セッション ID をサーバーに渡し、それを使用して Stripe の API からデータを安全に取得することが可能です。
Ruby
require 'sinatra' require 'json' require 'stripe' set :port, 4242 # Set your secret key. Remember to switch to your live secret key in production. # See your keys here: https://dashboard.stripe.com/apikeys Stripe.api_key =
'sk_test_BQokikJOvBiI2HlWgH4olfQ2'
Stripe.api_version = '2025-03-31.basil; checkout_server_update_beta=v1;' MONTHLY_PRICE_ID = '{{MONTHLY_PRICE}}' YEARLY_PRICE_ID = '{{YEARLY_PRICE}}' post '/change-subscription-interval' do content_type :json request.body.rewind request_data = JSON.parse(request.body.read) checkout_session_id = request_data['checkout_session_id'] interval = request_data['interval'] if checkout_session_id.nil? || !['yearly', 'monthly'].include?(interval) status 400 return { type: 'error', message: 'We could not process your request. Please try again later.' }.to_json end begin # 1. Create the new line items for the session new_price = interval == 'yearly' ? YEARLY_PRICE_ID : MONTHLY_PRICE_ID line_items = [{ price: new_price, quantity: 1, }] # 2. Update the Checkout Session with the new line items. Stripe::Checkout::Session.update(checkout_session_id, { line_items: line_items, }) # 3. Return success response. { type: 'success' }.to_json rescue Stripe::StripeError # Handle Stripe errors with a generic error message status 400 { type: 'error', message: 'We couldn't process your request. Please try again later.' }.to_json rescue StandardError # Handle unexpected errors status 500 { type: 'error', message: 'Something went wrong on our end. Please try again later.' }.to_json end end

ラインアイテムを更新する場合は、ラインアイテムの配列全体を再送信する必要があります。

  • 既存のラインアイテムを保持するには、そのラインアイテムの id を指定します。
  • 既存のラインアイテムを更新するには、そのラインアイテムの id と、更新するフィールドの新しい値を指定します。
  • 新しいラインアイテムを追加するには、id を付けずに price と quantity を指定します。
  • 既存のラインアイテムを削除するには、再送信された配列からそのラインアイテムの ID を除外します。
  • ラインアイテムを並べ替えるには、再送信された配列内の目的の位置にラインアイテムの id を指定します。

クライアント SDK の更新
クライアント側

custom_checkout_server_updates_1 ベータヘッダーを使用して stripe.js を初期化します。

checkout.js
const stripe = Stripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
, { betas: ['custom_checkout_server_updates_1'], });

サーバー更新の呼び出し
クライアント側

フロントエンドから更新をトリガーするには、サーバーにリクエストを送信し、それを runServerUpdate でラップします。リクエストが成功すると、Session オブジェクトが新しい項目で更新されます。

index.html
<button id="change-subscription-interval" role="switch" aria-checked="false"> Save with a yearly subscription </button>
checkout.js
document.getElementById('change-subscription-interval') .addEventListener("click", async (event) => { const button = event.target; const isCurrentSubscriptionMonthly = button.getAttribute("aria-checked") === "false"; const updateCheckout = () => { return fetch("/change-subscription-interval", { method: "POST", headers: { "Content-type": "application/json", }, body: JSON.stringify({ checkout_session_id: checkout.session().id, interval: isCurrentSubscriptionMonthly ? "yearly" : "monthly", }) }); }; const response = await checkout.runServerUpdate(updateCheckout); if (!response.ok) { // Handle error state return; } // Update toggle state on success const isNewSubscriptionMonthly = !isCurrentSubscriptionMonthly; button.setAttribute("aria-checked", !isNewSubscriptionMonthly); button.textContent = isNewSubscriptionMonthly ? "Save with a yearly subscription" : "Use monthly subscription"; });
このページはお役に立ちましたか。
はいいいえ
お困りのことがございましたら 、サポートにお問い合わせください。
早期アクセスプログラムにご参加ください。
変更ログをご覧ください。
ご不明な点がございましたら、お問い合わせください。
LLM ですか?llms.txt を読んでください。
Powered by Markdoc