Работа с СМС

Bitrix Framework использует СМС, чтобы уведомлять пользователей. Отправляет СМС модуль Служба сообщений. Он соединяет систему с разными СМС-провайдерами.

Как работает отправка СМС

  1. Код приложения создает СМС-событие с данными для подстановки.

  2. Система находит активный СМС-шаблон по имени события, сайту и языку.

  3. Данные подставляются в шаблон вместо специальных меток вида #CODE#.

  4. Готовое сообщение передается выбранному СМС-провайдеру.

  5. Провайдер доставляет СМС до абонента.

Метки в шаблонах — это специальные пометки в тексте, которые система заменяет реальными данными. Например, метка #USER_NAME# заменится на имя пользователя, а #ORDER_ID# — на номер заказа.

События и шаблоны сообщений

Чтобы отправить СМС, нужно создать тип события и связать с ним шаблон. Тип события определяет, когда отправлять сообщение, а шаблон — какой текст использовать. В шаблоне укажите метки, которые система заменит на реальные данные.

Создать тип события

Тип события — это идентификатор, который связывает код с шаблонами СМС.

Чтобы создать новый тип события, откройте страницу Настройки > Почтовые и СМС события > Типы событий и нажмите Добавить тип.

  • Тип события — укажите уникальное имя, например, ORDER_READY.

  • Вид события — выберите СМС-событие.

  • Название — напишите понятное название для каждого языка.

  • Описание — добавьте описание события, например, доступные метки.

Создать шаблон

Шаблон задает текст сообщения для системных уведомлений.

  • Название события — выберите тип события, который свяжет код и шаблон.

  • Активен — отметка, что система может использовать шаблон.

  • Сайты — сайт для которого действует шаблон.

  • Язык — конкретный язык, например, ru или en.

  • Телефон отправителя — номер, с которого система отправит СМС.

  • Телефон получателя — номер получателя сообщения.

  • Шаблон сообщения — текст сообщения с метками, которые заменяются реальными данными.

В доступных полях система показывает системные метки и те, которые вы указали в типе события. Их можно использовать для полей сообщения.

Класс \Bitrix\Main\Sms\Event

Класс \Bitrix\Main\Sms\Event управляет отправкой СМС: ищет подходящий шаблон, подставляет данные и передает сообщение модулю Служба сообщений messageservice.

Конструктор

__construct(string $eventName, array $fields = [])
        
  • $eventName — имя СМС-события, совпадает с полем EVENT_NAME в шаблоне.

  • $fields — массив данных для подстановки.

Пример:

$event = new \Bitrix\Main\Sms\Event('ORDER_READY', [
            'ORDER_ID' => 42,
            'USER_PHONE' => '89991234567',
        ]);
        

Методы

Найти шаблон

Метод setSite($siteId) задает сайт для поиска шаблона.

  • $siteId — идентификатор сайта.
$event->setSite('s1');
        

По умолчанию система использует текущий сайт.

Задать язык для выбора шаблона

Метод setLanguage($languageId) задает язык для выбора шаблона.

  • $languageId — идентификатор языка.
$event->setLanguage('ru'); // может быть 'ru', 'en', 'de' и так далее
        

По умолчанию система использует текущий язык.

Выбрать шаблон по идентификатору

Метод setTemplate($templateId) выбирает конкретный шаблон по ID.

  • $templateId — числовой идентификатор шаблона.
$event->setTemplate(105);
        

Если указать шаблон по ID, система не будет искать его по событию и языку.

Отправить СМС

Метод send($directly) отправляет СМС.

  • $directly — по умолчанию имеет значение false, то есть сообщение попадает в очередь. Если установить true , сообщение отправится без очереди.
$result = $event->send(false);
        

Метод возвращает объект \Bitrix\Main\Result. Получить список ошибок можно кодом:

if (!$result->isSuccess()) {
            foreach ($result->getErrorMessages() as $msg) {
                echo $msg;
            }
        }
        

