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

PayPal:基于Javascript SDK+REST的刷卡失败处理与测试问题咨询

PayPal刷卡失败场景适配相关问题解答

1. JS SDK测试方法与PayPal专属测试卡号

PayPal有独立的沙盒测试卡号,无需使用Braintree的测试卡号,所有测试卡号仅在沙盒环境生效。你不需要手动修改REST请求头来测试失败场景,直接使用对应场景的测试卡号即可触发不同的刷卡失败结果:

  • 模拟支付被拒:卡号4000000000000002,到期日填未来任意年月,CVV填任意3位数字
  • 其他场景(卡过期、余额不足、风控拦截等)均有对应的专属测试卡号,直接在沙盒环境使用即可

2. 银行卡支付被拒时actions.order.capture()的返回内容

支付被拒时actions.order.capture()不会进入.then的成功回调,会直接抛出Promise异常,返回的错误对象中会包含:

  • 错误状态标识status: "DECLINED"
  • 具体错误码,比如INSTRUMENT_DECLINED代表支付方式被拒
  • details字段,标注具体的拒付原因,比如发卡行拒绝、卡余额不足、卡已过期等

3. onError回调入参类型与流程处理建议

onError的入参是已经解码完成的原生JS错误对象,既不是纯字符串也不是JSON字符串,你可以直接读取err.name、err.message、err.details等字段获取错误信息。
你计划的重试逻辑可以这样调整:优先在actions.order.capture()的catch回调中判断错误类型,如果是可重试的支付被拒类错误,直接调用actions.restart()重置支付流程,不可重试的错误再跳转你设置的兜底失败页面即可。

优化后的代码参考

BuildNewPayPalButtons = function(val)
{
    paypal.Buttons({
    createOrder: function(data, actions) {
        // Set up the transaction
        return actions.order.create({
        application_context: {
            shipping_preference: 'NO_SHIPPING' // NOT an enum
        },
        purchase_units: [{
            amount: {
            value: '$amt'
            },
            description: 'my favorite product',
            invoice_id: '$sessid'
        }]
        });
    },
    onApprove: function(data, actions) {
        return actions.order.capture().then(function(orderData) {
            var trns = orderData.purchase_units[0].payments.captures[0];
            console.error('OK: Whole JSON ', JSON.stringify(orderData));
            // Send the transaction id to the server for verification
            window.location.href = "$payurl&paymID=" + trns.id;
        }).catch(function(err) {
            // 捕获支付被拒类错误,优先重试
            if(err.details && err.details.some(d => d.issue === 'INSTRUMENT_DECLINED')) {
                return actions.restart();
            }
            // 其他错误走兜底逻辑
            console.error('capture error', err);
            window.location.href = "/unimplemented_error.html";
        })
    },
    onCancel: function(data) {
        window.location.href = "$cancelurl";
    },
    onError: function(err) {
        console.error('error from the onError callback', err);
        // 非流程内的全局错误走兜底
        window.location.href = "/unimplemented_error.html";
    }
    }).render('#paypal-button-container');
}

关于你提到的官方「Complete Javascript SDK」文档内容不全的问题,确实存在部分场景描述缺失的情况,建议调试时优先以沙盒环境实际返回的字段为准。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 00:54:04