Что такое вебхук и для чего он нужен
Рекомендации по обработке вебхуков
Вебхук (Webhook) — это механизм автоматической отправки уведомлений из нашего сервиса в вашу систему (CRM, ERP, 1С, собственное приложение и т. п.) при наступлении определённых событий посредством HTTP(S) запросов.
Вместо того чтобы регулярно опрашивать API (например, проверять статус доставки SMS), ваш сервер получает HTTP(S)-запрос в момент, когда событие действительно произошло.
Использование вебхуков позволяет:
На данный момент доступны следующие типы событий:
Перейдите в Панель управления → API → Вебхуки и нажмите кнопку «Создать вебхук». Откроется форма создания нового вебхука.
В форме создания вебхука укажите следующие параметры:
Определяет событие в системе Mobizon, при наступлении которого будет отправляться вебхук.
Доступные варианты:
Формат, в котором данные вебхука будут отправляться на ваш сервер:
rawxmljsonВыбирайте формат в зависимости от возможностей вашего обработчика.
URL, на который будут отправляться вебхуки.
Ограничения:
Важно:
Секретный ключ используется для проверки подлинности запроса.
Особенности:
Если секретный ключ не задан:
Установите флаг «Активен», если вебхук должен начать работу сразу после создания.
Нажмите кнопку «Сохранить». Созданный вебхук появится в списке.
200–299 не позднее чем через 5 секунд.200–299, система выполнит повторную отправку.Повторные попытки доставки:
Все вебхуки отправляются HTTP(S)-запросом методом POST.
| Поле | Описание |
|---|---|
eventId | Уникальный идентификатор события (одинаков для повторных попыток) |
eventType | Тип события (например, sms-delivery-report) |
eventCreateTs | Дата и время создания события (yyyy-mm-dd hh:mm:ss) |
webhookId | Идентификатор вебхука |
attempt | Номер попытки доставки |
data | Данные события |
sign | Цифровая подпись запроса |
sms-delivery-report){
"eventId": 26,
"eventType": "sms-delivery-report",
"eventCreateTs": "2026-01-15 11:42:28",
"webhookId": 1,
"attempt": 1,
"data": {
"campaignId": 245455096,
"messageId": 169275418,
"segNum": 3,
"statusUpdateTs": "2026-01-15 11:42:08",
"status": "DELIVRD",
"to": "380737893456"
},
"sign": "3f0a37cf5e27fe0615504b6d700b4b657ecfd39d"
}
data| Поле | Описание |
|---|---|
campaignId | ID SMS-кампании |
messageId | ID SMS-сообщения |
segNum | Количество сегментов SMS |
statusUpdateTs | Время обновления статуса |
status | Итоговый статус доставки |
to | Номер получателя |
Вебхуки для форм могут отправляться при различных действиях пользователя: отправке формы, подтверждении контакта или отписке.
form-submission)Событие отправляется сразу после успешного заполнения и отправки формы пользователем.
{
"eventId": 40,
"eventType": "form-submission",
"eventCreateTs": "2026-01-15 16:53:30",
"webhookId": 1,
"attempt": 1,
"data": {
"formId": 846,
"submissionId": 3680,
"items": [
{
"submissionDataId": 12303,
"fieldId": 3744,
"fieldType": "TEXT_STRING",
"fieldName": "Name",
"value": "Ivan"
},
{
"submissionDataId": 12304,
"fieldId": 3745,
"fieldType": "EMAIL",
"fieldName": "E-mail",
"value": "test@mobizon.com",
"confirmationRequired": 1
},
{
"submissionDataId": 12305,
"fieldId": 3746,
"fieldType": "MOBILE",
"fieldName": "Celular",
"value": "380737893456",
"confirmationRequired": 1
}
]
},
"sign": "0a38941c47689e3cb3634db817cd4851d2511c47"
}
Описание поля items
Каждый элемент массива соответствует одному полю формы.
| Поле | Описание |
|---|---|
submissionDataId | ID значения поля формы |
fieldId | ID поля формы |
fieldType | Тип поля (TEXT_STRING, EMAIL, MOBILE и др.) |
fieldName | Название поля |
value | Значение, введённое пользователем |
confirmationRequired | Признак необходимости подтверждения (1 — требуется) |
form-contact-confirmation)Событие отправляется после подтверждения пользователем email-адреса или номера телефона с помощью кода в SMS или Email.
{
"eventId": 42,
"eventType": "form-contact-confirmation",
"eventCreateTs": "2026-01-15 16:54:15",
"webhookId": 1,
"attempt": 1,
"data": {
"formId": 846,
"submissionId": 3680,
"item": {
"submissionDataId": 12305,
"fieldId": 3746,
"fieldType": "MOBILE",
"fieldName": "Celular",
"value": "380737893456",
"confirmationTs": "2026-01-15 16:54:14"
}
},
"sign": "fe0da5443a9f5cadd0e972301415816cec481137"
}
form-contact-unsubscribe)Событие отправляется, если пользователь отписался через форму отписки.
{
"eventId": 45,
"eventType": "form-contact-unsubscribe",
"eventCreateTs": "2026-01-15 17:33:47",
"webhookId": 1,
"attempt": 1,
"data": {
"formId": 846,
"unsubscribeTs": "2026-01-15 17:33:46",
"items": [
{
"submissionId": 3675,
"submissionDataId": 12289,
"fieldId": 3745,
"fieldType": "EMAIL",
"fieldName": "E-mail",
"value": "test@mobizon.com",
"confirmationTs": ""
}
]
},
"sign": "06b78cf55ad19f9810babc415e86535384b74663"
}
Для проверки используется поле sign, вычисляемое по алгоритму SHA1.
Строка для подписи формируется в следующем порядке:
eventId|attempt|eventCreateTs|secretKey
Где secretKey — секретный ключ, указанный при создании вебхука.
$secretKey = 'secret123';
$payload = json_decode(file_get_contents('php://input'), true);
$hash = sha1(
$payload['eventId'] . '|' .
$payload['attempt'] . '|' .
$payload['eventCreateTs'] . '|' .
$secretKey
);
if (hash_equals($hash, $payload['sign'])) {
http_response_code(200);
} else {
http_response_code(403);
}
eventId и не обрабатывать одно и то же событие повторно.| Проблема | Возможная причина |
|---|---|
| Вебхук не приходит | URL недоступен или превышено число редиректов |
| Повторные уведомления | Сервер не вернул HTTP 200 вовремя |
| Подпись не совпадает | Неверный секретный ключ или порядок полей |
| Ошибка обработки | Отсутствует проверка структуры payload |
Вебхуки позволяют получать данные о статусах SMS и формах:
Корректная проверка подписи и аккуратная обработка повторных запросов обеспечивают надёжную интеграцию.