簡體   English   中英

將令牌化的卡數據提交給Intuit / Quickbooks Payments API時出錯

[英]Error submitting tokenized card data to Intuit/Quickbooks Payments API

我正在將Intuit / Quickbooks Payments API集成到現有的電子商務網站中。 由於PCI的要求,我需要先通過JavaScript標記卡數據,然后再將其到達服務器,然后使用該令牌而不是實際的卡數據來提交費用。

為什么我從Payments API收到“令牌無效”錯誤?

第一次嘗試

我按照本頁上的說明進行操作,這些說明描述了如何使用Inuit提供的JavaScript文件對卡數據進行標記化。

<script src="https://js.appcenter.intuit.com/Content/IA/intuit.ipp.payments.sandbox-0.0.3.js"></script>

intuit.ipp.payments.tokenize(
  qbAppToken, {
    card: {
      number: $("#tokenize_cc-number").val(),
      expMonth: $("#tokenize_cc-expmonth").val(),
      expYear: $("#tokenize_cc-expyear").val(),
      cvc: $("#tokenize_cc-cvc").val(),
      address: {
        streetAddress: $("#tokenize_cc-address-street").val(),
        city: $("#tokenize_cc-address-city").val(),
        region: $("#tokenize_cc-address-region").val(),
        country: $("#tokenize_cc-address-country").val(),
        postalCode: $("#tokenize_cc-address-postalcode").val()
      }
    }
  },
  function(token, response) {
    console.log(response);
    if (token != null) {
      console.log(token);
      $cardToken.val(token);
      $paymentForm[0].submit();
    } else {
      console.log("Error during tokenization " + response.code + "; " + response.message + "; " + response.detail + "; " + response.moreinfo);
    }
  });

我找回看似是卡片令牌的東西:

f9e7a378-c3f2-4343-b0a8-ee376d4ed472

我將該令​​牌插入表單,然后將表單提交給服務器,服務器隨后使用卡令牌通過CURL將費用提交給Payments API。

我正在向端點提交:

https://sandbox.api.intuit.com/quickbooks/v4/payments/charges

Array
(
    [amount] => 6992.83
    [currency] => USD
    [capture] => true
    [token] => f9e7a378-c3f2-4343-b0a8-ee376d4ed472
    [context] => Array
        (
            [mobile] => false
            [isEcommerce] => true
        )

)

但是,我從Payments API返回的響應顯示“令牌已過期”:

{
  "errors": [{
    "code": "PMT-4000",
    "type": "invalid_request",
    "message": "token is invalid.",
    "detail": "token",
    "infoLink": "https://developer.intuit.com/v2/docs?redirectID=PayErrors"
  }]
}

這是完整的答復:

HTTP/1.1 400 Bad Request
Server: nginx
Date: Wed, 05 Jun 2019 18:13:20 GMT
Content-Type: application/json;charset=utf-8
Content-Length: 175
Connection: keep-alive
Keep-Alive: timeout=5
Strict-Transport-Security: max-age=15552000
intuit_tid: [redacted]
Set-Cookie: ADRUM_BT=R:0|clientRequestGUID:9ae895d4-44ee-4175-bb47-4e37e95162a819|btId:755|backendSnapshotType:f; Expires=Wed,  5-Jun-2019 18:13:49 GMT; Path=/

{"errors":[{"code":"PMT-4000","type":"invalid_request","message":"token is invalid.","detail":"token","infoLink":"https://developer.intuit.com/v2/docs?redirectID=PayErrors"}]}

我注意到, 說明對JavaScript卡標記化說“這部分僅適用於OAuth的1.0的應用程序。” 這可能是個問題。 但是我沒有提到如何為OAuth 2.0應用標記卡數據。

解釋錯誤

我認為“令牌無效”錯誤是指我的卡令牌,而不是我的應用程序身份驗證令牌。 我將此假設基於兩件事:

  1. 更改應用程序身份驗證令牌時,出現另一個錯誤:

     { "code": "AuthenticationFailed", "type": "INPUT", "message": null, "detail": null, "moreInfo": null } 
  2. Intuit開發人員關系說,Intuit的JavaScript文件中的令牌端點是“不正確的”,這表明我收到的卡令牌存在問題。

聯系開發人員關系

Intuit開發人員關系說:

出現該錯誤的原因是,該javascript文件未在正確的環境中正確創建令牌。

QuickBooks Payments API具有兩種不同的環境。 一種稱為沙箱環境,另一種稱為生產環境。 要為沙箱環境創建令牌,您將需要使用以下URL:https://sandbox.api.intuit.com/quickbooks/v4/payments/tokens

但是,在該JavaScript中,令牌的URL為:https://transaction-api-e2e.payments.intuit.net/v2/tokens,這是錯誤的。 這是我們使用的內部測試環境。 在e2e中創建的令牌不適用於沙箱。 這就是為什么您獲得令牌無效錯誤的原因。

