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

PayPal Button SDK如何实现负面测试场景?资金失败测试遇阻求助

PayPal资金失败场景测试配置问题解决

你的核心问题是**PayPal-Mock-Response模拟头加错了位置**——这个请求头必须添加在你的后端服务器向PayPal官方API发起的Capture请求中,而不是前端页面向自己后端接口发起的请求里。

你当前的前端代码里,onApprove中的fetch是调用自己的/demo/checkout/api/paypal/order/{orderID}/capture/后端接口,这个请求的头只会被你的后端收到,并不会传递给PayPal的官方API。后端调用PayPal Capture接口时没加模拟头,所以PayPal返回正常交易成功的结果。

正确配置步骤

1. 修改后端Capture接口逻辑

在你的后端代码中,当向PayPal的https://api-m.sandbox.paypal.com/v2/checkout/orders/{order_id}/capture发起POST请求时,添加PayPal-Mock-Response头。

举个Node.js/Express的后端示例:

app.post('/demo/checkout/api/paypal/order/:orderId/capture', async (req, res) => {
  const orderId = req.params.orderId;
  // 可选:从前端接收模拟标记,方便开关测试
  const mockError = req.query.mock;

  const paypalHeaders = {
    'Content-Type': 'application/json',
    'Authorization': `Bearer ${你的PayPal沙箱访问令牌}`
  };

  // 如果需要模拟错误,添加模拟头
  if (mockError === 'INSTRUMENT_DECLINED') {
    paypalHeaders['PayPal-Mock-Response'] = JSON.stringify({
      mock_application_codes: 'INSTRUMENT_DECLINED'
    });
  }

  try {
    const captureResponse = await fetch(`https://api-m.sandbox.paypal.com/v2/checkout/orders/${orderId}/capture`, {
      method: 'POST',
      headers: paypalHeaders
    });
    const data = await captureResponse.json();
    res.json(data);
  } catch (err) {
    res.status(500).json({ error: err.message });
  }
});

2. 调整前端代码(可选)

如果需要在前端触发模拟场景,可以在调用后端接口时携带标记参数:

onApprove: function(data, actions) {
  // 这里可以通过URL参数告知后端要模拟的错误类型
  return fetch(`/demo/checkout/api/paypal/order/${data.orderID}/capture/?mock=INSTRUMENT_DECLINED`, {
    method: 'post',
    headers: {
      'content-type': 'application/json'
    },
  }).then(function(res) {
    return res.json();
  }).then(function(orderData) {
    // 原有的错误处理逻辑保持不变
    var errorDetail = Array.isArray(orderData.details) && orderData.details[0];
    console.log('paypal error errorDetail', orderData)

    if (errorDetail && errorDetail.issue === 'INSTRUMENT_DECLINED') {
      return actions.restart();
    }

    if (errorDetail) {
      var msg = 'Sorry, your transaction could not be processed.';
      if (errorDetail.description) msg += '\n' + errorDetail.description;
      if (orderData.debug_id) msg += ' (' + orderData.debug_id + ')';
      return alert(msg); 
    }

    console.log('Capture result', orderData, JSON.stringify(orderData, null, 2));
    var transaction = orderData.purchase_units[0].payments.captures[0];
    alert('Transaction '+ transaction.status + ': ' + transaction.id + '\n\nSee console for all available details');
  });
}

关键注意点

  • 仅在沙箱环境中支持PayPal-Mock-Response头,生产环境无效。
  • 模拟的错误代码必须是PayPal官方支持的有效值,比如INSTRUMENT_DECLINED、PAYER_CANNOT_PAY等。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:21:02