Я интегрирую 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.
Интерпретация ошибки
Я предполагаю, что ошибка "токен неверен" относится к моему токену карты, а не к моемутокен аутентификации приложения.Я основываю это предположение на двух вещах:
При изменении токена аутентификации приложения я получаю другую ошибку:
{
"code": "AuthenticationFailed",
"type": "INPUT",
"message": null,
"detail": null,
"moreInfo": null
}
Служба 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 в дополнение к посту на форумах сообщества разработчиков ,Я обновлю этот пост, если получу от них дополнительную информацию.