Настройка автоматической отправки чека в мессенджер 1С-Битрикс
После онлайн-оплаты покупатель по 54-ФЗ получает электронный чек на email. Многие email-уведомления уходят в спам, либо у клиента нет удобного почтового клиента на телефоне. Отправка чека в мессенджер — Telegram или WhatsApp — решает проблему доставляемости: мессенджеры читают чаще и быстрее.
Когда возникает чек в Битрикс
Фискальный чек создаётся кассовым модулем в момент подтверждения оплаты. Битрикс работает с онлайн-кассами через модули: atol.online, evotor.kassa, orangedata и аналоги. После фискализации модуль сохраняет URL чека в таблицу b_sale_pay_system_action или в пользовательское поле платежа.
Событие, на которое подцепляемся: OnSaleOrderPaid (модуль sale). К этому моменту чек уже должен быть создан — в зависимости от модуля кассы это может быть синхронно или с задержкой до 30 секунд.
Получение URL чека из модуля АТОЛ
// Читаем URL чека из данных платежа
$payment = $order->getPaymentCollection()->getInnerPayment();
$checkUrl = $payment->getField('PS_PARAMS') ?? null;
// Для АТОЛ чек хранится в отдельной таблице
$checkResult = \Atol\Online\Check::getByOrderId($order->getId());
$checkUrl = $checkResult['RECEIPT_URL'] ?? null;
Конкретное место хранения зависит от модуля кассы. Перед разработкой — смотрим документацию конкретного модуля и его таблицы/поля.
Обработчик: отправка чека после оплаты
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'sale',
'OnSaleOrderPaid',
function (\Bitrix\Main\Event $event) {
$order = $event->getParameter('ENTITY');
$payment = $event->getParameter('PAYMENT');
$userId = $order->getUserId();
// Получаем URL чека — с небольшой задержкой, если кассовый модуль асинхронный
$checkUrl = self::waitForCheck($order->getId(), 3); // ждём до 3 секунд
if (!$checkUrl) {
// URL чека не получен — логируем, email уже отправлен стандартно
return;
}
$message = sprintf(
"Ваш кассовый чек по заказу #%d:\n%s",
$order->getId(),
$checkUrl
);
// Определяем предпочитаемый канал пользователя
$user = \Bitrix\Main\UserTable::getById($userId)->fetch();
if (!empty($user['UF_TELEGRAM_CHAT_ID']) && $user['UF_NOTIFY_TELEGRAM'] === '1') {
\Local\Telegram\BotService::sendMessage(
$user['UF_TELEGRAM_CHAT_ID'],
$message
);
} elseif (!empty($user['UF_PHONE']) && $user['UF_NOTIFY_WHATSAPP'] === '1') {
\Local\WhatsApp\Service::sendMessage($user['UF_PHONE'], $message);
}
// email всегда отправляется стандартным механизмом Битрикс
}
);
Если кассовый модуль создаёт чек асинхронно (через очередь), синхронного ожидания недостаточно. В этом случае подписываемся на событие самого кассового модуля:
// Событие АТОЛ Онлайн после получения ответа ОФД
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'atol.online',
'OnReceiptRegistered',
function (\Bitrix\Main\Event $event) {
$orderId = $event->getParameter('ORDER_ID');
$checkUrl = $event->getParameter('RECEIPT_URL');
// Отправляем в мессенджер здесь
}
);
Формат сообщения с чеком
Для Telegram можно добавить кнопку с ссылкой на чек через InlineKeyboard:
$payload = [
'chat_id' => $chatId,
'text' => "Чек по заказу #{$orderId} готов.",
'parse_mode' => 'HTML',
'reply_markup' => json_encode([
'inline_keyboard' => [[
['text' => 'Открыть чек', 'url' => $checkUrl],
]],
]),
];
Сроки настройки
Обработчик события оплаты, получение URL чека из модуля кассы, отправка в Telegram и/или WhatsApp — 4–8 часов. Если кассовый модуль асинхронный и нужно подписываться на его события — дополнительно 2–4 часа.







