Прием платежей на сайте банковскими картами Сбербанка на PHP

Когда я стал создавать различные интернет-проекты, клиенты стали спрашивать о приеме платежей на сайте. Для приема оплаты банковскими картами нужно подключить интернет-эквайринг, к нему теперь нужна касса, а к ней соответственно фискальный накопитель(ФН), договор и оплата оператора фискальных данных (ОФД). Но для этого нужно иметь юридическое лицо и для стартапов это дополнительные затраты, которые не факт, что окупятся, т.к. не понятно пойдет ли данное направление бизнеса. Возможные альтернативы - это яндекс-касса, Qiwi или Webmoney. Но с ними возникают сложности у конечных пользователей, т.к. они зачастую не способны оплатить с карты сбербанка. И тогда мы решили использовать наш SMS-шлюз для организации автоматизированного сервиса сбербанк прием платежей. C помощью данного сервиса можно организовать прием оплаты на карту сбербанка с помощью уведомления о поступлении платежей на url от сбербанка. Итак что нужно, чтобы организовать прием интернет платежей, по пунктам:

  1. Идете в сбербанк и получаете на физ.лицо самую дешевую карту маэстро без оплаты за обслуживание. И подключаете к ней смс оповещения за 60руб в месяц.
  2. На Андроид-телефон, привязанный к сбербанковской карте, установить приложение SMS-шлюз.
  3. В профиле указать адрес своей страницы обработчика.
  4. На сайте предложить пользователю с помощью сбербанк-онлайн или с помошью СМС, отправленной на номер 900, перевести деньги на вашу карту и обязательно в сообщении указать свой логин или некоторый уникальный идентификатор (user_id или bill_id) или просто свой e-mail. Этот код и позволит автоматически начислить оплату вашему пользователю. СМС шлюз при получении платежа вызовет ваш обработчик и передаст ему одно сообщение и затем следующее:
    MAES0201 07.05.17 16:35 зачисление 30р Баланс: 20412.14р
    Сбербанк Онлайн. ТАТЬЯНА НИКОЛАЕВНА П. перевел(а) Вам 30.00 RUB. Сообщение: "!!!КОД!!!"
  5. Вам остается разобрать с помощью регулярного выражения полученные сообщения и произвести начисления:
    if($_REQUEST['from']=='900' && $_REQUEST['type']==9 &&
            preg_match('/Сбербанк Онлайн.* перевел(а) Вам ([\d\.]+) RUB. Сообщение: "([^\"]*)"/i',$_REQUEST['message'],$ar)){
            // начисляете $ar[1] рублей пользователю по его идентификатору $ar[2]
        }

Для безопасности используйте подпись запросов. Для этого в профиле укажите некую случайную последовательность. Если она задана то в callBackUrl будет добавлен параметр sign, в конце всех отсортированных параметров от которых формируется md5.

define('HTMLWEB_SIGN','ВАША_СЕКРЕТНАЯ_СТРОКА');
if(empty($_REQUEST['sign']))die('Не переданна подпись, - это хакер!');
$param=$_REQUEST;
unset($param['sign']);
ksort($param);
if($_REQUEST['sign']!=md5(implode('',$param).HTMLWEB_SIGN))die('Ошибка подписи, - это хакер!');

Регулярные выражения для разбора сообщений от Сбербанка:

К сожалению, Сбербанк достаточно часто меняет формат своих СМС сообщений. Список актуальных шаблонов:

<?php
// Перевод 350р от ВИКТОРИЯ ЕВГЕНЬЕВНА Ф.\nСообщение: "5629"
define('SB_PARSE_TEMPLATE_1', '/(?:перевел|Перевод)[^\d]+([\d\.]+)[^\d]+ от .+Сообщение:\s*(?:\"|\”|")(.+)(?:\"|\”|")/iu');
// VISA6385: 22:30 зачисление 30р от отправителя ЮЛИЯ ЮРЬЕВНА Г. Сообщение: ”38638”
define('SB_PARSE_TEMPLATE_2', '/(VISA|ECMC|MAES)(\d{4})\:?\s+.*(?:перевод|зачисление|перевел)\s+([\d\.]+).+Сообщение:\s*(?:\"|\”|")(.+)(?:\"|\”|")$/ui');
//VISA9213 12.02.18 08:47 зачисление 450р Баланс: 17809.50р
define('SB_PARSE_TEMPLATE_3', '/(VISA|ECMC|MAES)(\d{4})\:?\s+.*(?:перевод|зачисление|перевел)\s+([\d\.]+)[^\d].*(?:Баланс|Остаток)\:?\s+([\d\.]+)[^d]/ui');
//VISA9699 09:06 перевод 350.00р от АЛЛА ВАЛЕРЬЕВНА Т.\\nБаланс: 50335.39р\\nСообщение: "29462"
define('SB_PARSE_TEMPLATE_4', '/(VISA|ECMC|MAES)(\d{4})\:?\s+.*(?:перевод|зачисление|перевел)\s+([\d\.]+).+(?:Баланс|Остаток)\:\s+([\d\.]+).+Сообщение:\s*(?:\"|\”|")(.+)(?:\"|\”|")$/ui');
//Перевод 700р от ЕЛЕНА АЛЕКСЕЕВНА Ш.\\nБаланс VISA9699: 22989.39р\\nСообщение: "239196"
//Перевод 1р от МИХАИЛ АЛЕКСАНДРОВИЧ П.\\nБаланс VISA9699: 27357.39р\\nСообщение: "3"
define('SB_PARSE_TEMPLATE_5', '/Перевод\s+([\d\.]+).+(?:Баланс|Остаток)\s+(VISA|ECMC|MAES)(\d{4})\:\s*([\d\.]+).+Сообщение:\s*(?:\"|\”|")(.+)(?:\"|\”|")$/ui');
// Перевод 1015р от АНАСТАСИЯ СЕРГЕЕВНА Ш.\nБаланс VISA9699: 11642.04р
define('SB_PARSE_TEMPLATE_6', '/Перевод\s+[^\d]+([\d\.]+).*Баланс\s+(VISA|ECMC|MAES)(\d{4})\:\s*([\d\.]+)[^\d]/iu');
// ECMC1374: 19:57:45 зачисление 193р. от отправителя ВЕРА СЕРГЕЕВНА Р.
define('SB_PARSE_TEMPLATE_7', '/(VISA|ECMC|MAES)(\d{4})\:.*(?:перевел|Перевод|зачисление)[^\d]+([\d\.]+)[^\d]/iu');
// ГАЛИНА ГЕННАДЬЕВНА Г. перевел(а) вам 78.00р
define('SB_PARSE_TEMPLATE_8', '/(?:перевел|Перевод|зачисление)[^\d]+([\d\.]+)[^\d]/iu');