Получить список сообщений

Метод createMessageList() получает список сообщений на основе шаблонов.

$result = $event->createMessageList();
        
        if ($result->isSuccess()) {
            $messages = $result->getData();
        }
        

Метод возвращает объект \Bitrix\Main\Result. Поле data содержит массив объектов \Bitrix\Main\Sms\Message.

Примеры

Отправить СМС через очередь

Сообщение отправится через систему очередей после завершения текущего запроса.

use Bitrix\Main\Sms\Event;
        
        // Создаем событие с данными для подстановки в шаблон
        $event = new Event('USER_CONFIRM_PHONE', [
            'CODE' => '123456',    // Подставится вместо #CODE# в шаблоне
            'USER_ID' => 42,       // Подставится вместо #USER_ID# в шаблоне
        ]);
        
        // Настраиваем и отправляем сообщение
        $result = $event
            ->setSite('s1')        // Указываем сайт для поиска шаблона
            ->setLanguage('ru')    // Указываем язык шаблона
            ->send(false);         // false — отправка через очередь
        
        // Проверяем результат отправки
        if (!$result->isSuccess()) {
            foreach ($result->getErrorMessages() as $msg) {
                echo $msg;
            }
        }
        

Отправить сообщение без очереди

Сообщение отправится сразу, без помещения в очередь.

// Создаем и отправляем событие в одной строке
        $result = (new Event('PASSWORD_RESTORE', $fields)) // $fields — массив данных для шаблона
            ->setSite('s1')    // Указываем сайт
            ->send(true);      // true — немедленная отправка без очереди
        

Отправить сообщение по ID шаблона

Пример использует конкретный шаблон по ID. Система не ищет шаблон по имени события.

// Используем конкретный шаблон, минуя поиск по имени события
        $result = (new Event('IGNORED_EVENT', $fields)) // Имя события игнорируется
            ->setSite('s1')
            ->setTemplate(105) // Используем шаблон с ID 105
            ->send();          // Отправляем сообщение
        

Событие onBeforeSendSms

Перед отправкой сообщения система вызывает событие main:onBeforeSendSms. Обработчик получает объект сообщения. Он может проверить данные или изменить текст. Если обработчик вернет ошибку, система не отправит сообщение.

use Bitrix\Main\EventManager;
        use Bitrix\Main\EventResult;
        
        // Регистрируем обработчик для проверки СМС перед отправкой
        EventManager::getInstance()->addEventHandler(
            'main',
            'onBeforeSendSms',
            function(\Bitrix\Main\Event $event) {
                // Получаем объект сообщения
                $msg = $event->getParameter('message');
                
                // Проверяем формат номера телефона
                if (!preg_match('/^\+?[1-9]\d{7,14}$/', $msg->getTo())) {
                    // Если номер невалидный — отменяем отправку
                    return new EventResult(EventResult::ERROR);
                }
                
                // Если все проверки пройдены, сообщение будет отправлено
            }
        );
        

Модуль Служба сообщений

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

Установить модуль

Чтобы установить модуль Служба сообщений, откройте страницу Настройки > Настройки продукта > Модули в административном разделе. В списке найдите модуль и нажмите кнопку Установить.

Настроить модуль

Настроить модуль можно на странице Настройки > Настройки продукта > Настройки модулей > Служба сообщений.

  • Сколько дней хранить сообщения — задает срок хранения истории СМС. Система автоматически удаляет старые сообщения.

  • Сколько сообщений отправлять за один хит — ограничивает количество СМС за один запрос. Это предотвращает перегрузку сервера.

  • Службы отправки SMS — отображает список доступных СМС-провайдеров. Для подключения сервиса кликните по его названию и заполните форму.

  • Дневные лимиты отправки SMS — ограничивает количество СМС в сутки.

Класс SmsManager

