【问题标题】:PayPal payments were created but were never executedPayPal 付款已创建但从未执行
【发布时间】:2019-01-12 12:03:58
【问题描述】:

我正在为 Node.js 使用 paypal-rest-sdk@1.8.1。我已经创建了付款并保存了他们的 payerId、token 和 paymentId,但我从未执行过这些付款。

var paypal = require('paypal-rest-sdk');
paypal.configure({
'mode': 'live', 
'client_id': '_CLIENT_ID_',
'client_secret': '_CLIENT_SECRET_'
});
.
.
let payment = {
        "intent": "sale",
        "transactions": [{
            "item_list": {
                "items": some_items_array,
                "shipping_address": {
                    "recipient_name": "some_recipient_name",
                    "line1": "Fake street",
                    "city": "Fake city",
                    "country_code": "Fake country",
                    "postal_code": "123456",
                    "state": "Fake state",
                    "phone": "0000000"

                }

            },
            "amount": {
                "currency": "AUD",
                "total": "15",
                "details": {
                    "subtotal":"15",
                    "tax": "0",
                    "shipping": "0",
                    "handling_fee": "0",
                    "shipping_discount": "0",
                    "insurance": "0"
                }

            }
        }],
        "redirect_urls": {
            "cancel_url": some_base_url + "/home/cart",
            "return_url": some_base_url + "/home/thank-you?cartid=" + cartid
        },
        "payer": {
            "payment_method": "paypal",
            "payer_info": {
                "email": "fake_email@gmail.com"
            }
        }
    };
   paypal.payment.create(payment, function (error, response) {
            if (error) {
                console.log(error);
                // HANDLE ERROR
            } else {
                console.log("Create Payment Response");
                console.log(response);
               //SEND SUCCESS RESPONSE
     }
  });

成功执行上述行后,用户将被重定向到 PayPal 网站进行付款。支付成功后,将他们重定向到带有有效载荷信息的“return_url”链接,即:

{
paymentId:'PAY-000000',
PayerID:'SOME_PAYER_ID',
token:'SOME_TOKEN'
}

多年来,我一直只在数据库中保存 paymentId、PayerID 和 token 而没有执行付款,认为当“intent”设置为“sale”时不需要这样做。

现在我添加了以下代码来执行付款,这对于现在正在下的订单很好。

var execute_payment_json = {
            "payer_id": 'THE_PAYER_ID',
            "transactions": [{
                "amount": {
                    "currency": 'AUD',
                    "total": '15'
                }
            }]
        };
paypal.payment.execute(paymentId, execute_payment_json, function (error, payment) {
            if (error) {
                console.log(JSON.stringify(error.response));
                //HANDLE ERROR
            } else {
                console.log("Get Payment Response");
                console.log(JSON.stringify(payment));
               //SEND SUCCESS
            }
        });

对于成功重定向后payment.execute未完成的旧订单,我尝试对其执行'payment.execute'并得到以下错误。

{
"name":"INVALID_RESOURCE_ID",
"message":"The requested resource ID was not found",
"information_link":"https://developer.paypal.com/docs/api/payments/#errors",
"debug_id":"878378979aac7",
"httpStatusCode":404
}

如果我可以执行这些旧付款,请帮助我。我有他们的 payerId、paymentId 和令牌。

【问题讨论】:

  • 很遗憾,我们无法检查 paymentId、payerId 和 token 是否有效。尝试询问 Paypal 支持团队。这是一个类似的问题:github.com/paypal/PayPal-PHP-SDK/issues/980,如果您提供debug_id,他们似乎可以解释为什么会出现错误。

标签: node.js paypal paypal-rest-sdk


【解决方案1】:

看起来您正在执行以前称为 Express Checkout 的操作而忘记执行最终回调。

可能发生的情况是您的令牌已过期。虽然this is from the docs for the legacy system,但我没有理由相信这不适用于这里。

一个带时间戳的令牌,指示当前付款的快速结帐处理。此令牌通常在 SetExpressCheckout 响应中返回,但如果您第二次调用 SetExpressCheckout,使用 Express Checkout 第二个重定向流程,您可以将相同的令牌作为请求参数传递回 SetExpressCheckout。当将买家从 paypal.com 重定向回您的网站时,PayPal 还会将此令牌作为名为 token 的 GET 参数附加到您的 RETURN URL。 默认情况下,令牌会在三小时后过期。

即使这对 REST 来说并不完全正确,但同样的原则也成立

  1. 您设置呼叫
  2. 客户登录PayPal网站并授权
  3. PayPal 将令牌发回给您
  4. 您忘记“兑换”支付令牌,所以令牌已过期

据我所知,整个交易现在已经失效。您现在必须开始一个新的才能获得付款。

【讨论】:

    猜你喜欢
    • 2013-12-19
    • 2017-05-13
    • 1970-01-01
    • 2017-06-21
    • 1970-01-01
    • 2015-12-23
    • 2016-05-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多