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

时间:2016-12-28 04:06:57

标签: javascript paypal-sandbox paypal

我正在尝试使用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)"

它引用的行在checkout.js中:

return props.payment().then(function(token) {
    if (token.indexOf("BA-") === 0) {

我正在使用的代码直接来自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');

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

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

3 个答案:

答案 0 :(得分:5)

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

我解决了这个问题如下:

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

请查看该文档的第4步,其中说明了您需要返回的内容:

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

    using (var context = new MyContext())
    {
      context.MyEntities.AddObject(newEmployee);
      context.SaveChanges();
    
      int id = newEmployee.Id; // Your Identity column ID
      newEmployee.streEmpId = "EMP" + id;
      context.Entry(newEmployee).State = EntityState.Modified;
      context.SaveChanges();
    
    }
    
  2.   

checkout.js将此返回值作为“token”参数处理。

以下是适用于我的代码:

{
    "paymentID": "PAY-0J356327TH335450NK56Y2PQ"
}

答案 1 :(得分:3)

现在你有:

payment: function() {

这需要:

payment: function(resolve, reject) {

否则,resolvereject功能无法将paymentID传递回checkout.js。

答案 2 :(得分:0)

这个解决方案真的很有用,但是我们可以传递从paypal收到的令牌ID来解决方法,而不是payid,解决( data.tokenid );而不是 paypal.request.post 方法,我们可以进行ajax调用,代码就像,

<script src="https://www.paypalobjects.com/api/checkout.js"></script>
<div id="paypal-buttoncheckout"></div>
    paypal.Button.render({
        env: "sandbox", // Optional: specify 'sandbox' environment
        locale: //your respective locale,
        payment: function(resolve, reject) { 
            var CREATE_PAYMENT_URL = //URL for creating payment
            $.ajax({
               type:'POST',
               dataType : 'html',
               contentType: 'application/html',
               url : CREATE_PAYMENT_URL,
               success : function(data){    
                   resolve(data.tokenid);
               },
               error : function(response){

               }
           });

      },

            onAuthorize: function(data) {
                // Note: you can display a confirmation page before executing
                var EXECUTE_PAYMENT_URL = //reauthorize URL;
                paypal.request.post(EXECUTE_PAYMENT_URL,
                        { paymentID: data.paymentID, payerID: data.payerID,token: data.paymentToken })
                        .then(function(data) { window.location = //SUCCESS PAGE })
                        .catch(function(err) { window.location = //ERROR PAGE});
            },

            onCancel: function(data, actions) {
                window.location = //ON CANCEL URL
            }



        }, '#paypal-buttoncheckout');

谢谢, 的Manoj