Класс \Bitrix\MessageService\Sender\SmsManager предоставляет единый интерфейс для работы с СМС-провайдерами. Он автоматически определяет доступные сервисы отправки и управляет процессом отправки сообщений.

Провайдеры

Каждый сервис отправки СМС — это класс в пространстве имен \Bitrix\MessageService\Sender\Sms\. Класс содержит константы для идентификации провайдера.

\Bitrix\MessageService\Sender\Sms\SmsRu::ID      // идентификатор SMS.RU
        \Bitrix\MessageService\Sender\Sms\EdnaRu::ID     // идентификатор Edna
        

Полный список провайдеров можно получить методом getSenders(). Система включает только те провайдеры, которые поддерживаются текущей конфигурацией.

Методы

Подключите модуль messageservice, чтобы использовать методы.

CModule::IncludeModule('messageservice');
        
  • getSenders — получает список всех доступных провайдеров.
$senders = \Bitrix\MessageService\Sender\SmsManager::getSenders();
        
  • getDefaultSender — получает провайдера по умолчанию для региона.
$defaultSender = \Bitrix\MessageService\Sender\SmsManager::getDefaultSender();
        
  • getUsableSender — получает первого доступного провайдера.
$usableSender = \Bitrix\MessageService\Sender\SmsManager::getUsableSender();
        
  • getSenderById — получает информацию о провайдере по идентификатору ID.
$sender = \Bitrix\MessageService\Sender\SmsManager::getSenderById(
            \Bitrix\MessageService\Sender\Sms\SmsRu::ID
        );
        

Зарегистрировать провайдера

Чтобы добавить провайдера:

  • создайте класс провайдера — наследник \Bitrix\MessageService\Sender\Base,

  • зарегистрируйте класс через событие.

$eventManager = \Bitrix\Main\EventManager::getInstance(); 
        $eventManager->registerEventHandler(
            'messageservice',
            'onGetSmsSenders',
            'messageservice',
            'Bitrix\MessageService\Sender\Sms\Dummy',
            'onGetSmsSenders'
        );
        

Отправка сообщений

Класс SmsManager предоставляет несколько способов отправки СМС. Вы можете отправлять сообщения напрямую, работать с объектами сообщений для тонкой настройки или создавать сообщения на основе шаблонов.

Отправить сообщение

Метод sendMessage() отправляет сообщение через указанного провайдера. Сообщение добавляется в очередь отправки.

\Bitrix\MessageService\Sender\SmsManager::sendMessage([
            'SENDER_ID' => \Bitrix\MessageService\Sender\Sms\Ednaru::ID, // Идентификатор провайдера
            'AUTHOR_ID' => $authorId, // Пользователь — отправитель сообщения
            'MESSAGE_TO' => $phoneNumber, // Номер получателя в международном формате
            'MESSAGE_FROM' => $chanelId, // Канал отправителя
            'MESSAGE_BODY' => 'Здравствуйте, ваш заказ уже в пути.', // Текст сообщения
        ]);
        

Отправить сообщение с расширенной настройкой

Метод createMessage() дает больше контроля над отправкой СМС. Используйте его, чтобы задать дополнительные параметры или заголовки.

С помощью метода можно:

  • настроить дополнительные параметры через MESSAGE_HEADERS,

  • выбрать момент отправки — через очередь или сразу,

  • проверить данные перед отправкой.

$message = \Bitrix\MessageService\Sender\SmsManager::createMessage([
            'SENDER_ID' => \Bitrix\MessageService\Sender\Sms\Ednaru::ID,
            'MESSAGE_TO' => $phoneNumber,
            'MESSAGE_FROM' => $chanelId,
            'MESSAGE_BODY' => $text,
            'MESSAGE_HEADERS' => [
                'module_id' => 'crm', // Привязка к модулю, например, CRM
                'bindings' => [ // Связи с CRM-объектами
                    [
                        'OWNER_TYPE_ID' => 1, // Тип объекта, например, лид
                        'OWNER_ID' => 57, // Идентификатор объекта
                    ],
                ],
            ],
        ]);
        
        // Отправить через очередь
        $result = $message->send();
        
        // Отправить немедленно
        $result = $message->sendDirectly();
        

