Pull to refresh

authorize.net — подключение и работа

Reading time 5 min
Views 6.7K
Довелось мне делать интернет магазин, в котором оплату нужно было проводить кредитными картами. И всё не беда, если бы заказчика устроил PayPal.Точнее тогда я об этом ещё не знал. Заказчик имел мерчант-аккаунт на authorize.net. В ходе поисков нормальной системы оплаты авторайз был мною отброшен по причине убогости сайта. Сайт оставляет ощущение, что проект давно заброшен, и никто им не занимается. Ну да ладно. Клиент всегда прав. Итак.

Что делает в первую очередь разработчик столкнувшись с задачей стандартной, но доселе им не реализованной? Правильно! Идёт в интернет и ищет готовые решения. Не исключено что это я плохой пользователь Гугла. Но, тем не менее — все готовые реализации были не более чем копиями sample кода взятого на сайте конторы. Ни тебе комментариев в коде, ни тебе сопроводительной записки.

Следующий шаг: курениечтение мануала на сайте разработчика. Единственное что помог сделать мануал — понять, что на самом деле лишнее в сэмпл коде. Далее я предлагаю свои советы по работе с данным сервисом. Это частично и перевод руководства, и личный опыт.


Для работы нужен либо merchant аккаунт, либо тест. Получить тестовый можно на сайте авторайз.нет

Следует отметить, что приходят эти данные в двух экземплярах: Card Not Present и Card Present. Первый это вариант когда продавец не получает в руки карточку для проверки введённых данных пользователем. Второй — наоборот. Нас интересует первый.

Есть несколько вариантов интеграции сервиса к себе на сайт.

1) Advanced Integration Method (AIM). Позволяет держать у себя форму, заполняемую покупателем и отправлять данные по SSL на сервер провайдера услуги (в нашем случае — Authorize.net)

2) Server Integration Method (SIM). Практически то-же самое только вам предоставят ещё и html форму.

Как выбрать API?

шаг 1: выбор типа работы. У нас это Card Not Present.

шаг 2: есть ли на вашем хосте SSL? если есть — можно использовать AIM, если нет — нужно использовать SIM.

шаг 3: нужно ли вам что бы форма указывала на ваш домен? если да — нужно использовать AIM, если нет — можно SIM

шаг 4: нужно ли запоминать сессию пользователя в процессе оплаты. Да — только AIM, нет — можно SIM

В моём случае походил только вариант AIM. Поэтому о нём и поговорим. К слову сказать — SIM практически ни чем не отличается.
1) Массив параметров для проведения транзакции.

Что нам нужно? Merchant или test аккаунт.

$auth_net_login_id и $autn_net_tran_key — логин и ключ транзакции.

приходят они на почту в таком виде:
API Login: 6zz6m5N4Et
Transaction Key: 9V9wUv6Yd92t27t5
это тестовый аккаунт, так что не нужно сразу потирать ручки
$authnet_values = array
(
“x_login” => $auth_net_login_id,
“x_version” => “3.1″,
“x_delim_char” => “|”,
“x_delim_data” => “TRUE”,
“x_url” => “FALSE”,
“x_type” => “AUTH_CAPTURE”,
“x_method” => “CC”,
“x_tran_key” => $auth_net_tran_key,
“x_relay_response” => “FALSE”,
“x_card_num” => “4242424242424242″,
“x_exp_date” => “1209″,
“x_description” => “Recycled Toner Cartridges”,
“x_amount” => “12.23″,
“x_first_name” => “Charles D.”,
“x_last_name” => “Gaulle”,
“x_address” => “342 N. Main Street #150″,
“x_city” => “Ft. Worth”,
“x_state” => “TX”,
“x_zip” => “12345″,
“CustomerBirthMonth” => “Customer Birth Month: 12″,
“CustomerBirthDay” => “Customer Birth Day: 1″,
“CustomerBirthYear” => “Customer Birth Year: 1959″,
“SpecialCode” => “Promotion: Spring Sale”,
);

Этот массив взят из семпл кода. Давайте разберёмся, что же это всё значит и нужно ли оно нам на самом деле.

Обязательные параметры:

x_login — API Login ID.

x_tran_key — Transaction Key

x_type — тип транзакции.
Типы транзакций:

AUTH_CAPTURE — авторизация и оплата. Всё в одном флаконе. Проверка карточки и если всё хорошо — проводим сразу и оплату.

AUTH_ONLY — только авторизация. Проверка карты на валидность. Из ответа нужно сохранить Transaction ID

PRIOR_AUTH_CAPTURE — завершает транзакцию, которая успешно прошла авторизацию. Для этого и нужен Transaction ID. Требования: оригинальная транзакция была проведена не позднее 30 дней; получен валидный tansaction Id; оригинальная транзакция не проведена, не истекла, не было ошибки: сумма меньше или равна сумме из оригинальной транзакции. Оригинальная транзакция — проведённая методом AUTH_ONLY, в результате чего был получен Transaction ID.

