Webhook
Webhook (вебхук, «веб-крючок») — это механизм, позволяющий внешним сервисам отправлять уведомления вашему боту в реальном времени.
В отличие от HTTP-запросов, где ваш бот сам обращается к внешнему API, вебхук работает в обратную сторону: внешний сервис сам стучится в вашего бота, когда случается что-то важное.
Как это работает
Внешний сервис (платёжная система, CRM, хостинг)
│
│ 1. Происходит событие (новый платёж, заказ, регистрация)
↓
[HTTP-запрос]
│
│ 2. Сервис отправляет POST-запрос на URL вашего вебхука
↓
Ваш бот (EnotPro)
│
│ 3. Бот получает данные и выполняет цепочку триггеров
↓
┌────────────────────┐
│ Триггер MAIN │ ← обработка данных, валидация
└────────────────────┘
↓ (вызов SendResponse)
┌────────────────────┐
│ Триггер START │ ← подготовка данных для ответа
└────────────────────┘
↓
┌────────────────────┐
│ Отправка ответа │
└────────────────────┘
Чем вебхук отличается от HTTP-запроса
| Характеристика | HTTP-запрос (SendRequest) | Webhook |
|---|---|---|
| Кто инициирует | Ваш бот | Внешний сервис |
| Направление | Бот → внешний сервис | Внешний сервис → бот |
| Типичное использование | Получить курс валют, погоду, данные из API | Принять уведомление о платеже, заказе |
| Когда используется | По требованию (по команде, расписанию | Когда происходит событие во внешней системе |
| Количество триггеров | 2 (Start, Finish) | 3 (Main, Start, Finish) |
Зачем нужен вебхук
- Приём платежей — платёжная система уведомляет бота об успешной оплате.
- Интеграция с CRM — при изменении статуса заказа CRM присылает обновление.
- WebApp — ваше веб-приложение может отправлять события боту.
- Автоматизация — любой внешний сервис, поддерживающий вебхуки, может общаться с вашим ботом.
Как создать вебхук
Шаг 1: Создайте вебхук в интерфейсе EnotPro
- Перейдите в раздел
/adm → Web → Webhook. - Нажмите кнопку «Добавить».
- Дайте вебхуку техническое название (например,
yookassa_payments).
Важно: URL вебхука генерируется автоматически. Выглядит он примерно так:
https://enotpro.app/wh/xxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxВам не нужно придумывать URL — платформа создаёт его сама. Этот URL нужно будет указать во внешнем сервисе.
Шаг 2: Настройте разрешённые методы
Укажите, какие HTTP-методы будет принимать ваш вебхук. Для 99% случаев достаточно POST.
| Метод | Когда использовать |
|---|---|
GET |
Получение данных. Редко используется для вебхуков |
POST |
Стандарт для 99% вебхуков |
PUT |
Полное обновление ресурса |
DELETE |
Уведомления об удалении |
PATCH |
Частичное обновление ресурса |
HEAD |
Получение только заголовков |
CONNECT |
Установка туннеля (почти не используется) |
OPTIONS |
Запрос поддерживаемых методов (CORS) |
TRACE |
Диагностика (для отладки) |
Важно: Если не указать разрешённые методы, вебхук может не принять запрос от сервиса. По умолчанию разрешён только
POST.
Шаг 3: Настройте триггеры
У вебхука есть два встроенных триггера (подробнее — в разделе «Триггеры вебхука»). В них вы будете обрабатывать данные, которые прислал внешний сервис.
Шаг 4: Настройте ответ (опционально)
По умолчанию EnotPro отвечает на вебхук кодом 200 OK с пустым телом. Если внешний сервис требует специфический ответ, используйте раздел HTTP-ответы (подробнее — в разделе «Кастомный ответ»).
Шаг 5: Укажите URL вебхука во внешнем сервисе
Скопируйте сгенерированный URL вебхука и вставьте его в настройки внешнего сервиса (платёжной системы, CRM и т.д.).
Шаг 6: Включите вебхук
Переключатель «Включен» должен быть в положении ✅.
Структура входящего запроса
Когда внешний сервис отправляет вебхук, бот получает следующие данные. Они доступны в триггерах вебхука через переменные.
Доступные переменные
| Переменная | Описание | Пример |
|---|---|---|
${web.method} |
HTTP-метод запроса | POST |
${web.url} |
Полный URL запроса | https://enotpro.app/wh/xxx/xxx |
${web.path} |
Путь URL (без домена) | /wh/xxx/xxx |
${web.query} |
Query-параметры (строка) | ?id=123&status=ok |
${web.headers} |
Заголовки запроса (объект) | {"content-type": "application/json"} |
${web.body} |
Тело запроса (распарсенный JSON, если применимо) | {"payment_id": 12345} |
${web.body.raw} |
Тело запроса (сырые данные, строка) | {"payment_id": 12345} |
${web.response} |
Информация об ответе (заполняется после отправки ответа) | {"code": 200, "body": "OK"} |
Как получить данные из тела запроса (JSON)
Если внешний сервис прислал JSON вида:
{
"payment_id": 12345,
"amount": 1000,
"currency": "RUB",
"status": "paid"
}
То доступ к полям:
${web.body.payment_id} → 12345
${web.body.amount} → 1000
${web.body.currency} → "RUB"
${web.body.status} → "paid"
Настройки вебхука
Включение/выключение
| Состояние | Что означает |
|---|---|
| ✅ Включен | Вебхук активен и принимает входящие запросы |
| ❌ Выключен | Вебхук не отвечает на запросы (полезно при отладке или временном отключении) |
Совет: перед изменением настроек вебхука рекомендуется его выключить, чтобы избежать случайных срабатываний.
Secret Token (верификация)
Для защиты от поддельных запросов многие сервисы позволяют указать секретный токен, который будет передан в заголовке запроса.
Как настроить:
- При создании вебхука укажите Secret Token (любая строка, например
my_secret_key_123). - В настройках внешнего сервиса укажите этот же токен.
- В триггере «Подготовка» вебхука проверьте заголовок с токеном.
Рекомендация: Всегда используйте Secret Token для публичных вебхуков, чтобы злоумышленники не могли отправлять ложные запросы.
Ограничения
| Параметр | Максимальный размер |
|---|---|
| URL | 2048 символов |
| Ключ заголовка | 256 символов |
| Значение заголовка | 4096 символов |
| Тело запроса | 1 МБ |
| Время обработки (таймаут) | 30 секунд |
Что будет при превышении таймаута
Если ваш триггер не успел обработать запрос за 30 секунд:
- ❌ Внешний сервис получит ошибку
504 Gateway Timeout. - ❌ Скорее всего, сервис повторит отправку вебхука.
- ❌ Вы рискуете получить дублирующуюся обработку.
Как избежать: Выносите длительные операции (отправка сообщений 1000 пользователям, сложные вычисления) в Отложенные действия. В триггере вебхука только сохраняйте данные и запускайте отложенное действие.
Триггеры вебхука
У вебхука есть три встроенных триггера, которые срабатывают в строгой последовательности.
| № | Триггер | Когда срабатывает | Основное назначение |
|---|---|---|---|
| 1 | MAIN | Сразу при получении HTTP-запроса | Обработка входящих данных, валидация, вызов SendResponse |
| 2 | START | Перед формированием ответа (после вызова SendResponse) |
Подготовка данных для шаблонов ответа |
| 3 | FINISH | После отправки ответа клиенту | Логирование, пост-обработка, длительные операции |
Кастомный ответ
По умолчанию, после выполнения триггера вебхука EnotPro автоматически отправляет ответ с кодом 200 OK и пустым телом. Этого достаточно для большинства сервисов.
Однако некоторые внешние сервисы требуют специфический ответ:
- Определённый JSON (например,
{"status": "success"}) - Конкретный HTTP-код (например,
202 Acceptedдля асинхронной обработки) - Специальные заголовки
Как настроить кастомный ответ:
- Перейдите в раздел HTTP-ответы.
- Создайте новый HTTP-ответ с нужным кодом, заголовками и телом.
- В триггере вебхука (в «Подготовке» или «Основном») добавьте реакцию
SendResponse. - Укажите ID созданного HTTP-ответа.
Важно: Если вы отправили кастомный ответ через
SendResponse, стандартный ответ200 OKотправлен не будет.