コンテンツにスキップ
アカウント作成/サインイン
Stripe ドキュメントのロゴ
/
AI に質問する
アカウントを作成サインイン
導入方法
決済管理
売上管理
プラットフォームとマーケットプレイス
資金管理
開発者向けリソース
API & SDKヘルプ
概要
Stripe Payments について
構築済みのシステムをアップグレード
決済分析
オンライン決済
概要ユースケースを見つけるManaged Payments を使用する
Payment Links を使用する
事前構築済みの決済ページを使用する
Elements を使用したカスタム統合の構築
    概要
    Quickstart ガイド
    Stripe Elements
    Checkout Sessions と PaymentIntent の比較
    高度なシステムを設計
    デザインをカスタマイズする
    決済手段を管理
    追加情報を収集する
    サブスクリプションの実装
    動的な更新
      配送オプション
      項目
      トライアル期間
      割引
      決済金額
      明細項目の数量
    割引を追加する
    支払いで税金を徴収
    クレジットを使って引き換える
    顧客が現地通貨で支払いできるようにする
    顧客の決済手段を保存および取得する
    領収書と支払い済みの請求書を送信する
    サーバーで支払いを手動で承認する
    支払いのオーソリとキャプチャーを分離する
    Elements with Checkout Sessions API ベータ版の変更ログ
アプリ内実装を構築
対面決済
Terminal
決済手段
決済手段を追加
決済手段を管理
Link による購入の迅速化
決済シナリオ
複数の通貨を扱う
カスタムの決済フロー
柔軟なアクワイアリング
オーケストレーション
決済以外の機能
会社を設立する
暗号資産
エージェント型コマース
Financial Connections
Climate
不正利用について
Radar の不正防止
不審請求の申請の管理
本人確認
アメリカ
日本語
ホーム決済管理Build a custom integration with ElementsDynamic updates

決済金額を動的に更新する

決済中に顧客が選択内容を変更した場合に合計金額を変更する方法をご紹介します。

顧客が購入する商品や決済金額を変更した場合に、Checkout Session または Payment Intent の金額を更新します。サーバーで合計を再計算してから、PaymentIntent の金額を更新します。

一般的なユースケース

  • アドオン (ギフトラップや保証など) を追加または削除します。
  • 別の配送方法または配送速度を選択してください。
  • サービスまたは請求を追加します。
  • 割引コードまたは税引前ストアクレジットを適用または削除します。

セキュリティのベストプラクティス

  • サーバーで金額を再計算します。クライアントから提供された価格や合計を信頼しないでください。
  • ビジネスルールに基づいて更新をオーソリします (最大数量の適用など)。
  • 完了または期限切れになっていないアクティブな Session のみを更新します。

制約と動作

  • Payment Intent または Checkout Session が決済を待っている間に金額を更新できます (requires_payment_method や requires_confirmation など)。
  • 確定後は、通常、金額を増やすことはできません。

クライアント SDK を更新する
クライアント側

Checkout Sessions API で Elements を使用する場合は、サーバーへのクライアントコールを runServerUpdate にラップして、決済の状態と合計を更新します。

checkout.js
import {loadStripe} from '@stripe/stripe-js'; // Optional: include beta flags if your integration requires them const stripe = await loadStripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
, { betas: ['custom_checkout_server_updates_1'], }); const checkout = stripe.initCheckout({ clientSecret, elementsOptions: {/* ... */}, }); // Example: Add additional service using price_data const loadActionsResult = await checkout.loadActions(); if (loadActionsResult.type === 'success') { const actions = loadActionsResult.actions; const session = actions.getSession(); document .getElementById('add-service') .addEventListener('click', async () => { const updateOnServer = () => fetch('/update-custom-amount', { method: 'POST', headers: {'Content-Type': 'application/json'}, body: JSON.stringify({ checkout_session_id: session.id, product_id: 'gift_wrap', // Server looks up actual price }), }); const response = await actions.runServerUpdate(updateOnServer); if (!response.ok) { // show error state } }); }

サーバーエンドポイントの作成
サーバー側

サーバーで金額を計算し、入力を検証します。その後、line_items を price_data で更新して、単発の請求を追加できます。

メモ

line_items または price_data を更新すると、Session の合計と税金が再計算されます。

Node
Python
No results
import express from 'express'; import Stripe from 'stripe'; const app = express(); app.use(express.json()); const stripe = new Stripe(
'sk_test_BQokikJOvBiI2HlWgH4olfQ2'
); // Product catalog with prices - store this securely server-side const PRODUCTS = { gift_wrap: { name: 'Gift Wrap', price: 500 }, // $5.00 express_shipping: { name: 'Express Shipping', price: 1500 }, // $15.00 warranty: { name: 'Extended Warranty', price: 2000 }, // $20.00 }; app.post('/update-custom-amount', async (req, res) => { try { const {checkout_session_id, product_id} = req.body; const session = await stripe.checkout.sessions.retrieve(checkout_session_id); if (session.status === 'complete' || session.expires_at * 1000 < Date.now()) { return res.status(400).json({error: 'Session is no longer updatable.'}); } // Look up product price server-side const product = PRODUCTS[product_id]; if (!product) { return res.status(400).json({error: 'Invalid product ID'}); } // Add the additional product via price_data const updated = await stripe.checkout.sessions.update(checkout_session_id, { line_items: [ { price_data: { currency: 'usd', product_data: {name: product.name}, unit_amount: product.price, }, quantity: 1, }, ], }); return res.json({id: updated.id, amount_total: updated.amount_total}); } catch (err) { return res.status(400).json({error: err.message}); } }); app.listen(4242, () => console.log('Server running on port 4242'));
このページはお役に立ちましたか。
はいいいえ
  • お困りのことがございましたら 、サポートにお問い合わせください。
  • 変更ログをご覧ください。
  • ご不明な点がございましたら、お問い合わせください。
  • LLM ですか?llms.txt を読んでください。
  • Powered by Markdoc