2016-12-28 49 views
1

我想在這裏使用提供了checkout.js和指令集成PayPal快速結賬未定義:https://developer.paypal.com/docs/integration/direct/express-checkout/integration-jsv4/advanced-integration/PayPal快速Checkout.js - 上的indexOf內Checkout.js

每當我點擊「貝寶」按鈕,我從checkout.js腳本獲取有關未定義的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之前(並且在它被調用後再次發生)。

我一直在嘗試達到一週的貝寶技術支持,甚至在很多請求後都沒有收到確認。此外,我無法在Heroku上測試REST API,因爲他們的沙箱需要超過30秒才能響應,Heroku超時。這將是我最後一次在項目中使用PayPal ......並且速度看起來像我需要儘快從這個項目改變。

回答

4

我有這個問題。我的用例是Express Checkout(客戶端)和Paypal SDK(服務器)。貝寶將此稱爲高級集成。

我讓我的服務器返回一個JSON對象作爲響應與單個屬性「paymentID」:

我如下解決了這個問題。這在Paypal documentation的「高級集成」頁面中進行了說明,但其重要性沒有明確說明。

看那個文檔,昭示你需要返回的第4步:

  • 你的服務器發送到客戶端的響應,傳回支付ID:

    { 
        "paymentID": "PAY-0J356327TH335450NK56Y2PQ" 
    } 
    
  • 的checkout.js處理該返回值作爲 「令牌」 參數。

    下面是對我的作品的代碼:

    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'); 
    
    +0

    不幸的是這實際上我如何已經得到它的設置。我看到的唯一區別是我返回'paymentId'而不是'paymentID'。但是,不是'resolve()'調用實際上是給付paymentId的嗎?你在本地開發嗎?試圖弄清楚這可能是一個問題,或者可能是一個沒有SSL的問題。最近我一直沒有遇到所有PayPal API的問題。 – Ryan

    +0

    我的代碼使用http:// localhost,(no ssl)在本地運行,並調用Paypal沙箱環境。傳遞給解析方法的屬性應該與服務器端返回的內容匹配。 –

    +1

    這實際上是我的問題。你已經解決了,謝謝。但我不得不嘲笑這個文檔寫得太差,真的。我從來沒有誤導過或像我一樣經常抓撓我的腦袋。 – Benji

    3

    現在您有:

    payment: function() { 
    

    這必須是:

    payment: function(resolve, reject) { 
    

    否則resolve a nd reject函數不可用於將paymentID傳遞迴checkout.js。

    +0

    這樣做的竅門,非常感謝! – Werner

    +0

    這應該在我複製粘貼的Paypal文檔中。 – Warrick

    0

    這個解決方案真的很有幫助,但是我們可以通過paypal收到的paypal解析方法,解析(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'); 
    

    感謝, 馬諾

    +0

    'paypal.request.post'只是一個方便的方法,它使ajax調用 – bluepnume