PayPal Vaulting问题:onApprove响应中billingToken为null
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
相关产品推荐
相关产品推荐

