Налаштування автоматичної відправки чека в месенджер 1С-Бітрікс
Після онлайн-оплати покупець отримує електронний чек на 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 години.







