Настройка уведомлений о статусе заказа в Telegram 1С-Битрикс
Покупатель оформил заказ и ждёт письма на email, которое уходит в спам. Telegram-уведомление доходит мгновенно и читается в 5 раз чаще почты. В Битрикс стандартные уведомления о заказе работают через b_event_message и отправляются по email. Добавить Telegram — значит подцепиться к событию смены статуса заказа и отправить сообщение через Telegram Bot API.
Как работают события заказа в Битрикс
При изменении статуса заказа Битрикс генерирует событие OnSaleOrderStatusChange. Стандартный механизм уведомлений (/bitrix/admin/posting_list.php) рассылает email. Telegram подключается как дополнительный канал через обработчик события.
Создание Telegram-бота для уведомлений
Бот для уведомлений о заказах — не диалоговый, а push-only: он только отправляет, не принимает команды. Создаём через @BotFather:
/newbot
Название: Уведомления MyShop
Username: myshop_orders_bot
Получаем токен вида 1234567890:AAHb-xxxxxx. Токен хранится в настройках модуля или в /bitrix/.settings.php, не в коде шаблона.
Пользователь должен начать диалог с ботом (/start), чтобы бот получил его chat_id. Для этого — в личном кабинете покупателя кнопка «Подключить Telegram-уведомления», которая открывает ссылку https://t.me/myshop_orders_bot?start=uid_12345.
Сохранение chat_id пользователя
// Webhook бота принимает /start с параметром
$update = json_decode(file_get_contents('php://input'), true);
$text = $update['message']['text'] ?? '';
$chatId = $update['message']['chat']['id'];
if (preg_match('/^\/start uid_(\d+)$/', $text, $matches)) {
$userId = (int)$matches[1];
// Сохраняем chat_id в пользовательское поле UF_TELEGRAM_CHAT_ID
\Bitrix\Main\UserTable::update($userId, [
'UF_TELEGRAM_CHAT_ID' => $chatId,
]);
// Подтверждение пользователю
TelegramApi::sendMessage($chatId, 'Telegram-уведомления о заказах подключены.');
}
Обработчик смены статуса заказа
// /local/php_interface/init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleOrderStatusChange',
function (\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
$statusId = $order->getField('STATUS_ID');
$userId = $order->getUserId();
// Читаем chat_id пользователя
$user = \Bitrix\Main\UserTable::getById($userId)->fetch();
$chatId = $user['UF_TELEGRAM_CHAT_ID'] ?? null;
if (!$chatId) {
return; // Пользователь не подключил Telegram
}
// Формируем текст по статусу
$messages = [
'N' => 'Заказ #%d принят и ожидает обработки.',
'P' => 'Заказ #%d передан в доставку.',
'F' => 'Заказ #%d выполнен. Спасибо за покупку!',
'X' => 'Заказ #%d отменён.',
];
$template = $messages[$statusId] ?? null;
if (!$template) {
return;
}
$text = sprintf($template, $order->getId());
$text .= "\n\nПодробнее: " . SITE_SERVER_NAME . '/personal/orders/' . $order->getId() . '/';
// Отправляем через Telegram Bot API
TelegramBotService::send($chatId, $text);
}
);
Класс отправки в Telegram Bot API
class TelegramBotService
{
private static string $token = '1234567890:AAHb-xxxxxx';
public static function send(string $chatId, string $text, array $options = []): bool
{
$params = array_merge([
'chat_id' => $chatId,
'text' => $text,
'parse_mode' => 'HTML',
], $options);
$ch = curl_init('https://api.telegram.org/bot' . self::$token . '/sendMessage');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($params),
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 5,
]);
$response = curl_exec($ch);
curl_close($ch);
return json_decode($response, true)['ok'] ?? false;
}
}
Токен хранится не в коде, а в конфиге:
// /bitrix/.settings.php
'custom' => [
'value' => [
'telegram_bot_token' => '1234567890:AAHb-xxxxxx',
],
],
Сроки настройки
Создание бота, пользовательское поле UF_TELEGRAM_CHAT_ID, страница подключения в личном кабинете, обработчик событий заказа — 6–10 часов.







