使用@paypal/react-paypal-js时PayPal捕获API缺失汇率问题排查
PayPal Capture API返回汇率信息的前提是买家支付的货币与订单设置的货币不一致,此时seller_receivable_breakdown字段下会出现exchange_rate节点。从你提供的Capture响应来看,金额货币是USD,但你提到商家账户默认EUR、npm包配置默认EUR,这里存在明显的货币配置矛盾,这大概率是问题根源。
排查步骤
1. 确认订单创建时的货币参数
检查你使用@paypal/react-paypal-js创建订单的代码,确保purchase_units[0].amount.currency_code明确设置为EUR,而非USD。示例代码参考:
createOrder: (data, actions) => { return actions.order.create({ purchase_units: [{ amount: { value: '25.00', currency_code: 'EUR' // 必须设置为商家默认货币EUR } }] }); }
你当前的Capture响应显示货币为USD,说明订单创建时实际用了USD作为交易货币,这会导致后续的货币转换逻辑不符合预期。
2. 查看订单详情获取关键信息
使用Capture响应中的order_id(37B87843KP680035N)调用订单详情API:GET /v2/checkout/orders/{order_id},重点查看以下字段:
purchase_units[0].amount.currency_code:确认订单实际使用的货币payment_source.paypal.payer_info.payer_currency:验证买家账户的默认货币是否为PLNpurchase_units[0].payments.captures[0].seller_receivable_breakdown:检查是否存在exchange_rate字段
3. 验证商家账户转换设置
登录Sandbox商家账户,确认:
- 店铺默认货币已设置为EUR
- “按店铺默认货币转换付款”的选项已开启(路径:账户设置 → 付款设置 → 币种接受选项)
4. 重新测试正确场景
创建一个明确设置为EUR货币的订单,使用PLN账户完成付款,之后再次调用Capture API,此时响应中应该会包含exchange_rate字段,示例格式如下:
"seller_receivable_breakdown": { "gross_amount": { "currency_code": "EUR", "value": "22.50" }, "paypal_fee": { "currency_code": "EUR", "value": "1.50" }, "net_amount": { "currency_code": "EUR", "value": "21.00" }, "exchange_rate": { "source_currency_code": "PLN", "target_currency_code": "EUR", "value": "0.225" } }
关键说明
如果订单货币与商家账户默认货币不同(比如你当前的USD vs EUR),PayPal会在资金结算时将订单货币转换为商家账户货币,但这个转换的汇率不会出现在Capture响应中——Capture响应仅返回买家支付货币到订单货币的汇率。因此必须确保订单货币与商家默认货币一致,才能在买家使用其他货币付款时获取到预期的汇率信息。
内容的提问来源于stack exchange,提问作者Deepak