另一嘗試

在檢查了API資源管理器和令牌端點之后 ,我嘗試在沒有Intuit的JavaScript庫的情況下生成卡令牌。

盡管與sandbox.api.intuit.com/v4/payments/tokens不存在,但是它使用與開發人員關系引用的API資源管理器中的端點相同的端點,所以我認為這是一個錯字。

POST v4 /付款/令牌
對於IE8 / IE9-POST /快速簿/ v4 /付款/令牌/ ie
內容類型:application / json
生產基礎URL:https://api.intuit.com
沙盒基本URL:https://sandbox.api.intuit.com

jQuery.ajax({
  url: "https://sandbox.api.intuit.com/quickbooks/v4/payments/tokens",
  type: "POST",
  contentType: 'application/json',
  dataType: "json",
  data: JSON.stringify(cardData)
}).done(function(msg) {

  ...

});

結果是一樣的。
我得到的似乎是卡令牌,但是當我通過CURL提交費用時,仍然得到:

{
  "errors": [{
    "code": "PMT-4000",
    "type": "invalid_request",
    "message": "token is invalid.",
    "detail": "token",
    "infoLink": "https://developer.intuit.com/v2/docs?redirectID=PayErrors"
  }]
}

怎么了

除了在開發人員社區論壇上發布的帖子外,我還有Intuit的公開票。 如果我從他們那里收到任何進一步的信息,我將對其進行更新。

如果您按照此處說明使用https://js.appcenter.intuit.com/Content/IA/intuit.ipp.payments-0.0.3.js的javascript文件標記信用卡信息,請注意開發者關系的響應:

...在該javascript中,令牌的URL為:https://transaction-api-e2e.payments.intuit.net/v2/tokens,這是錯誤的。 這是我們使用的內部測試環境。 在e2e中創建的令牌不適用於沙箱。 這就是為什么您獲得令牌無效錯誤的原因。

要為沙箱環境創建令牌,您將需要使用以下URL: https : //sandbox.api.intuit.com/quickbooks/v4/payments/tokens

我已成功通過AJAX從該Tokens端點請求卡令牌。

此外,使用卡令牌提交費用時,請確保在標頭中發送唯一的RequestID

如果該服務收到另一個具有相同RequestID的請求,而不是再次執行該操作或返回錯誤,則該服務將發送與原始請求相同的響應 什么是RequestId及其用法

這就是為什么即使切換到正確的端點后仍然出現“無效令牌”錯誤的原因。

我一直在與Postman進行測試(我知道JS並不是問題),而是API。 也許這會有所幫助。

卡令牌化:

  • 端點: https : //sandbox.api.intuit.com/quickbooks/v4/payments/tokens
  • 標頭:Content-Type:application / json
  • 正文(原始)JSON(應用程序/ json):

    {“ card”:{“ name”:“ emulate = 0”,“ number”:“ 4111111111111111”,“ expMonth”:“ 02”,“ address”:{“ postalCode”:“ 94086”,“ country”:“美國”,“區域”:“ CA”,“ streetAddress”:“ Road Street”,“ city”:“ Sunnyvale”},“ expYear”:“ 2020”,“ cvc”:“ 123”}}

響應:

{
 "value": "7e92f015-820b-4e70-81b9-8ce840c76389"
}

收費:

  • 端點: https : //sandbox.api.intuit.com/quickbooks/v4/payments/charges
  • 標頭:Content-Type:application / json
  • request-id:RANDOM NUMBER
  • 授權:OAuth 2.0訪問令牌(59分鍾)
  • 正文(原始)JSON(應用程序/ json):

    {“ currency”:“ USD”,“ amount”:“ 10.55”,“ context”:{“ mobile”:“ false”,“ isEcommerce”:“ true”},“ token”:“ 7e92f015-820b-4e70- 81b9-8ce840c76389“}

響應:

{
"created": "2019-06-17T16:18:43Z",
"status": "CAPTURED",
"amount": "10.55",
"currency": "USD",
"token": "7e92f015-820b-4e70-81b9-8ce840c76389",
"card": {
    "number": "xxxxxxxxxxxx1111",
    "name": "emulate=0",
    "address": {
        "city": "Sunnyvale",
        "region": "CA",
        "country": "US",
        "streetAddress": "Road Street",
        "postalCode": "94086"
    },
    "cardType": "Visa",
    "expMonth": "02",
    "expYear": "2020",
    "cvc": "xxx"
},
"avsStreet": "Pass",
"avsZip": "Pass",
"cardSecurityCodeMatch": "NotAvailable",
"id": "E4JTLAV2QAFF",
"context": {
    "mobile": false,
    "deviceInfo": {},
    "recurring": false,
    "isEcommerce": true
},
"authCode": "546816"
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM