Интеграция API Альфабанк Эквайринг на сайт для приема платежей
Доброго времени друзья! На рынке банковских услуг РФ, Альфабанк занимает одно из лидирующих мест(а именно 4 место) по размеру активов, количеству отделений и конечно же клиентской базе. Но, за что клиенты действительно любят этот банк, это — передовые, инновационные решения, дающие им широкие возможности работы с денежными средствами, от мобильного приложения до «личного кабинета» предпринимателя, позволяющего работать с расчетным счетом онлайн. В том числе, одним из таких решений, является услуга интернет эквайринга, позволяющая предпринимателям принимать онлайн-платежи, картами МИР, Visa, MS, от пользователей на своем сайте интернет-магазина(портала, сервиса и т.д.). Далее я расскажу о технической стороне, об API эквайринга, с примерами.
Алгоритм подключения
Для подключение сайта к платежному шлюзу необходимо выполнить следующие шаги:
- Получить тестовые данные доступа к шлюзу и личному кабинету, логин и пароль, от сотрудника банка;
- Подготовить на сайте страницу, где будет размещаться форма для приема платежей, с вводом данных карты;
- Произвести техническую интеграцию сайта по API с платежным шлюзом, с использованием документации и примеров кода на PHP;
- Подготовить сайт в соответствии с документацией — требованиями банка к сайтам интернет-магазинам;
- Произвести тестирование приема платежей на сайте с использованием тестовых данных, в том числе данных карт оплаты;
- По результатам успешного тестирования связаться с поддержкой Альфабанка, прислав им скриншоты и описание тестов;
- После проверки и одобрения со стороны банка, получить боевые данные доступа к шлюзу и перевести работу системы в боевой режим.
Список доступных методов
- Регистрация заказа с предавторизацией
- Регистрация заказа
- Расширенный запрос состояния заказа
- Запрос статистики по платежам за период
- Запрос списка связок определённой банковской карты
- Запрос списка связок клиента
- Запрос состояния заказа
- Запрос проверки вовлеченности карты в 3DS
- Запрос проведения платежа по связке
- Запрос отмены оплаты заказа
- Запрос оплаты через внешнюю платёжную систему
- Запрос на регулярный платёж
- Запрос на оплату через Samsung Pay
- Запрос на оплату через Apple Pay
- Запрос на оплату через Google Pay
- Запрос изменения срока действия связки
- Запрос завершения оплаты заказа
- Запрос добавления дополнительных параметров к заказу
- Запрос деактивации связки
- Запрос возврата средств оплаты заказа
- Запрос активации связки
- Запрос получения QR кода по СБП
Примеры кода
<?php /** * ДАННЫЕ ДЛЯ ПОДКЛЮЧЕНИЯ К ПЛАТЕЖНОМУ ШЛЮЗУ * * USERNAME Логин магазина, полученный при подключении. * PASSWORD Пароль магазина, полученный при подключении. * GATEWAY_URL Адрес платежного шлюза. * RETURN_URL Адрес, на который надо перенаправить пользователя * в случае успешной оплаты. */ define('USERNAME', 'USERNAME'); define('PASSWORD', 'PASSWORD'); define('GATEWAY_URL', 'https://server/payment/rest/'); define('RETURN_URL', 'http://your.site/rest.php'); /** * ФУНКЦИЯ ДЛЯ ВЗАИМОДЕЙСТВИЯ С ПЛАТЕЖНЫМ ШЛЮЗОМ * * Для отправки POST запросов на платежный шлюз используется * стандартная библиотека cURL. * * ПАРАМЕТРЫ * method Метод из API. * data Массив данных. * * ОТВЕТ * response Ответ. */ function gateway($method, $data) { $curl = curl_init(); // Инициализируем запрос curl_setopt_array($curl, array( CURLOPT_URL => GATEWAY_URL.$method, // Полный адрес метода CURLOPT_RETURNTRANSFER => true, // Возвращать ответ CURLOPT_POST => true, // Метод POST CURLOPT_POSTFIELDS => http_build_query($data) // Данные в запросе )); $response = curl_exec($curl); // Выполняем запрос $response = json_decode($response, true); // Декодируем из JSON в массив curl_close($curl); // Закрываем соединение return $response; // Возвращаем ответ } /** * ВЫВОД ФОРМЫ НА ЭКРАН */ if ($_SERVER['REQUEST_METHOD'] == 'GET' && !isset($_GET['orderId'])) { echo ' <form method="post" action="/rest.php"> <label>Order number</label><br /> <input type="text" name="orderNumber" /><br /> <label>Amount</label><br /> <input type="text" name="amount" /><br /> <button type="submit">Submit</button> </form> '; } /** * ОБРАБОТКА ДАННЫХ ИЗ ФОРМЫ */ else if ($_SERVER['REQUEST_METHOD'] == 'POST') { $data = array( 'userName' => USERNAME, 'password' => PASSWORD, 'orderNumber' => urlencode($_POST['orderNumber']), 'amount' => urlencode($_POST['amount']), 'returnUrl' => RETURN_URL ); /** * ЗАПРОС РЕГИСТРАЦИИ ОДНОСТАДИЙНОГО ПЛАТЕЖА В ПЛАТЕЖНОМ ШЛЮЗЕ * register.do * * ПАРАМЕТРЫ * userName Логин магазина. * password Пароль магазина. * orderNumber Уникальный идентификатор заказа в магазине. * amount Сумма заказа в копейках. * returnUrl Адрес, на который надо перенаправить пользователя в случае успешной оплаты. * * ОТВЕТ * В случае ошибки: * errorCode Код ошибки. Список возможных значений приведен в таблице ниже. * errorMessage Описание ошибки. * * В случае успешной регистрации: * orderId Номер заказа в платежной системе. Уникален в пределах системы. * formUrl URL платежной формы, на который надо перенаправить браузер клиента. * * Код ошибки Описание * 0 Обработка запроса прошла без системных ошибок. * 1 Заказ с таким номером уже зарегистрирован в системе. * 3 Неизвестная (запрещенная) валюта. * 4 Отсутствует обязательный параметр запроса. * 5 Ошибка значения параметра запроса. * 7 Системная ошибка. */ $response = gateway('register.do', $data); /** * ЗАПРОС РЕГИСТРАЦИИ ДВУХСТАДИЙНОГО ПЛАТЕЖА В ПЛАТЕЖНОМ ШЛЮЗЕ * registerPreAuth.do * * Параметры и ответ точно такие же, как и в предыдущем методе. * Необходимо вызывать либо register.do, либо registerPreAuth.do. */ // $response = gateway('registerPreAuth.do', $data); if (isset($response['errorCode'])) { // В случае ошибки вывести ее echo 'Ошибка #' . $response['errorCode'] . ': ' . $response['errorMessage']; } else { // В случае успеха перенаправить пользователя на платежную форму header('Location: ' . $response['formUrl']); die(); } } /** * ОБРАБОТКА ДАННЫХ ПОСЛЕ ПЛАТЕЖНОЙ ФОРМЫ */ else if ($_SERVER['REQUEST_METHOD'] == 'GET' && isset($_GET['orderId'])){ $data = array( 'userName' => USERNAME, 'password' => PASSWORD, 'orderId' => $_GET['orderId'] ); /** * ЗАПРОС СОСТОЯНИЯ ЗАКАЗА * getOrderStatus.do * * ПАРАМЕТРЫ * userName Логин магазина. * password Пароль магазина. * orderId Номер заказа в платежной системе. Уникален в пределах системы. * * ОТВЕТ * ErrorCode Код ошибки. Список возможных значений приведен в таблице ниже. * OrderStatus По значению этого параметра определяется состояние заказа в платежной системе. * Список возможных значений приведен в таблице ниже. Отсутствует, если заказ не был найден. * * Код ошибки Описание * 0 Обработка запроса прошла без системных ошибок. * 2 Заказ отклонен по причине ошибки в реквизитах платежа. * 5 Доступ запрещён; * Пользователь должен сменить свой пароль; * Номер заказа не указан. * 6 Неизвестный номер заказа. * 7 Системная ошибка. * * Статус заказа Описание * 0 Заказ зарегистрирован, но не оплачен. * 1 Предавторизованная сумма захолдирована (для двухстадийных платежей). * 2 Проведена полная авторизация суммы заказа. * 3 Авторизация отменена. * 4 По транзакции была проведена операция возврата. * 5 Инициирована авторизация через ACS банка-эмитента. * 6 Авторизация отклонена. */ $response = gateway('getOrderStatus.do', $data); // Вывод кода ошибки и статус заказа echo ' <b>Error code:</b> ' . $response['ErrorCode'] . '<br /> <b>Order status:</b> ' . $response['OrderStatus'] . '<br /> '; } ?> |
Тестовые карты
В качестве Cardholder name (Имя владельца карты) указывайте от 2 слов в английской раскладке (например, IVANOV IVAN).
Для всех карт, вовлечённых в 3-D Secure (veres=y, pares=y или a) пароль на ACS: 12345678.
Карты с успешным результатом оплаты:
Номер карты | Срок действия | CVV2/CVC2 | Вовлеченность карт в 3-D Secure |
---|---|---|---|
4111 1111 1111 1111 | 2024/12 | 123 | veres=y, pares=y |
5100 0000 0000 0008 | 2024/12 | 123 | veres=y, pares=y |
6011 0000 0000 0004 | 2024/12 | 123 | veres=y, pares=y |
6390 0200 0000 000003 | 2024/12 | 123 (необязательный параметр) | veres=y, pares=a |
5555 5555 5555 5599 | 2024/12 | 123 | veres=n |
4444 0000 0000 1111 | 2024/12 | 123 | veres=n |
2200 0000 0000 0004 | 2024/12 | 123 | veres=n |
2200 0000 0000 0012 | 2024/12 | 123 | veres=y pares=n |
2200 0000 0000 0020 | 2024/12 | 123 | veres=u |
2200 0000 0000 0038 | 2024/12 | 123 | veres=y pares=u |
2200 0000 0000 0046 | 2024/12 | 123 | veres=y pares=a |
2200 0000 0000 0053 | 2024/12 | 123 | veres=y pares=y |
Карты, возвращающие ошибки
PAN | Exp date | CVV2 | 3-D Secure | Error message |
---|---|---|---|---|
5555 5555 5555 5557 | 2024/12 | 123 | veres=y, pares=u | Declined. PaRes status is U (-2011) |
4444 3333 2222 1111 | 2024/12 | 123 | veres=y, pares=u | Declined. PaRes status is U (-2011) |
4000 0000 0000 0002 | 2024/12 | 123 | veres=u | Declined. VeRes status is U (-2016) |
5555 5555 4444 4442 | 2024/12 | 123 | veres=u | Declined. VeRes status is U (-2016) |
4444 4444 4444 4422 | 2024/12 | 123 | N/A | Invalid message format (913) |
4444 4444 4444 4455 | 2024/12 | 123 | N/A | Card limitations exceeded (902) |
4444 4444 4444 3333 | 2024/12 | 123 | N/A | Limit exceeded (123) |
4444 4444 4444 6666 | 2024/12 | 123 | N/A | BLOCKEDBYLIMIT (-20010) |
4444 4444 1111 1111 | 2024/12 | 123 | N/A | Network refused transaction (5) |
4444 4444 9999 9999 | 2024/12 | 123 | N/A | TDSECCOMMERROR (151017) |
5432 5432 5432 5430 | 2022/12 | 123 | N/A | INSUFFICIENT_FUNDS (116) |
Заключение
Из описанного выше примера, вы можете видеть, что базовый функционал по интеграции приема платежей на сайте с использованием API эквайринга Альфабанка, реализуется достаточно просто, остается только произвести соответствующую доработку функционала на стороне сайта интернет-магазина. По работе со всеми доступными методами Альфабанк предоставляет достаточно обширную документацию, в случае возникновения сложностей всегда можно обратиться в их техническую поддержку по емаил. Также если вам нужна помощь или вы хотите заказать работу по интеграции, я всегда рад помочь вам, обращайтесь!
Похожие записи
Оставить комментарий
Full Stack
Senior, Architect
предложить оффер
- jQuery: как получить значение атрибута?
- PHP работа с изображением, класс SimpleImage
- Интеграция с API ОСАГО сайта sravni.ru
- Комментарии на PHP, Ajax, mySQL
- PHP: Категории бесконечного уровня вложенности.
- Nginx редирект на другой сервис с сохранением URL спросил (а) Сергей
- Исполнитель пропал, почему такое случается и понять с кем работать? спросил (а) Артем
- Можно ли WordPress считать универсальным движком? спросил (а) Андрей
- Что такое самописный скрипт или CMS? спросил (а) Антон
- Как при поиске в linux используя grep, добавить исключения? спросил (а) Алексей
- Обзор Insurance CMS — платформы для сайтов по страхованию к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Консольный скрипт(JavaScript) для автоматических заказов на OZON к записи
- Как создать Telegram-бота с авторизацией через сайт к записи
- PHP скрипт: каталог закладок на сайты к записи
- Валидация на PHP к записи
- Сколько зарабатывают в бизнесе на совместных покупках к записи
Archive
- +2025 (24)
- Апрель 2025 (5)
- Март 2025 (4)
- Февраль 2025 (9)
- Январь 2025 (6)
- +2024 (35)
- Декабрь 2024 (7)
- Ноябрь 2024 (13)
- Октябрь 2024 (8)
- Сентябрь 2024 (1)
- Август 2024 (5)
- Май 2024 (1)
- +2023 (27)
- Ноябрь 2023 (1)
- Октябрь 2023 (13)
- Сентябрь 2023 (10)
- Апрель 2023 (1)
- Март 2023 (1)
- Февраль 2023 (1)
- +2022 (21)
- Декабрь 2022 (11)
- Ноябрь 2022 (1)
- Май 2022 (2)
- Апрель 2022 (2)
- Март 2022 (3)
- Февраль 2022 (1)
- Январь 2022 (1)
- +2021 (17)
- Декабрь 2021 (5)
- Ноябрь 2021 (2)
- Июль 2021 (1)
- Июнь 2021 (2)
- Май 2021 (5)
- Апрель 2021 (1)
- Март 2021 (1)
- +2020 (20)
- Декабрь 2020 (6)
- Сентябрь 2020 (2)
- Август 2020 (1)
- Июль 2020 (2)
- Май 2020 (2)
- Апрель 2020 (2)
- Март 2020 (2)
- Февраль 2020 (1)
- Январь 2020 (2)
- +2019 (18)
- Декабрь 2019 (3)
- Ноябрь 2019 (2)
- Октябрь 2019 (2)
- Сентябрь 2019 (1)
- Август 2019 (2)
- Июль 2019 (1)
- Июнь 2019 (1)
- Апрель 2019 (2)
- Март 2019 (1)
- Февраль 2019 (3)
- +2018 (44)
- Декабрь 2018 (4)
- Ноябрь 2018 (7)
- Октябрь 2018 (8)
- Сентябрь 2018 (1)
- Август 2018 (4)
- Июль 2018 (5)
- Май 2018 (3)
- Апрель 2018 (7)
- Март 2018 (1)
- Февраль 2018 (2)
- Январь 2018 (2)
- +2017 (19)
- Декабрь 2017 (2)
- Ноябрь 2017 (1)
- Октябрь 2017 (1)
- Сентябрь 2017 (2)
- Июль 2017 (1)
- Июнь 2017 (1)
- Май 2017 (2)
- Апрель 2017 (3)
- Март 2017 (2)
- Февраль 2017 (1)
- Январь 2017 (3)
- +2016 (36)
- Декабрь 2016 (3)
- Ноябрь 2016 (3)
- Октябрь 2016 (2)
- Сентябрь 2016 (3)
- Август 2016 (7)
- Июнь 2016 (3)
- Май 2016 (3)
- Апрель 2016 (3)
- Февраль 2016 (1)
- Январь 2016 (8)
- +2015 (36)
- Ноябрь 2015 (5)
- Октябрь 2015 (4)
- Сентябрь 2015 (1)
- Август 2015 (8)
- Июнь 2015 (1)
- Май 2015 (4)
- Апрель 2015 (8)
- Март 2015 (3)
- Февраль 2015 (2)
- +2014 (26)
- Ноябрь 2014 (2)
- Октябрь 2014 (5)
- Сентябрь 2014 (6)
- Июль 2014 (1)
- Июнь 2014 (2)
- Май 2014 (3)
- Апрель 2014 (6)
- Февраль 2014 (1)
- +2013 (27)
- Декабрь 2013 (2)
- Ноябрь 2013 (1)
- Октябрь 2013 (1)
- Август 2013 (1)
- Июль 2013 (3)
- Июнь 2013 (10)
- Май 2013 (1)
- Апрель 2013 (2)
- Февраль 2013 (3)
- Январь 2013 (3)
- +2012 (41)
- Декабрь 2012 (2)
- Ноябрь 2012 (3)
- Октябрь 2012 (7)
- Сентябрь 2012 (2)
- Август 2012 (1)
- Июль 2012 (3)
- Июнь 2012 (2)
- Май 2012 (6)
- Апрель 2012 (2)
- Март 2012 (7)
- Февраль 2012 (5)
- Январь 2012 (1)
- +2011 (57)
- Декабрь 2011 (6)
- Ноябрь 2011 (2)
- Октябрь 2011 (3)
- Сентябрь 2011 (5)
- Август 2011 (4)
- Июль 2011 (3)
- Июнь 2011 (3)
- Май 2011 (3)
- Апрель 2011 (4)
- Март 2011 (10)
- Февраль 2011 (5)
- Январь 2011 (9)
- +2010 (43)
- Декабрь 2010 (7)
- Ноябрь 2010 (21)
- Октябрь 2010 (14)
- Сентябрь 2010 (1)
Свежие записи
- Проверка CORS онлайн 04.04.2025
- Декодер JWT онлайн 03.04.2025
- Конвертер RGB в HEX (и обратно) онлайн 02.04.2025
- Конвертер Markdown в HTML онлайн 02.04.2025
- Создание сертификата Let’s Encrypt для домена и всех поддоменов 01.04.2025