UPD 20.06.2019: в 2019 году у 1С-Битрикс появился встроенный механизм смс-рассылок, но на данный момент доступны только три сервиса: sms.ru, смс-ассистент и twilio. Данная статья покажет как можно рассылать смс сообщения через другие сервисы, если по каким-то причинам вам не подходят вышеперечисленные. Если у вас нет встроенного механизма отправки СМС, обновите свой 1С-Битрикс.
UPD 13.01.2022: в 2022 году статья не утратила свою актуальность. СМС рассылки - стандарт де-факто в пользовательской авторизации, а также применимы для уведомлений вашим клиентам.
Область применения SMS сообщений очень широка:
- рассылка рекламных акций пользователям,
- восстановление пароля при утере,
- подтверждение действий,
- уведомление администратора о важных событиях и тд.
Возможности ограничиваются только воображением (или нуждами бизнеса). Но что самое крутое - элементарная реализации. Всего пара-тройка строчек кода и мы с вами отправим первое тестовое сообщение.
Давайте придумаем себе задачку (так будет интереснее). Пусть при каждой регистрации пользователя на сайте, ему уходит подтверждение на телефон.
Все что будет описано ниже - применимо к Bitrix, но, в целом, может быть адаптировано к любой другой CMS.
Разобьем задачку на 3 этапа:
- Нужно отслеживать событие регистрации пользователя на сайте (тут будет много специфичного для Bitrix кода);
- Регистрация на сервисе, осуществляющем рассылку (нужно понимать, что отправка SMS - дело не бесплатное);
- Непосредственно добавление кода отправки 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).// Регистрируем обработчик события регистрации пользователяИ... это все. Серьезно. Весь код занял меньше 20 строк (без учета пробелов, скобок и комментариев).
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);
}
}
}
Естественно, для облегчения понимания, код был намеренно упрощен. В конце концов, это статья про простую отправку SMS :)
Думаю, всем понятно, что где-то выше нужно инициировать две константы: SMSC_LOGIN и SMSC_PASS - ваши логин и пароль от SMS-центра. Для Bitrix я бы прописал их в файле dbconn.php, либо вывел в отдельный файл, подключаемый в init.php.
Читайте также: 7 смертных грехов разработки на 1С-Битрикс
LANG_CHARSET - константа Bitrix, содержащая кодировку текущего сайта. По умолчанию API SMS-центра работает с Windows-1251, что по-моему немного странно и не удобно. Ну да ладно.
$arFields['PERSONAL_PHONE'] - поле "Телефон", заполненное пользователем.
Описание остальных полей можно прочитать в официальной документации. Там есть много интересного, например, добавив cost=1, SMS не будет выслано, но будет возвращена стоимость отправки сообщения. На реальном проекте неплохо было бы проверять, а не дорого ли стоит отправка. Кто знает, из какой страны регистрируется пользователь и какой у него оператор :)