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

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));

关键注意事项

  1. 地址有效性:提供的地址必须符合PayPal格式要求(如国家代码为两位大写字母、邮编匹配对应地区),否则仍会触发验证错误。
  2. 虚拟商品场景:若交易为虚拟商品,可尝试将shipping_preference设为NO_SHIPPING,但部分地区/卡片类型仍可能强制要求地址,建议测试后调整。
  3. Vault卡片状态:确保Vault中存储的卡片处于ACTIVE状态,无过期、冻结等异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 04:31:31