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
相关产品推荐
相关产品推荐

