Ошибка при отправке данных токенизированной карты в API платежей Intuit / Quickbooks - PullRequest
4 голосов
/ 05 июня 2019

Я интегрирую API платежей Intuit / Quickbooks в существующий веб-сайт электронной коммерции.Из-за требований PCI мне необходимо токенизировать данные карты с помощью JavaScript, прежде чем они достигнут сервера, и затем передать данные с этим токеном вместо фактических данных карты.

Почему я получаю «токен недействителен»ошибка API платежей?

Первая попытка

Я следовал инструкциям на этой странице , которые описывают, как использовать файл JavaScript, предоставленный Inuit, для токенизации данных карты.

<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

Я вставляю этотокен в мою форму и отправьте форму на мой сервер, который затем отправляет платеж в API платежей через CURL с помощью токена карты.

Я отправляю в конечную точку:

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
        )

)

Однако в ответе, который я получаю от 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 card tokenization говорит: «Этот раздел относится только к приложениям OAuth 1.0».Это может быть проблемой.Но я не вижу упоминания о том, как токенизировать данные карты для приложений OAuth 2.0.

Интерпретация ошибки

Я предполагаю, что ошибка "токен неверен" относится к моему токену карты, а не к моемутокен аутентификации приложения.Я основываю это предположение на двух вещах:

  1. При изменении токена аутентификации приложения я получаю другую ошибку:

    {
      "code": "AuthenticationFailed",
      "type": "INPUT",
      "message": null,
      "detail": null,
      "moreInfo": null
    }
    
  2. Служба Intuit по связям с разработчиками сказала, что конечная точка токена в файле JavaScript Intuit «неверна», что указывает на проблему с токеном карты, который я получаю.

Обращение в отношения с разработчиками

Взаимоотношения разработчиков с Intuit сказали:

Причина, по которой вы получаете эту ошибку, заключается в том, что файл javascript неправильно создал токен в правильной среде.

API платежей QuickBooks имеет две разные среды.Одна называется средой песочницы, другая называется производственной средой.Для создания токена для среды песочницы вам нужно будет использовать этот URL: https://sandbox.api.intuit.com/quickbooks/v4/payments/tokens

Однако в этом javascript URL для токена: https://transaction -api-e2e.payments.intuit.net / v2 /токены, что неверно.Это внутренняя среда тестирования, которую мы использовали.Токен, созданный в e2e, не будет работать в песочнице.Вот почему вы получаете токен неверной ошибки.

Другая попытка

После просмотра обозревателя API и конечной точки токенов я попытался сгенерировать токен картыбез библиотеки JavaScript Intuit.

При этом используется та же конечная точка, что и в API Explorer, на которую ссылаются отношения разработчиков, хотя sandbox.api.intuit.com / v4 / payment / tokens didn 'не существует, поэтому я предполагаю, что это опечатка.

POST v4 / платежи / токены
ДЛЯ IE8 / IE9 - POST / quickbooks / v4 / payment / tokens / т.е.
Тип контента: приложение/ 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 в дополнение к посту на форумах сообщества разработчиков ,Я обновлю этот пост, если получу от них дополнительную информацию.

Ответы [ 2 ]

1 голос
/ 11 июня 2019

Если вы следуете инструкциям здесь для токенизации информации о кредитной карте с использованием файла javascript на https://js.appcenter.intuit.com/Content/IA/intuit.ipp.payments-0.0.3.js, обратите внимание на ответ от отношений с разработчиками:

... в этом javascript URL для токена: https://transaction -api-e2e.payments.intuit.net / v2 / tokens, что неверно. Это внутренняя среда тестирования, которую мы использовали. Токен, созданный в e2e, не будет работать в песочнице. Вот почему вы получаете токен неверной ошибки.

Для создания токена для среды песочницы вам необходимо использовать этот URL: https://sandbox.api.intuit.com/quickbooks/v4/payments/tokens

Я успешно запросил токен карты с этой конечной точки токенов через AJAX.

Кроме того, при использовании токена карты для отправки заряда обязательно отправляйте уникальный RequestID в заголовки.

Если служба получает другой запрос с тем же RequestID, вместо того, чтобы снова выполнить операцию или вернуть ошибку, служба отправляет тот же ответ, что и для исходного запроса . ( Что такое RequestId и его использование )

Вот почему я все еще получал ошибку «неверный токен» даже после переключения на правильную конечную точку.

0 голосов
/ 17 июня 2019

Я тестировал с Почтальоном (я понимаю, что проблема не в JS), а в API. Может быть, это поможет.

Карта токена:

  • Конечная точка: https://sandbox.api.intuit.com/quickbooks/v4/payments/tokens
  • Заголовок: Content-Type: application / json
  • Тело (необработанное) JSON (приложение / JSON):

    { "карта": { "name": "emulate = 0", «номер»: «4111111111111111», "expMonth": "02", "адрес": { "postalCode": "94086", "страна": "США", "регион": "CA", "streetAddress": "Road Street", "город": "Саннивейл" }, «expYear»: «2020», "cvc": "123" } }

Ответ:

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

Charge:

  • Конечная точка: https://sandbox.api.intuit.com/quickbooks/v4/payments/charges
  • Заголовок: Content-Type: application / json
  • идентификатор запроса: СЛУЧАЙНЫЙ НОМЕР
  • Авторизация: OAuth 2.0 токен доступа (59 мин)
  • Тело (необработанное) JSON (приложение / JSON):

    { «валюта»: «доллары США», «сумма»: «10,55», "контекст": { «мобильный»: «ложный», "isEcommerce": "правда" }, "токен": "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"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...