PHP

Подключение к платежной системе Сбербанка

После регистрации в системе эквайринга Сбербанка и получив доступ к тестовой среде, можно приступить к интеграции с интернет-магазином. Рассмотрим примеры основных обращений к REST API Сбербанка с помощью PHP CURL.

1

Одностадийная оплата

При данном методе деньги клиента списываются сразу. Клиент добавляет товары в корзину, оформляет заказ, на этапе оплаты нужно сделать запрос в платежный шлюз на register.do
Описание одностадийной оплаты на developer.sberbank.ru

$order_id = 123;
$sum  = 1000;

$vars = array();
$vars['userName'] = 'логин';
$vars['password'] = 'пароль';

// ID заказа в магазине.
$vars['orderNumber'] = $order_id;
    
// Сумма заказа в копейках.
$vars['amount'] = $sum * 100;
    
// URL куда клиент вернется в случае успешной оплаты.
$vars['returnUrl'] = 'http://example.com/success/';
    
// URL куда клиент вернется в случае ошибки.
$vars['failUrl'] = 'http://example.com/error/';

// Описание заказа, не более 24 символов, запрещены % + \r \n
$vars['description'] = 'Заказ №' . $order_id . ' на example.com';

$ch = curl_init('https://3dsec.sberbank.ru/payment/rest/register.do?' . http_build_query($vars));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

Ответ будет в JSON, в котором содержатся ID платежа в банке и URL куда отправить клиента для оплаты.

{"orderId":"70906e55-7114-41d6-8332-4609dc6590f4","formUrl":"https://3dsec.sberbank.ru/payment/merchants/test/payment_ru.html?mdOrder=70906e55-7114-41d6-8332-4609dc6590f4"}

Далее обработаем ответ, и перенаправим клиента:

$res = json_decode($res, JSON_OBJECT_AS_ARRAY);
if (empty($res['orderId'])){
    // Возникла ошибка:
    echo $res['errorMessage'];                        
} else {
    // Успех:
    // Тут нужно сохранить ID платежа в своей БД - $res['orderId']

    // Перенаправление клиента на страницу оплаты.
    header('Location: ' . $res['formUrl'], true);
    
    // Или на JS
    echo '<script>document.location.href = "' . $res['formUrl'] . '"</script>';
}

В случае успешной оплаты, клиент вернется на страницу returnUrl. В адрес добавятся ID платежа полученный ранее:

http://example.com/success/?orderId=70906e55-7114-41d6-8332-4609dc6590f4&lang=ru

Также будет и в случаи ошибки (failUrl):

http://example.com/error/?orderId=70906e55-7114-41d6-8332-4609dc6590f4&lang=ru

2

Двухстадийная оплата

В этом методе деньги клиента холдируются (замораживаются), после этого магазин должен подтвердить платеж или его отменить. Описание на developer.sberbank.ru

Регистрация платежа отличается только методом registerPreAuth.do

$order_id = 123;
$sum  = 1000;

$vars = array();
$vars['userName'] = 'логин';
$vars['password'] = 'пароль';

// ID заказа в магазине.
$vars['orderNumber'] = $order_id;
    
// Сумма заказа в копейках.
$vars['amount'] = $sum * 100;
    
// URL куда клиент вернется в случае успешной оплаты.
$vars['returnUrl'] = 'http://example.com/success/';
    
// URL куда клиент вернется в случае ошибки.
$vars['failUrl'] = 'http://example.com/error/';

// Описание заказа, не более 24 символов, запрещены % + \r \n
$vars['description'] = 'Заказ №' . $order_id . ' на example.com';

$ch = curl_init('https://3dsec.sberbank.ru/payment/rest/registerPreAuth.do?' . http_build_query($vars));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, JSON_OBJECT_AS_ARRAY);
if (empty($res['orderId'])){
    // Возникла ошибка:
    echo $res['errorMessage'];                        
} else {
    // Успех:
    // Тут нужно сохранить ID платежа в своей БД - $res['orderId']

    // Перенаправление клиента на страницу оплаты.
    header('Location: ' . $res['formUrl'], true);

    // Или на JS
    echo '<script>document.location.href = "' . $res['formUrl'] . '"</script>';
}

После оплаты платеж подтверждается методом deposit.do

$vars = array();
$vars['userName'] = 'логин';
$vars['password'] = 'пароль';

// Номер заказа в платежной системе.
$vars['orderId']  = '70906e55-7114-41d6-8332-4609dc6590f4';

// Сумма платежа в копейках, Если указать 0, то завершение произойдет на всю сумму.
$vars['amount'] = $sum * 100;

$ch = curl_init('https://3dsec.sberbank.ru/payment/rest/deposit.do?' . http_build_query($vars));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, JSON_OBJECT_AS_ARRAY);
if (!empty($res['errorCode'])) {
    echo $res['errorMessage'];
} else {
    echo 'Оплата завершена';
}
3

Информация о платеже

Методы getOrderStatus.do и getOrderStatusExtended.do возвращают данные о платеже.

