2Checkout OmniPay — Сбой авторизации

При использовании 2Checkout я получаю ответ «Сбой авторизации» API OmniPay.

Я успешно подключил Stripe к OmniPay, и тогда я решил подключить 2Checkout. Когда вы идете, чтобы сделать это, начальный пакет на Github предупреждает вас, чтобы получить более новая версия от пользователя collizo4sky. Итак, я сделал, а затем заставил его работать немного без фатальной ошибки.

В своей веб-форме я правильно генерирую токен, и журналы песочницы в 2Checkout подтверждают это. Затем я использую этот код в OmniPay, чтобы попытаться зарядить карту:

use Omnipay\Omnipay;
$sMerchantTransID = rand(11111111,99999999);
$oGateway = Omnipay::create('TwoCheckoutPlus_Token');
$oGateway->setPrivateKey($config->TWOCHECKOUT_PRIVATE_KEY);
$oGateway->setAccountNumber($config->TWOCHECKOUT_SELLERID);
$oGateway->setTestMode(true);
$oResponse = $oGateway->purchase(array(
'amount' => $sPrice,
'currency' => 'USD',
'token' => $sToken,
'transactionId' => $sMerchantTransID
))->send();
if (!$oResponse->isSuccessful()) {
die('ERROR: ' . $oResponse->getMessage());
}

Однако сообщение возвращается с ошибкой авторизации. Итак, я пошел в исходный код API OmniPay для пакета collizo4sky по этому пути …

omnipay/vendor/collizo4sky/omnipay-2checkout/src/Message/TokenPurchaseRequest.php

…и добавил некоторую отладку файла журнала метода класса sendData (). Вот что он ответил, и обратите внимание, что я изменил некоторые значения по очевидным причинам конфиденциальности:

array (
'sellerId' => '901414261',
'privateKey' => 'EAEC8615-4C48-4D98-B7E5-4B6D8865E1BA',
'merchantOrderId' => 65639323,
'token' => 'FDI1ZTM3N2UtY2VkZS00NTM1LWE5MTctYzI4MjA5YWI4Yjhm',
'currency' => 'USD',
'total' => '519.00',
)

Да, идентификатор продавца и privateKey пришли из учетной записи «песочницы», как и публикуемый ключ, когда я сначала сгенерировал токен в веб-форме.

Таким образом, в любом случае, когда это передается в URL-адрес изолированной программной среды, он возвращает следующий ответ:

HTTP/1.1 400 Bad Request
Server: Apache-Coyote/1.1
Cache-Control: no-cache, no-store, must-revalidate
Date: Fri, 22 Apr 2016 03:30:37 GMT
Expires: 0
Pragma: no-cache
Content-Type: application/json;charset=UTF-8
Transfer-Encoding: chunked

{"validationErrors":null,"response":null,"exception":{"errorMsg":"Authorization Failed","httpStatus":"400","exception":false,"errorCode":"600"}}

Что я делаю неправильно?

РЕДАКТИРОВАТЬ:

Затем я попытался с помощью PHP-библиотека, поддерживаемая 2Checkout что они предоставляют. Я сделал точно такую ​​же транзакцию, и она тоже возвращает «Авторизация не удалась».

Мне интересно, если это настройка для моей учетной записи, хотя я использую песочницу? Я имею в виду, я еще не был одобрен в производстве, и до этого пытался запустить песочницу, чтобы я мог сделать демо.

Я также восстановил ключи API в песочнице и попробовал снова, и это не удалось.

Я использовал кредитную карту, которую они предоставили в песочнице под ключами API песочницы, и я использовал CVV 123 с 12/18 в качестве даты истечения срока действия. Затем я подумал, что может потребоваться год из 4 цифр, поэтому я обновил его и повторил попытку, и это тоже не удалось с той же непротиворечивой ошибкой «Ошибка авторизации».

Когда я проверяю, что означает «Ошибка авторизации», выясняется, что проблема заключается в кредитной карте.

Мое инстинктивное чувство до сих пор говорит мне, что я делаю все правильно и что проблема заключается в флаге на моем счете. Я имею в виду, если моя обычная учетная запись еще не утверждена, песочница все еще будет работать?

0

Решение

