使用REST API对PayPal智能按钮实现进行错误测试并触发INSTRUMENT_DECLINED

问题描述

我在REST checkout SDK上使用PayPal的智能按钮,并在服务器端调用API。

我正在尝试找出正确处理funding failures方法

我插入代码没有问题,但是当资金出现问题时,我似乎无法将其放入JS的正确部分。

我能够通过传递correct mock headers错误代码来模拟否定响应,从而生成模拟INSTRUMENT_DECLINED错误;这是通过捕获脚本中的服务器端发送的。

这是我的JS代码供参考:

paypal.Buttons({
    style: {
        size: 'responsive',layout: 'vertical'
    },createOrder: function() {

        // Make sure payment status alert is hidden first up...
        jQuery('.payment-status').hide();

        return fetch(blm_custom_vars.wp_home + 'classes/paypal/paypal-create-order.PHP',{
            method: 'post',headers: {
                'content-type': 'application/json'
            }
        }).then(function(res) {
            return res.json();
        }).then(function(data) {
            return data.result.id;
        });

    },onApprove: function(data,actions) {
        return fetch(blm_custom_vars.wp_home + 'classes/paypal/paypal-capture-order.PHP?order_id=' + data.orderID,headers: {
                'content-type': 'application/json'
            },body: JSON.stringify({
                orderID: data.id
            })
        }).then(function(res) {
            return res.json();
        }).then(function(orderData) {

            console.log(orderData);

            var errorDetail = Array.isArray(orderData.details) && orderData.details[0];

            if (errorDetail && errorDetail.issue === 'INSTRUMENT_DECLINED') {
                console.log('Hi!');
                // return actions.restart();
            }

            if (errorDetail) {
                // Error here
            }

            alert('Transaction funds captured from ' + orderData.payer.name.given_name);

        })
    },onError: function (err) {
       // Error display here
    },}).render('.purchase-modal');

现在,您可以看到INSTRUMENT_DECLINED中有一个检查;但是,在生成模拟错误时,它从未出现在JS的该部分中,与所有其他错误一样,它最终出现在onError部分中。

然后我尝试通过转到付款屏幕来生成一个不模拟它的模型,以便它可以使用余额,然后返回到我的沙盒帐户并减少余额,以使它们没有足够的余额,但是效果相同,直接进入onError部分。

我唯一似乎无法进入onError上方的部分的情况是付款成功

我想对此进行测试,以查看是否有正确的代码来工作,因为我从以下位置看到了各种示例,这些示例验证了正确的代码

var errorDetail = Array.isArray(orderData.details) && orderData.details[0];

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

到...

if (orderData.error === 'INSTRUMENT_DECLINED') {
    return actions.restart();
}

到...

if (orderData.details[0].issue === 'INSTRUMENT_DECLINED') {
    return actions.restart(); 
}

看起来像是基于第一个

在这里做错什么,如何正确模拟一个INSTRUMENT_DECLINED错误,使其最终出现在我的JS代码的正确部分中?

解决方法

我看到了各种各样的示例,这些示例说明了正确的代码是什么,

“正确”代码取决于您的服务器发送自己对获取请求的响应。如果您只是将v2 / checkout / orders API返回的内容发送回捕获响应(为简便起见,强烈建议使用),那么https://developer.paypal.com/demo/checkout/#/pattern/server处的代码是正确的,并说明了如何根据该格式处理所有3种情况

关于如何触发INSTURMENT_DECLINED响应,您的捕获调用必须在API请求中包含模拟标头。一种简单的触发方法是在结帐时将送货地址行1设置为:“ CCREJECT-REFUSED”(从REST API出现之前在old documentation中提到)