You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PayPal Vaulting问题:onApprove响应中billingToken为null

PayPal Buttons卡片存储(Vaulting)未获取billingToken问题解决

1. billingToken为null的原因

  • 旧版的billingToken字段已被PayPal废弃,最新SDK不再返回该参数。
  • 你的订单创建逻辑缺少关键的Vaulting配置,没有明确告知PayPal需要存储卡片,导致存储流程未触发。

2. 正确实现卡片存储并获取令牌

修正后的React代码

需要在createOrder中为订单添加payment_source.card.vault配置,明确开启卡片存储:

<PayPalScriptProvider options={{ 
  clientId: "test", 
  components: "buttons", 
  currency: "USD", 
  intent: "capture",
  vault: true // 全局启用Vaulting支持
}}>
  <PayPalButtons
    createOrder={(data, actions) => {
      return actions.order.create({
        purchase_units: [{
          amount: { value: "9.99" },
          // 核心配置:开启卡片存储
          payment_source: {
            card: {
              vault: {
                store_in_vault: "ON_SUCCESS" // 订单成功后自动存储卡片
              }
            }
          }
        }]
      });
    }}
    onApprove={(data, actions) => {
      return actions.order.capture().then((details) => {
        // 从捕获结果中获取存储的卡片ID(替代旧版billingToken)
        const storedCardId = details.purchase_units[0].payment_source.card.id;
        console.log("存储的卡片令牌ID:", storedCardId);
        // 将此ID发送到后端,用于后续发起扣款
      });
    }}
  />
</PayPalScriptProvider>

必看要点

  • 必须在purchase_units里配置payment_source.card.vault,这是触发卡片存储的关键,缺一不可。
  • PayPalScriptProvider的vault: true仍需保留,确保SDK加载Vault相关功能模块。
  • 存储成功后,令牌不再通过data.billingToken返回,而是在捕获订单的details响应中取payment_source.card.id。

3. 最新PayPal存储支付方式说明

当前PayPal主推Payment Source Vaulting模式,替代旧版的Billing Agreement。该模式支持在完成单次交易的同时存储支付方式,后续扣款可直接使用存储的card.id:

后端发起后续扣款的示例(REST API):

POST /v2/checkout/orders
{
  "intent": "capture",
  "purchase_units": [{
    "amount": { "value": "19.99" },
    "payment_source": {
      "card": {
        "id": "之前存储的card.id"
      }
    }
  }]
}

内容的提问来源于stack exchange,提问作者Pratik Sahu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 16:05:58