Элементарная отправка SMS сообщений из Bitrix

Элементарная отправка SMS сообщений из Bitrix ... или с любого другого сайта.

Область применения SMS сообщений очень широка:
  • рассылка рекламных акций пользователям,
  • восстановление пароля при утере,
  • подтверждение действий,
  • уведомление администратора о важных событиях и тд.

Возможности ограничиваются только воображением (или нуждами бизнеса). Но что самое крутое - элементарная реализации. Всего пара-тройка строчек кода и мы с вами отправим первое тестовое сообщение.

Давайте придумаем себе задачку (так будет интереснее). Пусть при каждой регистрации пользователя на сайте, ему уходит подтверждение на телефон.

Все что будет описано ниже - применимо к Bitrix, но, в целом, может быть адаптировано к любой другой CMS.

Разобьем задачку на 3 этапа:
  1. Нужно отслеживать событие регистрации пользователя на сайте (тут будет много специфичного для Bitrix кода);
  2. Регистрация на сервисе, осуществляющем рассылку (нужно понимать, что отправка SMS - дело не бесплатное);
  3. Непосредственно добавление кода отправки SMS в наш обработчик события.

Итак, поехали.

1. Событие регистрации пользователя

Обратимся к пользовательской документации Bitirx. Существует 2 события, которые срабатывают после добавления пользователя: OnAfterUserAdd  и OnAfterUserRegister. Про разницу можно почитать в документации, останавливаться на этом не будем. 

Нам нужен OnAfterUserRegister (хотя ни кто не мешает вам создать обработчик на оба события, если у вас пользователи не регистрируются, а могут быть добавлены, например, другими пользователями). 

Разместим на произвольной странице компонент регистрации и настроим его:
<?$APPLICATION->IncludeComponent(
"bitrix:main.register",
"",
Array(
"AUTH" => "Y",
"COMPOSITE_FRAME_MODE" => "A",
"COMPOSITE_FRAME_TYPE" => "AUTO",
"REQUIRED_FIELDS" => array("EMAIL","PERSONAL_PHONE"),
"SET_TITLE" => "Y",
"SHOW_FIELDS" => array("EMAIL","NAME","LAST_NAME","PERSONAL_BIRTHDAY","PERSONAL_PHONE"),
"SUCCESS_PAGE" => "",
"USER_PROPERTY" => array(),
"USER_PROPERTY_NAME" => "",
"USE_BACKURL" => "Y"
)
);?>
Как вы видите, телефон (PERSONAL_PHONE) является обязательным полем. Так мы гарантируем отправку SMS всем и каждому. 

Создадим файл init.php (если еще не создан) в папке /local/php_interface/. 

Теперь напишем обработчик события:
// Регистрируем обработчик события регистрации пользователя
AddEventHandler("main", "OnBeforeUserRegister", Array("EventHunter", "OnBeforeUserRegisterHandler"));

class EventHunter
{
    // Непосредственно обработчик, который принимает поля пользователя
    function OnBeforeUserRegisterHandler(&$arFields) {
        //    Если регистрация успешна и поле заполнено
        if (($arFields['USER_ID'] > 0) && (isset($arFields['PERSONAL_PHONE']))) {

        }
    }
}
Подготовительный этап завершен. Переходим к следующему.

2. Сервис рассылки

Вообще, рассылка SMS уже давно стала тривиальной задачей, а рынок наводнили сотни всевозможных сервисов. Все они поголовно предлагают свой API, супер выгодные тарифы и прочие бонусы. Для нашего примера я буду использовать сервис SMS-центр. Мне он понравился сравнительно невысокими ценами, поддержкой множества протоколов (в том числе SMTP, SOAP) и простотой использования. К слову, у них есть свой модуль для Bitrix, но мы же с вами программисты, мы все сделаем сами :)

Итак, переходим по ссылке и регистрируемся. Мне после регистрации на счет зачислили 10 рублей. Для тестирования качества обслуживания волне хватит. 

Если все готово, смело переходим к следующему шагу и готовимся удивляться.

3. Отправка SMS

Теперь давайте добавим код отправки SMS в наш обработчик. Для нашего примера мы реализуем отправку через https (curl).
// Регистрируем обработчик события регистрации пользователя
AddEventHandler("main", "OnBeforeUserRegister", Array("EventHunter", "OnBeforeUserRegisterHandler"));

class EventHunter
{
    // Непосредственно обработчик, который принимает поля пользователя
    function OnBeforeUserRegisterHandler(&$arFields) {
        // Если регистрация успешна и поле заполнено
        if (($arFields['USER_ID'] > 0) && (isset($arFields['PERSONAL_PHONE']))) {

            // Формируем сообщение
            $message = "Добро пожаловать на сайт!";
            
            // Собираем поля
            $fields = array(
                'login' => SMSC_LOGIN, // Ваш логин SMS-центр
                'psw' => SMSC_PASS, // Ваш пароль SMS-центр
                'phones' => $arFields['PERSONAL_PHONE'], // Поле Телефон, заполненное пользователем
                'mes' => $message, // Отсылаемое сообщение
                'charset' => LANG_CHARSET, // Кодировка сайта
            );

            // Формируем URL для отправки запроса
            $url = 'https://smsc.ru/sys/send.php?' . http_build_query($fields);

            // Инициализация сеанса
            $curl = curl_init($url);

            curl_setopt($curl, CURLOPT_HEADER, 1); // Читать заголовок
            curl_setopt($curl, CURLOPT_NOBODY, 1); // Читать заголовок без тела
            curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); // Не выводить на экран

            // Выполнение запроса
            $result = curl_exec($curl);

            // Завершение сеанса
            curl_close($curl);

        }
    }
 }
И... это все. Серьезно. Весь код занял меньше 20 строк (без учета пробелов, скобок и комментариев). 
Естественно, для облегчения понимания, код был намеренно упрощен. В конце концов, это статья про простую отправку SMS :) 

Думаю, всем понятно, что где-то выше нужно инициировать две константы: SMSC_LOGIN и SMSC_PASS - ваши логин и пароль от SMS-центра. Для Bitrix я бы прописал их в файле dbconn.php, либо вывел в отдельный файл, подключаемый в init.php. 

LANG_CHARSET - константа Bitrix, содержащая кодировку текущего сайта. По умолчанию API SMS-центра работает с Windows-1251, что по-моему немного странно и не удобно. Ну да ладно. 

$arFields['PERSONAL_PHONE'] - поле "Телефон", заполненное пользователем. 

Описание остальных полей можно прочитать в официальной документации. Там есть много интересного, например, добавив cost=1, SMS не будет выслано, но будет возвращена стоимость отправки сообщения. На реальном проекте неплохо было бы проверять, а не дорого ли стоит отправка. Кто знает, из какой страны регистрируется пользователь и какой у него оператор :) 

Возврат к списку