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

Я получаю ответ "Ошибка авторизации" от 2Checkout при использовании OmniPay API.

Я успешно подключил 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 цифр, поэтому я обновил его и повторил попытку, и это тоже не удалось с той же непротиворечивой ошибкой "Ошибка авторизации".

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

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

1 ответ

Решение

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

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

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

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

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

РЕДАКТИРОВАТЬ 2: Вам нужно будет поэкспериментировать с реальной транзакцией, но я обнаружил, по крайней мере, в режиме песочницы, что, если я передам пустую строку для 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());
}
Другие вопросы по тегам