Довелося мені робити інтернет магазин, в якому оплату потрібно було проводити кредитними картками. І все не біда, якби замовника влаштував 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);
}
Ось власне і все. Це так би мовити мінімум необхідний для проведення успішної транзакції. Сподіваюся ця стаття комусь стане в нагоді