РАЗРАБОТКА НА БИТРИКС

Обработка callback от Cбера как дополнительный инструмент подтверждения оплаты

Подписывайтесь на канал для bitrix-разработчиков в Telegram!
В модулях эквайринга от Сбера происходит редирект на страницу банка, на которой происходит оплата. После оформления оплаты, Сбер отправляет клиента на страницу удачной или неудачной оплаты. На странице удачной оплаты происходит обработка оплаты на стороне сайта и обновление статусов оплаты. Но если клиент не дождался, пока Сбер перекинет его на страницу удачной оплаты, то банк получит деньги, а сайт об оплате не узнает.

Чтобы избежать такой ситуации, у Сбера есть функционал callback, который обращается к указанной странице на сайте в фоновом режиме, независимо от клиента. И если callback не получил от страницы статус 200, то он будет пытаться сделать это еще шесть раз с интервалом 10 минут.

Описание задачи

Нужно сделать страницу, которая будет получать данные от Cбера об оплате заказа. При благополучной обработке данных, страница должна вернуть код 200, иначе - 500.

Решение

Callback-уведомление обращается к сайту через указанный адрес и передает параметры оплаты через get-запрос вида https://myshop.ru/callback/?mdOrder=1234567890-098776-234-522&orderNumber=0987&operation=deposited&status=0

Передаваемые параметры

Код обработчика

<?
require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");


file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/callback/callback.log", PHP_EOL . 'log start - '. date("d/m/Y") .' в '. date("H:i:s"). PHP_EOL, FILE_APPEND);
foreach ($_GET as $key => $value) {
    file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/callback/callback.log", $key . ' - ' . $value . PHP_EOL, FILE_APPEND);
}
$status =  500;

if($_GET['status'] == 1) {
    $order_id = explode('_',$_GET['orderNumber'])[0];
    $arOrder = CSaleOrder::GetByID($order_id);
    $sberNumber = $_GET['mdOrder'];
    $sberOperation = $_GET['operation'];
    $arOrderFields = array('NUM_SBER' => $sberNumber);

    if ($sberOperation == 'approved' || $sberOperation == 'deposited') {
        // Статус заказа
        CSaleOrder::StatusOrder($order_id, 'P');
        CSaleOrder::PayOrder($order_id, "Y", true, true);
        CSaleOrder::DeliverOrder($order_id, "Y");
        AddOrderProperty(21, $sberNumber, $order_id);
        AddOrderProperty(23, strtoupper($sberOperation), $order_id);
        CSaleOrder::Update($order_id, $arOrderFields);
        file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/callback/callback.log", PHP_EOL . 'Заказ '.$order_id . ' - ' . $sberOperation . PHP_EOL, FILE_APPEND);

    }
    $status = 200;
}

file_put_contents($_SERVER["DOCUMENT_ROOT"] . "/callback/callback.log", PHP_EOL . 'log finish' . PHP_EOL, FILE_APPEND);

http_response_code($status);
Если оплата прошла успешно, то полученные в запросе данные добавляем в заказ и меняем статус, возвращаемый страницей на 200 с исходных 500.

Организация тестирования обработчика

Для тестирования обработчика запрашиваем по email у ТП Сбера активировать callback для тестовой среды эквайринга. При подключении эквайринга есть тестовая среда - тестовые логин и пароли, и боевая - с боевыми логинами и паролями для доступа модуля оплаты к API Сбера, при которой происходит обработка настоящих платежей с настоящих карт.
ТП активирует callback для тестовой среды, но для страницы обработчика с боевым доменом. Для других доменов они ничего настроить не могут.

На песочнице в настройках обработчика платежей указываем логины и пароли от тестовой среды.

На боевом сайте делаем редирект со страницы, на которую приходит callback, уведомление на соответствующею страницу на песочнице.

Теперь при тестировании оплаты на песочнице с помощью тестовых карт https://securepayments.sberbank.ru/wiki/doku.php/test_cards происходит callback-обращение к боевому сайту, которое попадает на тестовый сайт, где и обрабатывается.

Перенос на боевой сайт

Для переноса на боевой сайт, размещаем страницу с обработчиком на боевом домене, убираем редирект с этой страницы на песочницу и запрашиваем у ТП Сбербанка активировать callback для боевой среды. После этого можно провести оплату на боевом сайте и посмотреть логи обработчика callback.

Результат

Клиенту не обязательно дожидаться возврата на сайт после оплаты, оплаты не теряются и информация о них доходит до сайта.

Даже использование готовых модулей оплаты от Сбера не гарантирует изменения статуса оплаты после получения денег Сбером. Инструмент callback-уведомлений решает эту проблему.
Подписывайтесь на канал для bitrix-разработчиков в Telegram!

Рекомендованные статьи