Webhook позволяет получать входящие и исходящие сообщения из WAMM.chat на ваш сервер в реальном времени, без периодических запросов к API. WAMM.chat отправляет на указанный вами URL HTTP POST с телом в формате JSON при появлении или отправке сообщения в подключённом канале. Это удобно для чат-ботов, CRM и любых систем, которым нужна мгновенная реакция на переписку.

Настройка выполняется отдельно для каждого канала: Настройки → выберите канал связи → вкладка «Данные и API» → Webhook URL. URL должен быть доступен из интернета по HTTPS или HTTP. Если webhook временно недоступен, сообщения можно догрузить методами Получение сообщений или Получение сообщений по номеру телефона. Статусы доставки и прочтения приходят отдельными событиями.


Поддерживаемые мессенджеры

Уведомления о сообщениях через Webhook доступны для всех каналов: WhatsApp, MAX Personal, Telegram Personal, Telegram Bot..


Настройка Webhook URL

Укажите публичный адрес обработчика на вашем сервере, например:

https://example.com/wamm/webhook.php

На этот адрес WAMM.chat будет отправлять POST-запросы. Обработка на вашей стороне не должна занимать более 10 секунд (таймаут на стороне WAMM.chat). События доставляются последовательно, в порядке поступления.


Пример запроса

WAMM.chat выполняет запрос к вашему серверу:

POST https://example.com/wamm/webhook.php
Content-Type: application/json

Тело запроса (JSON):

{
    "tip": "msg",
    "msg_data": {
        "msg_id": 1234567,
        "from_api": 0,
        "from_me": 0,
        "phone_acc": "79001112233",
        "phone": "79001234567",
        "phone_real": "",
        "chat_name": "Иван Петров",
        "tip_msg": "textMessage",
        "msg_text": "Добрый день, интересует ваше предложение",
        "msg_link": null,
        "date_ins": "2023-05-24 12:35:29",
        "state": "received",
        "qoute_msg_id": null
    }
}

Для исходящих сообщений (в том числе отправленных через API) поле from_me равно 1, для входящих — 0. Поле from_api равно 1, если сообщение отправлено через API WAMM.chat.


Параметры запроса (поля JSON)
ПолеТипОбязательныйОписание
tipstringДаТип события. Для сообщений всегда msg
msg_idintegerДаУникальный идентификатор сообщения в WAMM.chat
from_meintegerДаНаправление: 0 — входящее, 1 — исходящее
from_apiintegerДаОтправлено через API: 0 — нет, 1 — да
phone_accstringДаНомер или идентификатор канала, подключённого к WAMM.chat
phonestringДаНомер телефона контакта или ID чата (для Telegram и MAX — часто ID чата)
phone_realstringНетТелефон или никнейм контакта, если известен (для Telegram/MAX, когда phone — ID чата)
chat_namestringНетИмя контакта или название чата
tip_msgstringДаТип содержимого: textMessage, documentMessage, imageMessage, audioMessage, videoMessage, location, file_link, contactMessage и др.
msg_textstringНетТекст сообщения (для файлов может быть пустым или служебным)
msg_linkstringНетСсылка на файл или имя файла, если применимо
date_insstringДаДата и время сообщения (YYYY-MM-DD HH:MM:SS, часовой пояс — Europe/Moscow)
statestringДаСтатус в момент события: received, sent, sending и др.
qoute_msg_idstring / integerНетID цитируемого сообщения в мессенджере, если сообщение — ответ (имя поля в JSON именно qoute_msg_id)

Ответ при успехе

Ваш обработчик должен ответить HTTP-кодом 200, 202 или 204. Тело ответа может быть любым (например, OK). Без успешного ответа WAMM.chat считает доставку неуспешной и повторит отправку.

HTTP/1.1 200 OK
Content-Type: text/plain

OK

Возможные ошибки
СитуацияПоведение WAMM.chat
Ответ не 200 / 202 / 204Повторная отправка того же события (до 3 попыток с увеличивающимся интервалом)
Таймаут или недоступность URL (> 10 сек, сеть, DNS)Повторная отправка; в настройках канала может фиксироваться время последней ошибки webhook
Webhook URL не задан или канал не на связиСобытия не отправляются; используйте msg_get_last / msg_get
Некорректный JSON в теле ответа вашего сервераНе влияет на приём webhook; важен только HTTP-код ответа

Примеры использования
<?php
// webhook.php — обработчик Webhook WAMM.chat (события tip = msg)

$input = file_get_contents('php://input');
$data  = json_decode($input, true);

if (!is_array($data)) {
    http_response_code(400);
    exit('Invalid JSON');
}

// Сразу подтверждаем приём (до долгой обработки)
http_response_code(200);
header('Content-Type: text/plain');
echo 'OK';

if (function_exists('fastcgi_finish_request')) {
    fastcgi_finish_request();
}

if (($data['tip'] ?? '') !== 'msg' || empty($data['msg_data'])) {
    exit;
}

$msg = $data['msg_data'];

// Пример: только входящие от клиента
if ((int)($msg['from_me'] ?? 0) === 0) {
    $phone   = $msg['phone'] ?? '';
    $text    = $msg['msg_text'] ?? '';
    $msgId   = $msg['msg_id'] ?? 0;
    // saveIncomingMessage($phone, $text, $msgId);
}

// Пример: ответ через API (нужен токен канала)
// if (mb_strtolower($text) === 'привет') {
//     file_get_contents('https://wamm.chat/api2/msg_to/YOUR_TOKEN/?phone=' . urlencode($phone) . '&text=' . urlencode('Здравствуйте!'));
// }

Безопасность: для дополнительной защиты можно ограничить доступ к обработчику по IP-адресам серверов WAMM.chat (см. раздел Интеграция API). Рекомендуется логировать сырые тела запросов на этапе отладки и обрабатывать повторные доставки идемпотентно по msg_id.