PAYATHON 2026

如何修正 Google Checkout 0$ recurring payments

支付阿杰

结论

无法通过更新原订单,将现有 Google-handled recurring subscription 的 recurrent-item > unit-price 从 0 改为正确金额。这个价格在创建订阅时就已固定,后续 recurring payments 仍会按 unit-price 计算。

maximum-charge 只是 Google 处理单次周期扣款时允许的金额上限,并非实际扣款金额。即使 maximum-charge 设置正确,也不会覆盖值为 0 的 unit-price。

处理方法如下:

  1. 停止或取消错误的订阅。
  2. 修正创建订单时发送的 XML。
  3. 让客户重新完成 Checkout,创建价格正确的新订阅。

原因

对于 Google-handled subscriptions,周期扣款金额取自:

item > subscription > recurrent-item > unit-price

如果这里是 0,周期性商品的应付金额就是 0。结账页面首次显示的订单金额可能来自外层商品价格或初始付款,所以页面金额正确,并不代表 recurring item 的价格也正确。

以下配置会导致后续周期扣款为零:

<subscription type="google" period="MONTHLY">
  <recurrent-item>
    <item-name>Example subscription</item-name>
    <item-description>Monthly subscription</item-description>
    <unit-price currency="USD">0.00</unit-price>
    <quantity>1</quantity>
  </recurrent-item>
  <maximum-charge currency="USD">29.99</maximum-charge>
</subscription>

其中的 maximum-charge 不会自动把 unit-price 提高到 29.99。

解决步骤

1. 修正订单生成逻辑

确保初始订单价格和 recurring item 的价格分别取自正确的数据源,不要将 maximum-charge 用作订阅价格。

<subscription type="google" period="MONTHLY">
  <recurrent-item>
    <item-name>Example subscription</item-name>
    <item-description>Monthly subscription</item-description>
    <unit-price currency="USD">29.99</unit-price>
    <quantity>1</quantity>
  </recurrent-item>
  <maximum-charge currency="USD">29.99</maximum-charge>
</subscription>

如果数量可能大于 1,还要确认系统对 unit-price × quantity 的计算符合预期。

2. 取消错误订阅

通过原有的 Google Checkout 商户后台或订单管理接口取消对应订阅,防止系统继续生成金额为 0 的周期付款。

取消前应保存:

  • 原订单号
  • 客户标识
  • 当前订阅周期
  • 已完成的付款记录
  • 新旧订阅之间的对应关系

具体的取消请求取决于当时使用的 Google Checkout API 版本和集成方式。普通订单的金额调整接口不能用于修改订阅价格。

3. 创建新的 Checkout 订单

使用修正后的 XML 创建新订单,并让客户重新确认。订阅金额发生变化通常需要客户重新授权,不能只在商户端静默替换。

4. 验证原始 XML

不要只检查 Checkout 页面显示的金额。提交前应直接验证最终发送的 XML,确认其中包含:

<recurrent-item>
  <unit-price currency="USD">29.99</unit-price>
  <quantity>1</quantity>
</recurrent-item>

还可以在服务端增加校验。如果 recurring item 的预期价格大于零,而生成的 unit-price 小于或等于零,系统应拒绝提交订单。

if recurring_price <= 0:
    reject checkout request

注意事项

  • 已产生的 0 金额 recurring payments 不会在创建新订阅后自动补扣。
  • 能否另行收取漏扣金额,取决于客户授权、合同约定和当时可用的支付接口。maximum-charge 不能直接作为补扣授权。
  • 在 Sandbox 中,应至少等待一次完整的 recurring payment 流程,并从 merchant 端核对扣款结果。只检查客户结账页的金额还不够。
  • Google Checkout 已停止服务。以上内容适用于维护历史集成或分析旧订单。如果系统仍依赖该服务,应迁移到当前可用且明确支持订阅价格变更和客户重新授权的支付平台。

备注:内容仅供参考。