Получение сообщений через WebHook
WebHook позволяет получать входящие и исходящие сообщения на указанный URL вашего сервера в режиме реального времени. Это избавляет от необходимости постоянного опроса API и позволяет мгновенно реагировать на новые сообщения. Идеально для создания интерактивных сервисов и чат-ботов, которые должны обрабатывать сообщения без задержек.
Настройка Webhook URL
Для получения сообщений через webhook необходимо настроить URL вашего сервера в разделе Настройки > Данные и API > Webhook URL. На этот URL будут отправляться POST-запросы с данными о входящих и исходящих сообщениях в формате JSON.
Формат данных сообщения
{
"tip": "msg",
"msg_data": {
"msg_id": 1234567,
"qoute_msg_id": null,
"from_api": 0,
"from_me": 0,
"phone_acc": "79XXXXXXXXX",
"phone": "79001234567",
"chat_name": "Иван Петров",
"tip_msg": "textMessage",
"msg_text": "Добрый день, интересует ваше предложение",
"msg_link": null,
"date_ins": "2023-05-24 12:35:29",
"state": "received",
"senderId": null,
"senderName": null
}
}
Описание полей сообщения
Поле | Описание |
---|---|
tip | Тип события: "msg" - сообщение, "msg_state" - статус сообщения |
msg_id | Уникальный идентификатор сообщения |
qoute_msg_id | ID цитируемого сообщения (если сообщение является ответом) |
from_api | Флаг, указывающий на отправку через API: 0 - нет, 1 - да |
from_me | Направление сообщения: 0 - входящее, 1 - исходящее |
phone_acc | Номер телефона, подключенного к WAMM.chat |
phone | Номер телефона или ID чата получателя/отправителя |
chat_name | Имя контакта или название чата |
tip_msg | Тип сообщения: textMessage (текст), documentMessage (файл), imageMessage (изображение), audioMessage (голосовое/аудио), videoMessage (видео), location (местоположение), file_link (файл/изображение/голосовое) |
msg_text | Текст сообщения |
msg_link | Ссылка на файл (если применимо) |
date_ins | Дата и время отправки/получения |
state | Статус сообщения (sending, viewed, received, delivered и другие) |
senderId | ID или телефон отправителя (для групповых чатов) |
senderName | Имя отправителя (для групповых чатов) |
Формат данных статуса сообщения
{
"tip": "msg_state",
"msg_data": {
"msg_id": "1234567",
"date_upd": "2023-05-24 22:46:03",
"state": "delivered"
}
}
Описание полей статуса сообщения
Поле | Описание |
---|---|
msg_id | Номер сообщения |
date_upd | Дата получения статуса |
state | Статус сообщения (sending, viewed, received, delivered, deleted, not sent и другие) |
Обработка запросов на стороне сервера
Ваш сервер должен отвечать на webhook-запросы статусом HTTP 200. Если сервер не отвечает или возвращает код ошибки, WAMM.chat будет повторять еще 2 попытки отправки спустя 5-10 секунд.
Запросы выполняются последовательно, соблюдая порядок сообщений.
Пример обработки webhook на PHP
<?php
// Получаем данные из POST запроса
$input = file_get_contents('php://input');
$data = json_decode($input, true);
// Проверяем, что данные успешно декодированы
if ($data === null) {
http_response_code(400); // Bad Request
exit('Invalid JSON data');
}
// Всегда возвращаем статус 200, чтобы WAMM.chat знал, что запрос успешно обработан
header("HTTP/1.0 200 OK");
echo 'OK';
// Отправляем серверу WAMM.chat ответ и уже далее обрабатываем запрос сколько угодно продолжительно
fastcgi_finish_request();
// Лог для отладки (опционально)
file_put_contents('webhook_log.txt', date('Y-m-d H:i:s') . " - " . $input . PHP_EOL, FILE_APPEND);
// Обрабатываем сообщение
if (isset($data['tip'])) {
switch ($data['tip']) {
case 'msg':
// Обработка нового сообщения
processChatMessage($data['msg_data']);
break;
case 'msg_state':
// Обработка статуса сообщения
processMessageStatus($data['msg_data']);
break;
default:
// Неизвестный тип события
logUnknownEvent($data);
break;
}
}
// Функция обработки нового сообщения
function processChatMessage($message) {
// Проверяем, входящее или исходящее сообщение
if ($message['from_me'] == 0) {
// Входящее сообщение (от клиента)
$phone = $message['phone'];
$text = $message['msg_text'];
$msgId = $message['msg_id'];
// Пример: сохранение в базу данных
// saveMessageToDatabase($phone, $text, $msgId, 'incoming');
// Пример: автоматический ответ на определенные сообщения
if (strtolower($text) === 'привет') {
// Отправка автоматического ответа через API WAMM.chat
// sendReply($phone, 'Здравствуйте! Чем могу помочь?');
}
} else {
// Исходящее сообщение (от оператора)
// saveMessageToDatabase($message['phone'], $message['msg_text'], $message['msg_id'], 'outgoing');
}
}
// Функция обработки статуса сообщения
function processMessageStatus($status) {
$msgId = $status['msg_id'];
$state = $status['state'];
$dateUpd = $status['date_upd'];
// Пример: обновление статуса сообщения в базе данных
// updateMessageStatus($msgId, $state, $dateUpd);
// Логирование изменения статуса
$logMessage = "Сообщение ID: $msgId, новый статус: $state, дата обновления: $dateUpd";
// logStatus($logMessage);
}
// Функция для логирования неизвестных событий
function logUnknownEvent($data) {
// Записываем неизвестное событие в журнал для анализа
// logToFile('unknown_events.log', json_encode($data));
}
?>
Советы по реализации
- Всегда проверяйте подлинность запросов, например, по IP-адресам серверов WAMM.chat.
- Обрабатывайте каждый запрос быстро (не более 10 секунд), чтобы избежать таймаутов.
- Если обработка требует длительного времени, выполняйте основные задачи асинхронно (через очереди).
- Настройте мониторинг вашего webhook-обработчика для отслеживания его работоспособности.
Примечания
Сообщения отправляются на webhook URL только при наличии активного подключения к сервису WAMM.chat.
Если ваш webhook недоступен и сообщения не были доставлены, вы всегда можете получить их через
методы API msg_get_last
или msg_get
.