Node.js集成PayPal预支付与Vault卡存储:已存卡支付失败
解决PayPal Vault卡片支付时“Shipping address requested for card payment”错误
错误原因
该错误表明PayPal处理存储在Vault中的卡片支付时,必须验证送货地址信息——这通常是因为交易涉及实物商品,或是卡片发行方/地区的合规要求强制需要收货地址。
解决方案
在创建订单的请求中添加完整的送货地址信息,并明确告知PayPal使用该地址,即可解决此问题。
修改代码示例
以下是基于@paypal/checkout-server-sdk的完整修改代码:
const paypal = require('@paypal/checkout-server-sdk'); // 初始化PayPal客户端(根据环境配置沙箱/生产环境) const environment = new paypal.core.SandboxEnvironment('CLIENT_ID', 'CLIENT_SECRET'); const client = new paypal.core.PayPalHttpClient(environment); // 创建带送货地址的Vault卡片支付订单 async function createVaultPaymentOrder(vaultCardId, shippingInfo) { const request = new paypal.orders.OrdersCreateRequest(); request.prefer('return=representation'); request.requestBody({ intent: 'CAPTURE', // 明确指定使用提供的送货地址 application_context: { shipping_preference: 'SET_PROVIDED_ADDRESS' }, purchase_units: [ { amount: { currency_code: 'USD', value: '29.99' }, // 添加完整的送货地址信息 shipping: { name: { full_name: shippingInfo.fullName }, address: { address_line_1: shippingInfo.address.line1, address_line_2: shippingInfo.address.line2 || '', admin_area_2: shippingInfo.address.city, admin_area_1: shippingInfo.address.state, postal_code: shippingInfo.address.zip, country_code: shippingInfo.address.country } } } ], // 指定使用Vault中存储的卡片 payment_source: { vault: { id: vaultCardId } } }); try { return await client.execute(request); } catch (err) { console.error('订单创建失败:', err); throw err; } } // 捕获支付 async function capturePayment(orderId) { const request = new paypal.orders.OrdersCaptureRequest(orderId); request.requestBody({}); try { return await client.execute(request); } catch (err) { console.error('支付捕获失败:', err); throw err; } } // 使用示例 const shippingInfo = { fullName: 'Jane Smith', address: { line1: '456 Oak Avenue', city: 'Los Angeles', state: 'CA', zip: '90001', country: 'US' } }; createVaultPaymentOrder('YOUR_VAULT_CARD_ID', shippingInfo) .then(res => capturePayment(res.result.id)) .then(captureRes => console.log('支付成功:', captureRes.result)) .catch(err => console.error('支付流程失败:', err));
关键注意事项
- 地址有效性:提供的地址必须符合PayPal格式要求(如国家代码为两位大写字母、邮编匹配对应地区),否则仍会触发验证错误。
- 虚拟商品场景:若交易为虚拟商品,可尝试将
shipping_preference设为NO_SHIPPING,但部分地区/卡片类型仍可能强制要求地址,建议测试后调整。 - Vault卡片状态:确保Vault中存储的卡片处于
ACTIVE状态,无过期、冻结等异常。
内容的提问来源于stack exchange,提问作者devjsrana
相关产品推荐
相关产品推荐

