EnotPRO Logo EnotPRO

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)

Зачем нужен вебхук

  1. Приём платежей — платёжная система уведомляет бота об успешной оплате.
  2. Интеграция с CRM — при изменении статуса заказа CRM присылает обновление.
  3. WebApp — ваше веб-приложение может отправлять события боту.
  4. Автоматизация — любой внешний сервис, поддерживающий вебхуки, может общаться с вашим ботом.

Как создать вебхук

Шаг 1: Создайте вебхук в интерфейсе EnotPro

  1. Перейдите в раздел /adm → Web → Webhook.
  2. Нажмите кнопку «Добавить».
  3. Дайте вебхуку техническое название (например, 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 (верификация)

Для защиты от поддельных запросов многие сервисы позволяют указать секретный токен, который будет передан в заголовке запроса.

Как настроить:

  1. При создании вебхука укажите Secret Token (любая строка, например my_secret_key_123).
  2. В настройках внешнего сервиса укажите этот же токен.
  3. В триггере «Подготовка» вебхука проверьте заголовок с токеном.

Рекомендация: Всегда используйте 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 для асинхронной обработки)
  • Специальные заголовки

Как настроить кастомный ответ:

  1. Перейдите в раздел HTTP-ответы.
  2. Создайте новый HTTP-ответ с нужным кодом, заголовками и телом.
  3. В триггере вебхука (в «Подготовке» или «Основном») добавьте реакцию SendResponse.
  4. Укажите ID созданного HTTP-ответа.

Важно: Если вы отправили кастомный ответ через SendResponse, стандартный ответ 200 OK отправлен не будет.

Пример реализации приема платежей в yookassa

Документация по подключению YouuKassa

© 2025 EnotPRO. Все права защищены.