You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Stripe支付场景下运费变更时如何更新订单总额(含亚马逊、谷歌支付等)

Stripe支付场景下运费变更时如何更新订单总额(含亚马逊、谷歌支付等)

嘿,这个问题我之前帮朋友排查过,其实核心是你现在只告诉了Stripe选中的运费,但没同步更新订单的总金额——Stripe不会自动帮你算总价,得你自己算好后传回去才行!

核心逻辑先搞懂

当用户切换运费选项触发shippingratechange事件时,你需要做两件事:

  1. 基于选中的运费,重新计算整个订单的总价(商品基础价 + 选中的运费)
  2. 把更新后的订单明细/总价通过event.resolve传给Stripe,这样Stripe的支付模态框(包括亚马逊、谷歌支付这些内嵌的支付界面)才会自动刷新显示新的总额

具体代码修改(直接用你的代码改)

我把你的代码改成了可直接用的版本,每一步都加了注释:

// 先提前存好商品的基础总价(建议从页面元素或订单数据里动态取,别写死)
// 注意:Stripe所有金额单位都是「分」,比如80美元要写成8000,别用小数!
const baseProductTotal = parseInt(document.getElementById('base-product-total').value);

expressCheckoutElement.on('shippingratechange', function(event) {
  const resolve = event.resolve;
  const shippingRate = event.shippingRate;

  try {
    // 1. 计算新的订单总额:商品基础价 + 选中的运费金额
    const newShippingAmount = shippingRate.amount;
    const newOrderTotal = baseProductTotal + newShippingAmount;

    // 2. 构造更新后的订单明细(用line_items比直接传total更灵活,兼容多商品场景)
    // 这里分商品项和运费项,Stripe会自动累加显示总价
    const updatedLineItems = [
      // 商品项:保持原来的商品信息和价格
      {
        price_data: {
          currency: 'usd', // 换成你的货币代码,比如eur、cny
          product_data: {
            name: '你的商品名称' // 可以从页面取动态值
          },
          unit_amount: baseProductTotal
        },
        quantity: 1
      },
      // 运费项:用选中的运费信息
      {
        price_data: {
          currency: 'usd',
          product_data: {
            name: shippingRate.display_name // 比如「标准配送」「次日达」
          },
          unit_amount: newShippingAmount
        },
        quantity: 1
      }
    ];

    // 3. 构造完整的payload:既要传选中的运费,也要传更新后的订单明细
    const payload = {
      shippingRates: [shippingRate], // 保留你原来的选中运费逻辑
      line_items: updatedLineItems // 关键!这行是让总额刷新的核心
    };

    // 4. 务必在20秒内调用resolve,不然Stripe会判定超时
    resolve(payload);
  } catch (err) {
    // 如果计算出错,返回错误提示给用户
    resolve({
      error: {
        message: '运费计算失败,请稍后重试'
      }
    });
  }
});

几个关键注意事项(敲黑板!)

  • 金额单位必须用分:Stripe不接受小数金额,比如99.90美元要写成9990,别直接传99.90,否则会出现金额显示错误
  • 动态获取基础总价:别把baseProductTotal写死,建议用页面隐藏输入框存储(比如<input type="hidden" id="base-product-total" value="8000">),这样商品总价变动时不用改JS
  • 兼容所有Express支付方式:这个写法支持亚马逊支付、谷歌支付、Apple Pay等所有Express Checkout包含的支付方式,因为它们都是基于Stripe返回的line_items来渲染金额的
  • 超时问题:必须在20秒内调用resolve,不然Stripe的模态框会显示错误,所以计算逻辑别太复杂

最后再总结下

你之前的代码只告诉了Stripe“用户选了这个运费”,但没说“订单总价现在变成X了”——Stripe是个“执行者”,不是“计算器”,得你把算好的结果明确传给他,他才会更新模态框里的总额。按上面的代码改完,切换运费时总价就会自动跟着变啦!

火山引擎 最新活动