Разработка модуля интеграции с мессенджерами 1С-Битрикс
Покупатели всё чаще предпочитают получать уведомления о заказах в Telegram или WhatsApp, а не по email. Конверсия у таких уведомлений выше: сообщение приходит мгновенно, открывается в 5–10 раз чаще, чем email. Модуль интеграции с мессенджерами подключает эти каналы к событиям 1С-Битрикс.
Поддерживаемые мессенджеры
- Telegram — через Bot API (простой, бесплатный, надёжный).
- WhatsApp — через официальный Cloud API Meta или через сторонние провайдеры (WABA360, GreenAPI, Chat-API).
- VK Notify — уведомления через VK Mini Apps API.
- Viber — через Viber REST API.
Telegram реализуется в первую очередь — документация отличная, API стабильный, лимиты разумные (30 сообщений в секунду на бота).
Архитектура модуля
local/modules/vendor.messenger/
├── lib/
│ ├── Channel/
│ │ ├── TelegramChannel.php
│ │ ├── WhatsappChannel.php
│ │ └── ChannelInterface.php
│ ├── NotificationRouter.php # Выбор канала для отправки
│ ├── TemplateEngine.php # Шаблонизатор сообщений
│ └── SubscriptionManager.php # Управление подписками
└── install/db/install.sql
Таблица b_messenger_subscription — привязка пользователей к каналам:
| Поле | Тип | Назначение |
|---|---|---|
| ID | int auto_increment | — |
| USER_ID | int | ID пользователя Битрикс |
| CHANNEL | varchar(50) | telegram, whatsapp, viber |
| CHANNEL_ID | varchar(100) | Chat ID в мессенджере |
| PHONE | varchar(20) | Телефон (для WhatsApp) |
| IS_ACTIVE | tinyint(1) | Активна ли подписка |
| CONFIRMED_AT | datetime | Когда подтверждена |
Привязка Telegram-аккаунта
Пользователь в личном кабинете нажимает «Привязать Telegram» — система генерирует одноразовый код и ссылку https://t.me/yourbot?start=CODE123. Пользователь переходит в бота, отправляет /start CODE123. Бот через Webhook получает сообщение, находит запись по коду в таблице b_messenger_link_token и сохраняет chat_id в b_messenger_subscription.
local/modules/vendor.messenger/install/db/install.sql
CREATE TABLE b_messenger_link_token (
TOKEN varchar(32) NOT NULL,
USER_ID int NOT NULL,
CHANNEL varchar(50) NOT NULL,
EXPIRES_AT datetime NOT NULL,
PRIMARY KEY (TOKEN)
);
Webhook для входящих сообщений
Telegram отправляет обновления на URL вида /api/telegram/webhook/. В Битрикс это обрабатывается через кастомный обработчик:
// local/api/telegram/webhook/index.php
$update = json_decode(file_get_contents('php://input'), true);
if (isset($update['message'])) {
\Vendor\Messenger\TelegramWebhookHandler::handle($update);
}
Обработчик разбирает входящее сообщение: если это /start TOKEN — привязывает аккаунт. Если это текстовый запрос — передаёт в чат-логику (если реализован чат-бот для поддержки).
Отправка уведомлений
Уведомления привязываются к событиям Битрикс через почтовые события или напрямую через обработчики:
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleStatusOrder',
[NotificationRouter::class, 'onOrderStatusChange']
);
Метод onOrderStatusChange определяет нужный канал для пользователя, формирует сообщение из шаблона и отправляет. Для отправки в Telegram:
$response = \Bitrix\Main\Web\HttpClient::post(
"https://api.telegram.org/bot{$token}/sendMessage",
json_encode([
'chat_id' => $chatId,
'text' => $message,
'parse_mode' => 'HTML',
]),
['Content-Type' => 'application/json']
);
Шаблоны сообщений
Шаблоны сообщений для каждого события и каждого канала хранятся в таблице b_messenger_template. Поддерживаются переменные в стиле {{order_id}}, {{status}}, {{tracking_number}}. Редактирование шаблонов доступно в административной части.
Для Telegram поддерживается HTML-форматирование (<b>, <i>, <a>). Для WhatsApp — только звёздочки для жирного (*text*).
Очередь отправки
Отправка в мессенджеры выполняется асинхронно через очередь в таблице b_messenger_queue. Это защищает от блокировки основного процесса при сетевых задержках API мессенджера и позволяет повторить отправку при временной ошибке:
| Поле | Тип | Назначение |
|---|---|---|
| ID | int auto_increment | — |
| CHANNEL | varchar(50) | Канал |
| CHANNEL_ID | varchar(100) | Получатель |
| MESSAGE | text | Текст сообщения |
| ATTEMPTS | tinyint | Попыток отправки |
| STATUS | enum | PENDING, SENT, FAILED |
| NEXT_ATTEMPT_AT | datetime | Когда следующая попытка |
Cron-задача каждую минуту обрабатывает очередь, повторяет неудачные попытки с экспоненциальной задержкой.
Сроки разработки
| Масштаб | Состав | Срок |
|---|---|---|
| Базовый | Telegram, привязка аккаунта, уведомления о заказе | 5–7 дней |
| Стандартный | + WhatsApp, шаблоны в Admin UI, очередь, 5–7 событий | 10–14 дней |
| Расширенный | + VK/Viber, входящие сообщения, чат-бот для поддержки, аналитика | 18–25 дней |