$vars = array();
$vars['userName'] = 'логин';
$vars['password'] = 'пароль';
$vars['orderId'] = '70906e55-7114-41d6-8332-4609dc6590f4';

$ch = curl_init('https://3dsec.sberbank.ru/payment/rest/getOrderStatusExtended.do?' . http_build_query($vars));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, JSON_OBJECT_AS_ARRAY);
print_r($res);
Показать результат
Array
(
    [errorCode] => 0
    [errorMessage] => Успешно
    [orderNumber] => 123
    [orderStatus] => 1
    [actionCode] => 0
    [actionCodeDescription] => 
    [amount] => 1000
    [currency] => 643
    [date] => 1540207733683
    [orderDescription] => Заказ №123 на example.com
    [ip] => 192.168.27.138
    [merchantOrderParams] => Array()
    [attributes] => Array(
        [0] => Array(
            [name] => mdOrder
            [value] => 70906e55-7114-41d6-8332-4609dc6590f4
        )
    )
    [cardAuthInfo] => Array(
        [expiration] => 201912
        [cardholderName] => CARDHOLDER NAME
        [approvalCode] => 123456
        [pan] => 411111XXXXXX1111
    )
    [authDateTime] => 1540207881419
    [terminalId] => 123456
    [authRefNum] => 111111111111
    [paymentAmountInfo] => Array(
        [paymentState] => APPROVED
        [approvedAmount] => 1000
        [depositedAmount] => 0
        [refundedAmount] => 0
    )
    [bankInfo] => Array(
        [bankName] => TEST CARD
        [bankCountryCode] => RU
        [bankCountryName] => Россия
    )
)

Выведем информацию на странице:

<?php
$orderStatus = array(
    0 => 'Заказ зарегистрирован, но не оплачен',
    1 => 'Предавторизованная сумма захолдирована (для двухстадийных платежей)',
    2 => 'Проведена полная авторизация суммы заказа',
    3 => 'Авторизация отменена',
    4 => 'По транзакции была проведена операция возврата',
    5 => 'Инициирована авторизация через ACS банка-эмитента',
    6 => 'Авторизация отклонена',
);
?>

Статус: 
<?php echo $orderStatus[$res['orderStatus']]; ?>

Сумма регистрации: 
<?php echo $res['paymentAmountInfo']['approvedAmount'] / 100; ?> р.

Сумма списания: 
<?php echo $res['paymentAmountInfo']['depositedAmount'] / 100; ?> р.

Сумма возврата: 
<?php echo $res['paymentAmountInfo']['refundedAmount'] / 100; ?> р.

Дата: 
<?php echo date('d.m.Y H:i:s', $res['date'] / 1000); ?>

Карта: 
<?php echo $res['cardAuthInfo']['pan']; ?>, 
<?php echo $res['cardAuthInfo']['expiration']; ?>, 
<?php echo $res['cardAuthInfo']['cardholderName']; ?>

Банк: 
<?php echo $res['bankInfo']['bankName']; ?>, 
<?php echo $res['bankInfo']['bankCountryName']; ?>
4

Отмена оплаты

Для запроса отмены оплаты заказа используется reverse.do. Функция отмены доступна в течение ограниченного времени после оплаты, точные сроки необходимо уточнять в Банке.

$vars = array();
$vars['userName'] = 'логин';
$vars['password'] = 'пароль';
$vars['orderId'] = '70906e55-7114-41d6-8332-4609dc6590f4';

$ch = curl_init('https://3dsec.sberbank.ru/payment/rest/reverse.do?' . http_build_query($vars));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, JSON_OBJECT_AS_ARRAY);
if (!empty($res['errorCode'])) {
    echo $res['errorMessage'];
} else {
    echo 'Оплата отменена';
}
5

Возврат средств

Вызвав метод refund.do, средства будут возвращены плательщику. Система позволяет возвращать средства более одного раза, но в общей сложности не более первоначальной суммы списания.

// Сумма возврата.
$sum = 500;

$vars = array();
$vars['userName'] = 'логин';
$vars['password'] = 'пароль';
$vars['orderId'] = '70906e55-7114-41d6-8332-4609dc6590f4';
$vars['amount'] = $sum * 100;

$ch = curl_init('https://3dsec.sberbank.ru/payment/rest/refund.do?' . http_build_query($vars));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_HEADER, false);
$res = curl_exec($ch);
curl_close($ch);

$res = json_decode($res, JSON_OBJECT_AS_ARRAY);
if (!empty($res['errorCode'])) {
    echo $res['errorMessage'];
} else {
    echo $sum . 'р. возвращены плательщику';
}
22 октября 2018
В последнее время письма отправляемые с хостингов через функции mail() и mb_send_mail() часто попадают или совсем не...
В статье приведены основные примеры работы с расширением PHP PDO. Такие как подключение к БД, получение, изменение и...
Библиотека GD дает возможность работать с изображениями в PHP. Далее представлены примеры как изменить размер, вырезать...
В продолжении темы работы с массивами поговорим о типичной задаче – их сортировке. Для ее выполнения в PHP существует...