Единственный способ выполнить транзакцию — вручную установить для демо-режима значение «Выкл.» В настройках «песочницы» в разделе «Учетная запись»> «Управление сайтом», а затем ввести хотя бы платежный адрес. Я бы хотел узнать, как не требовать адрес для выставления счетов (например, для товаров с цифровой загрузкой), но пока не нашел способа сделать это, или если это вообще возможно.

Обратите внимание, что если вы установили «Демонстрационный режим» на «Вкл.» И не отправляете адрес для выставления счета, транзакция пройдет нормально, но затем она не будет отображаться как продажа на вкладке «Продажи». Это не очень полезно, потому что, когда вы начинаете жить, вы хотите реальную продажу, которую вы можете возместить, и в демонстрационном режиме не имитируется фактический заряд, а просто авторизация этой карты. (По крайней мере, это то, что я понял.)

На transactionId Параметр, я взял ярлык для целей здесь. Пожалуйста, сделайте это уникальным номером в вашей системе (например, какое-то число, сгенерированное за время UNIX), иначе вы можете столкнуться с потенциальным столкновением.

Я также попытался закомментировать только электронную почту, или телефон, или оба, и это не сработало — вы получите «Ошибка параметра». Затем я попытался отправить только эти поля в card: billingName, email, billingPostcode, а также billingCountry — и это не удалось с «Ошибка параметра» тоже. Итак, я добавил billingState — «Ошибка параметра». Затем добавил billingCity — «Ошибка параметра». Таким образом, для того, чтобы транзакция прошла, если кто-то не покажет мне некоторые настройки или метод переопределения, требуется платежный адрес, а также, к моему удивлению, должен быть указан адрес электронной почты и телефон. Я уверен, что для некоторых людей это просто показательный пример, например, для тех, кто пытается продавать нематериальные товары, такие как цифровые загрузки. Обратите внимание, что я попробовал официальный 2Checkout созданный PHP API и снова попробовал все эти тесты с этим, и снова получил «Ошибка параметра», если не использовался полный адрес для выставления счетов (включая электронную почту и телефон). Я уверен, что это требование полного адреса для выставления счетов, а также электронной почты и телефона для выставления счетов будет обломом для некоторых предприятий.

РЕДАКТИРОВАТЬ: Этот ответ, если я угадаю правильно, это официальный ответ от кого-то, кто работает на 2Checkout, сам? Это действительно выглядит так. Во всяком случае, он говорит, что адрес для выставления счета обязательно требуется, потому что, как он заявляет: «Это требование наших банковских партнеров для проверки адреса».

EDIT2: Вам нужно будет поэкспериментировать с реальной живой транзакцией, но я обнаружил, по крайней мере, в режиме песочницы, что, если я передам пустую строку для phoneNumber поле на официальная PHP-библиотека 2Checkout, или billingPhone в API OmniPay транзакция проходит нормально. Они просто хотят видеть этот параметр, хотя он может быть пустым. Но не поверьте мне на слово — протестируйте его на транзакции в реальном времени (и верните себе деньги), чтобы подтвердить, поскольку я делал это только в песочнице. Этот ответ Кажется, официально подтвердил от 2Checkout, что они позволяют это.

Фиксированный код:

use Omnipay\Omnipay;
$sMerchantTransID = rand(11111111,99999999);
$oGateway = Omnipay::create('TwoCheckoutPlus_Token');
$oGateway->setPrivateKey($config->TWOCHECKOUT_PRIVATE_KEY);
$oGateway->setAccountNumber($config->TWOCHECKOUT_SELLERID);
$oGateway->setTestMode(true); // turns on Sandbox access
$oResponse = $oGateway->purchase(array(
'amount' => $sPrice,
'currency' => 'USD',
'token' => $sToken,
'transactionId' => $sMerchantTransID,
'card' => array(
'billingName' => $sName,
'billingAddress1' => $sStreet1,
'billingAddress2' => $sStreet2,
'billingCity' => $sCity,
'billingState' => $sState,
'billingPostcode' => $sZip,
'billingCountry' => $sCountry,
'email' => $sEmail,
'billingPhone' => $sPhone
)
))->send();
if (!$oResponse->isSuccessful()) {
die('ERROR: ' . $oResponse->getMessage());
}
3

Другие решения

Других решений пока нет …