PayPal Express Checkout.js - 在Checkout.js中未定义的indexOf

Rya*_*yan 1 javascript paypal paypal-sandbox

我正在尝试使用他们的checkout.js和以下提供的说明集成PayPal Express Checkout:https: //developer.paypal.com/docs/integration/direct/express-checkout/integration-jsv4/advanced-integration/

每当我点击'PayPal'按钮时,我都会收到来自checkout.js脚本的undefined indexOf错误.我很快就得到了模态弹出窗口,然后就消失了.

TypeError: Cannot read property 'indexOf' of undefined
    at Object.onSuccess (https://www.paypalobjects.com/api/checkout.js:11449:30)
    at _loop2 (https://www.paypalobjects.com/api/checkout.js:1670:62)
    at SyncPromise.dispatch (https://www.paypalobjects.com/api/checkout.js:1700:29)
    at SyncPromise.then (https://www.paypalobjects.com/api/checkout.js:1718:18)
    at Component.buildUrl (https://www.paypalobjects.com/api/checkout.js:11448:40)
    at Object.onSuccess (https://www.paypalobjects.com/api/checkout.js:8770:57)
    at _loop2 (https://www.paypalobjects.com/api/checkout.js:1670:62)
    at SyncPromise.dispatch (https://www.paypalobjects.com/api/checkout.js:1700:29)
    at SyncPromise.then (https://www.paypalobjects.com/api/checkout.js:1718:18)
    at Function.syncPromiseTry [as try] (https://www.paypalobjects.com/api/checkout.js:1763:42)"
Run Code Online (Sandbox Code Playgroud)

它引用的行在checkout.js中:

return props.payment().then(function(token) {
    if (token.indexOf("BA-") === 0) {
Run Code Online (Sandbox Code Playgroud)

我正在使用的代码直接来自PayPal的文档:

        paypal.Button.render({
            env: 'sandbox', // Specify 'sandbox' for the test environment
            payment: function() {
                var CREATE_PAYMENT_URL = '/api/checkout/create-express-payment';
                paypal.request.post(CREATE_PAYMENT_URL)
                    .then(function(data) {
                        console.log('Payment ID: ', data.paymentId);
                        resolve(data.paymentId);
                    })
                    .catch(function(err) {
                        reject(err);
                    });
            },

            onAuthorize: function(data, actions) {
                // Execute the payment here, when the buyer approves the transaction
            }

        }, '#paypal-button');
Run Code Online (Sandbox Code Playgroud)

我可以确认data.paymentId实际上是带有正确的支付ID,我甚至尝试将其编码到resolve呼叫中.这个错误似乎发生在我的内部API甚至被调用以获取付款ID之前(然后在调用之后再次发生).

我一直试图达到PayPal技术支持一周,并且在许多请求之后甚至没有收到确认.另外,我无法在Heroku上测试REST API,因为他们的沙箱响应时间超过30秒,而Heroku超时.这将是我最后一次在项目中使用PayPal ......而且这个速度看起来我需要尽快从这个项目中改变.

Fre*_*rlo 5

我有这个问题.我的用例是Express Checkout(客户端)和Paypal SDK(服务器).Paypal将此称为高级集成.

我解决了这个问题如下:

我让我的服务器返回一个JSON对象作为响应,具有单个属性"paymentID".这在Paypal文档的高级集成页面中进行了解释,但其重要性并未明确说明.

查看该文档的第4步,它清楚地说明了您需要返回的内容:

  1. 您的服务器向您的客户发送回复以传回付款ID:

    {
        "paymentID": "PAY-0J356327TH335450NK56Y2PQ"
    }
    
    Run Code Online (Sandbox Code Playgroud)

checkout.js将此返回值作为"token"参数处理.

这是适合我的代码:

 paypal.Button.render({
   env: 'sandbox',
   payment: function(resolve, reject) {
     var CREATE_PAYMENT_URL = 'http://localhost/api/payment/create';
     paypal.request.post(CREATE_PAYMENT_URL, {
     // js object used to create payment
     }).then(function(data) {
         resolve(data.paymentID);
     }).catch(function(err) {
         reject(err);
     });
   },
   onAuthorize: function(data) {
     var EXECUTE_PAYMENT_URL = 'http://localhost/api/payment/execute';
     paypal.request.post(EXECUTE_PAYMENT_URL, {
     // js object used to complete payment
     // needs to include properties for paymentID and payerID
     }).then(function(data) {
     // process results after transaction is completed
     }).catch(function(err) {});
   },
   onCancel: function(data) {}
 }, '#paypal-button');
Run Code Online (Sandbox Code Playgroud)

  • 这实际上是我的问题.你已经解决了,谢谢.但我只是嘲笑这篇文档编写得有多糟糕,真的.我从来没有像往常一样经常误导我的脑袋. (2认同)