2Checkout OmniPay – сбой авторизации

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

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

В моей веб-форме я генерирую маркер правильно, и журналы sandbox в 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', ) 

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

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

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

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

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

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

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

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

EDIT: Этот ответ , если я правильно понимаю, является официальным ответом от кого-то, кто работает в 2Checkout, сам? Конечно, это так. Во всяком случае, он говорит, что платежный адрес определенно необходим, поскольку, как он утверждает, «это требование наших банковских партнеров для проверки адреса».

EDIT2: вам нужно поэкспериментировать с реальной транзакцией в реальном времени, но я обнаружил, по крайней мере, в режиме песочницы, что если я phoneNumber пустую строку для поля номер 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()); }