CAPTURE_ONLY — завершает транзакцию, которая не была послана на шлюз или требует голосового подтверждения. По сути — ручное подтверждение в merchant интерфейсе. То есть продавец должен вручную на сайте авторайза подтвердить эту транзакцию. Добавляется обязательный параметр:

x_auth_code=Authorization Code

CREDIT — используется для возврата уже проведённой транзакции. Дополнительные параметры:

x_trans_id=Transaction ID
x_card_num=полный номер карты или последние 4 цифры
Требования: транзакция была успешно проведена и был получен Transaction ID; сумма для возврата меньше или равна оплаченной сумме; если возврат делался частями — сумма меньше или равна оплаченной; возврат проводится не позднее 120 дней.

VOID — для отмены отправленной транзакции, что бы избежать её обработки. Дополнительный параметр: x_trans_id=Transaction ID

x_amount — сумма перевода с двумя знаками после точки. Например: 8.95 или 10.00. Длина до 15 символов.

x_card_num — от 13 до 16 цифр — номер карты без пробелов. Если x_type=CREDIT — только последние 4 цифры.

x_exp_date — дата истечения карты. Форматы: MMYY, MM/YY, MM-YY, MMYYYY, MM/YYYY, MM-YYYY

x_trans_id — transaction ID. Нужен только если x_type=CREDIT, PRIOR_AUTH_CAPTURE, или VOID

x_auth_code — 6 символов. Код авторизации оригинальной транзакции не проведённой на шлюзе. Нужен только если x_type=CAPTURE_ONLY

Остальные парметры в принципе понятны и так. О них при желании можно почитать в руководстве.

Опишу только приведённые в примере.

x_version — опционально но очень рекоммендовано. Версия транзакции покупателя. Формат: 3.1 Версия указывает на список полей, которые продавец получит в ответе сервера.

x_delim_char — опционально. Символ которым будут разделятся данные в строке ответа.

x_delim_data — требуется для AIM транзакций. Указывается для получени разграниченного ответа.

x_url — в руководстве не описан. Но насколько я понял — это урл на который будет сделан редирект покупателя просле проведения транзакции.

x_method — опционально. Метод оплаты: CC(credit card) или ECHECK(electronic check). Формат: CC, ECHECK.

x_relay_response — в руководстве не описан. Оо

x_description — опционально. Описание транзакции. До 255 символов.

x_first_name, x_last_name, x_address, x_city, x_state, x_zip, CustomerBirthMonth, CustomerBirthDay, CustomerBirthYear — данные покупателя. Опционально.

SpecialCode — в руководстве не описан.
2) Подготовка данных к отправке.
fields = “”;
foreach( $authnet_values as $key => $value ) $fields .= “$key=”. urlencode( $value ). “&”;

3) Отправка данных
$ch = curl_init(”https://test.authorize.net/gateway/transact.dll”);
//верхняя строка для тест аккаунтов, нижняя для merchant
// $ch = curl_init(”https://secure.authorize.net/gateway/transact.dll”);
curl_setopt($ch, CURLOPT_HEADER, 0); // установить на 0 что бы убрать header info из ответа
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); // возвращает ответ если 1
curl_setopt($ch, CURLOPT_POSTFIELDS, rtrim( $fields, “& ” )); // использование HTTP POST to для отправки данных
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); // раскомментировать, если не получаете вообще никакого ответа от сервера.
$resp = curl_exec($ch); //execute post and get results
curl_close ($ch);

4) В сэмпл коде сделан вывод всех параметров приходящих в ответе сервера. Я сократил этот код для вывода нужных данных.
for($j=1; $j <= $h; $j++){
$p = strpos($text, “|”);
$p++;
$pstr = substr($text, 0, $p);

//подготавливает текст и возвращает пары имя->значение
$pstr_trimmed = substr($pstr, 0, -1); // удаляет “|” в конце строки.

if($pstr_trimmed==”"){
$pstr_trimmed=”NO VALUE RETURNED”;
}

if ($j == 1) {
$fval=”";
if($pstr_trimmed==”1″){
$fval=”Approved”;
}elseif($pstr_trimmed==”2″){
$fval=”Declined”;
}elseif($pstr_trimmed==”3″){
$fval=”Error”;
}
}elseif ($j == 7){
// transaction ID
$trans_id = $pstr_trimmed;
}
// убрать часть, которую уже определили, и работать с оставшейся строкой.
$text = substr($text, $p);
}

Вот собственно и всё. Это так сказать минимум необходимый для проведения успешной транзакции. Надеюсь эта статья кому-то пригодится
Tags:
Hubs:
+11
Comments 6
Comments Comments 6

Articles