Отправить сообщение без очереди

Метод sendMessageDirectly() отправляет сообщение немедленно, без помещения в очередь. Используйте этот метод для срочных сообщений.

$result = \Bitrix\MessageService\Sender\SmsManager::sendMessageDirectly([
            'SENDER_ID' => \Bitrix\MessageService\Sender\Sms\SmsRu::ID,
            'MESSAGE_TO' => '+79161234567',
            'MESSAGE_BODY' => 'Срочное сообщение',
        ]);
        

Создать сообщение по шаблону

Метод createMessageListByTemplate() создает список сообщений на основе СМС-шаблонов. Система автоматически находит шаблоны по имени события и подставляет переданные данные.

// Данные для подстановки в шаблон. Могут быть разными для каждого получателя
        $templateData = [
            'CODE' => $confirmationCode,    // Данные для подстановки в плейсхолдер #CODE#
            'USER_ID' => $userId,           // Данные для подстановки в плейсхолдер #USER_ID#
            'SENDER_ID' => \Bitrix\MessageService\Sender\Sms\SmsRu::ID, // Опциональный провайдер
            'DEFAULT_FROM' => 'MyCompany'   // Опциональный отправитель
        ];
        
        // Создаем сообщения на основе шаблона 'USER_CONFIRM_PHONE'
        $messages = \Bitrix\MessageService\Sender\SmsManager::createMessageListByTemplate(
            'USER_CONFIRM_PHONE', // имя события, указанное в шаблоне
            $templateData
        );
        
        // Отправляем все созданные сообщения
        foreach ($messages as $message) {
            $message->send();
        }
        

Проверить статус сообщения

Метод getMessageStatus() позволяет получить текущий статус отправленного сообщения. Статус помогает отслеживать доставку и обрабатывать ошибки.

// Получаем статус сообщения по его ID
        $status = \Bitrix\MessageService\Sender\SmsManager::getMessageStatus($messageId);
        
        if ($status->isSuccess()) {
            // Сообщение успешно обработано
            $statusCode = $status->getExternalStatus();  // Код статуса от провайдера
            $statusText = $status->getStatusText();      // Текстовое описание статуса
        } else {
            // Произошла ошибка
            $errors = $status->getErrorMessages();       // Массив ошибок
        }
        

Автоматическая нормализация номеров

Система автоматически приводит номера телефонов к международному формату.

// 1. Вход: 89161234567 → Выход: +79161234567
        // 2. Вход: +7 (916) 123-45-67 → Выход: +79161234567
        

Обработка ошибок

Методы отправки возвращают объект Bitrix\Main\Result. Используйте этот объект для проверки результата операции. Если отправка не удалась, получите список ошибок.

$result = \Bitrix\MessageService\Sender\SmsManager::sendMessage($messageFields);
        if (!$result->isSuccess()) {
            foreach ($result->getErrorMessages() as $error) {
                // Обработка ошибки
            }
        }
        

События

Событие OnMessageSuccessfullySent позволяет выполнить код после успешной отправки СМС. Например, можно залогировать отправку или обновить данные в CRM.

use Bitrix\Main\EventManager;
        use Bitrix\Main\Event;
        
        // Логируем отправку СМС
        EventManager::getInstance()->addEventHandler(
            'messageservice',
            'OnMessageSuccessfullySent',
            function(Event $event) {
                $messageId = $event->getParameter('ID');
                
                // Запишем успешную отправку сообщения
                AddMessage2Log("СМС отправлено. ID: {$messageId}", 'messageservice');
            }
        );
        
Предыдущая
Следующая