// Перевод 350р от ВЕРОНИКА ВЛАДИМИРОВНА К.\nБаланс VISA9699: 11658.04р
define('SB_PARSE_TEMPLATE_9', '/Перевод\s+([\d\.]+)[^\d] от .*(?:Баланс|Остаток) (VISA|ECMC|MAES)(\d{4})\:?\s+([\d\.]+)[^d]/ui');

/* Шаблоны списания средств с карты
ECMC1374 11:27 перевод 6650р Баланс: 1191.13р
ECMC1374 19:36 Выдача 20000р ATM 60000976 Баланс: 7106.13р
ECMC1374 18.12.19 мобильный банк за 18.12-17.01 60р Баланс: 10738.13р
ECMC1374 02:45 Покупка 209.50р FACEBK *VGSHAQSXJ2 Баланс: 29974.71р
С Вашей карты **** 1374 произведен перевод на карту № **** 3314 на сумму 29875,00 RUB.
*/
define('SB_PARSE_TEMPLATE_99', '/(VISA|ECMC|MAES|MIR\-|С Вашей карты \*\*\*\* )(\d{4})\:?\s+.*(?:перевод|Выдача|мобильный банк|Покупка)\s+.*(?:Баланс|Остаток)\:?\s+([\d\.]+)[^d]/ui');


if (preg_match(SB_PARSE_TEMPLATE_4, $sms, $res)){
    $rub = $res[3];
    $cardType = $res[1];
    $cardID = $res[2];
    $CardBalance = $res[4];
    $Mes = $res[5];
}elseif(preg_match(SB_PARSE_TEMPLATE_3, $sms, $res)){
    $cardType = $res[1];
    $cardID = $res[2];
    $rub = $res[3];
    $CardBalance = $res[4];
} elseif(preg_match(SB_PARSE_TEMPLATE_5, $sms, $res)){
    $rub = $res[1];
    $cardType = $res[2];
    $cardID = $res[3];
    $CardBalance = $res[4];
    $Mes = $res[5];
} elseif(preg_match(SB_PARSE_TEMPLATE_2, $sms, $res)){
    $rub = $res[3];
    $Mes = $res[4];
    $cardType = $res[1];
    $cardID = $res[2];
} elseif (preg_match(SB_PARSE_TEMPLATE_1, $sms, $res)){
    $rub = $res[1];
    $Mes = $res[2];
} elseif (preg_match(SB_PARSE_TEMPLATE_6, $sms, $res)){
    $rub = $res[1];
    $cardType = $res[2];
    $cardID = $res[3];
    $CardBalance = $res[4];
} elseif (preg_match(SB_PARSE_TEMPLATE_7, $sms, $res)){
    $rub = $res[3];
    $cardType = $res[1];
    $cardID = $res[2];
} elseif (preg_match(SB_PARSE_TEMPLATE_8, $sms, $res)){
    $rub = $res[1];
} elseif (preg_match(SB_PARSE_TEMPLATE_9, $sms, $res)){
    $rub = $res[1];
    $cardType = $res[2];
    $cardID = $res[3];
    $CardBalance = $res[4];
} elseif( preg_match(SB_PARSE_TEMPLATE_99, $sms, $res)){ // списание с карты
    if(strlen($res[1])==4)$cardType = $res[1];
    $cardID = $res[2];
    $CardBalance = $res[3];
    $rub = 0;
    echo "Сбербанк списание";
} else {
    // Сбербанк опять поменял формат СМС сообщений!
}
?>

Обратите внимание, если вы установите себе на телефон приложение сбербанк-онлайн, то СМС перестанут приходить. Чтобы продолжить получать СМС о поступлениях платежей, отключите в приложении получение PUSH.

Итак, мы разбрались с организацией приема платежей на своем сайте с помощью карт сбербанка. Так же Вы можете с помощью СМС шлюза настроить уведомления своих клиентов о статусе заказа, отправлять на телефон код восстановления доступа к личному кабинету и т.д.

Настроить уведомление в телеграм о поступлении на карту

  • Подключите к карте СМС уведомления о поступлении. Отключите в приложении банка получение PUSH уведомлений.
  • На Андроид-телефон, привязанный к карте, установите приложение SMS-шлюз.
  • Авторизуетесь в телеграм-боте @htmlweb_bot
  • В настройке СМС шлюза установите галочку [x] пересылать в Telegram

После этого все поступающие СМС сообщения вы будете мгновенно получать на ваш телеграм.

Автоматизированная отправка платежей со счета сбербанка. API сбербанка

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

Если вам это кажется сложным, - обращайтесь, поможем!

.