Обработка входящих (Webhook)
Webhook служит для обработки входящих событий, ответов на асинхронные запросы и информацию об ошибках. Например, при приеме входящего сообщения в мессенджере, на указанный webhook отправляется POST-запрос:
{ "id":18, "whatsapp_id":"191b80a9238", "event_action":"message", "event_date":"2022-09-07 18:29:37", "status_code":null, "event_data": { "message": { "_id" : "3EB0436AE1E682FF3A37", "id":"false_79999999999@c.us_3EB0436AE1E682FF3A37", "ack":1, "hasMedia":false, "mediaKey":"", "body":"212", "type":"chat", "timestamp":1662575377, "from":"79991112233@c.us", "to":"79999999999@c.us", "isForwarded":false } } }
Для подтверждения успешного приема события, webhook должен отправить JSON-объект, в котором должен быть указан идентификатор входящего события и статус OK
{ "result" : "OK", "id" : 18 }
Если система не получит в ответ корректного сообщения, то запрос повторится 3 раза, через каждые 20 секунд.
Установка Webhook-a
Установка Webhook в личном кабинете
Для установки ссылки на обработчик Webhook, зайдите в личный кабинет, выберите блок привязанного Whatsapp-месенджера, нажмите 3 точки и выберите редактировать.
В открывшемся окне укажите ссылку на скрипт-обработчик Webhook-a
Нажмите «Сохранить»
Установка Webhook через API
Для установления или деактивации WebHook-a по API используйте метод set-hook. Инициируем POST-запрос на адрес:
https://whatsgate.ru/api/v1/set-hook
В теле запроса передается объект:
{ "WhatsappID": "YOUR_WHATSAPP_ID", "callback": "https://callback.my/script.handler" }
- WhatsappID - идентификатор Whatsapp в системе
- callback - URL обработчика обработчика входящих событий
Объект успешного ответа на запрос
{ "result": "OK" }
Типы событий
Ready
Событие отправляется после авторизации, когда клиент полностью готов к отправке и приему сообщений. Статус сессии изменяется с AUTH на READY. Поле event_action содержит строку «ready» Поле event_data содержит данные об авторизованном аккаунте - его номер и имя.
- pushname - имя клиента в мессенджере
- number - номер авторизованного телефона
- id - whatsapp идентификатор в формате @c.us
{ "id":19, "whatsapp_id" : "191b80a9238", "event_action" : "ready", "event_date" : "2023-01-24 18:29:37", "status_code" : null, "event_data" : { "pushname": "vasya", "number" : "79991234567", "id" : "79991234567@c.us" } }
Message
Событие отправляется при любом входящем сообщении в чате или группе. Поле event_action содержит строку «message» Поле event_data содержит объект сообщения
{ "id":18, "whatsapp_id":"191b80a9238", "event_action":"message", "event_date":"2022-09-07 18:29:37", "status_code":null, "event_data": { "message": { "_id":"3EB0436AE1E682FF3A37", "id":"false_79999999999@c.us_3EB0436AE1E682FF3A37", "ack":1, "hasMedia":false, "mediaKey":"", "body":"212", "type":"chat", "timestamp":1662575377, "from":"79991112233@c.us", "to":"79999999999@c.us", "isForwarded":false } } }
Sent
Событие отправляется после успешной доставки сообщения, в том случае, если была отправлена асинхронная команда отправки сообщения.
Поле event_action содержит строку «sent» Поле event_data содержит объект сообщения, которое было доставлено
{ "id":19, "whatsapp_id":"191b80a9238", "event_action":"sent", "event_date":"2022-09-07 18:29:37", "status_code":null, "event_data": { "message": { "_id":"3EB0436AE1E682FF3A37", "id":"false_79999999999@c.us_3EB0436AE1E682FF3A37", "ack":1, "hasMedia":false, "mediaKey":"", "body":"212", "type":"chat", "timestamp":1662575377, "from":"79999999999@c.us", "to":"79991112233@c.us", "isForwarded":false } } }
Ack
Событие отправляется при изменении статуса сообщения в чате или группе. Поле event_action содержит строку «ack» Поле event_data содержит объект сообщения, статус которого был изменен. Статус сообщения содержится в объекте сообщения, в поле ack и может принимать следующие значения: 1 - отправлено, 2 - доставлено, 3 - прочитано
{ "id":19, "whatsapp_id":"191b80a9238", "event_action":"ack", "event_date":"2022-09-07 18:29:37", "status_code":null, "event_data": { "message": { "_id":"3EB0436AE1E682FF3A37", "id":"false_79999999999@c.us_3EB0436AE1E682FF3A37", "ack":1, "hasMedia":false, "mediaKey":"", "body":"212", "type":"chat", "timestamp":1662575377, "from":"79999999999@c.us", "to":"79991112233@c.us", "isForwarded":false } } }
Disconnect
Событие отправляется, когда клиент отсоединяется и закрывается. Это происходит в случаях, когда Вы удаляете клиент из личного кабинета сервиса, или отзываете привязку в приложении Whatsapp на телефоне. Поле event_action содержит строку «disconnect» Поле event_data содержит объект с полем reason, в котором указана причина дисконнекта.
{ "id":19, "whatsapp_id":"191b80a9238", "event_action":"disconnect", "event_date":"2022-09-07 18:29:37", "status_code":null, "event_data": { "reason": "Client disconnected" } }
Error
Событие отправляется когда происходит какая-либо ошибка. Например, когда Вы пытаетесь асинхронно отправить сообщение не из своего контакт-листа на тарифе Light. Поле event_action содержит строку «error» Поле event_data содержит объект с описанием ошибки.
{ "id":19, "whatsapp_id":"191b80a9238", "event_action":"error", "event_date":"2022-09-07 18:29:37", "status_code":null, "event_data": { "error":"Specified number not in your contact list" } }
Объект сообщения
{ "_id":"3EB0436AE1E682FF3A37", "id":"false_79999999999@c.us_3EB0436AE1E682FF3A37", "ack":1, "hasMedia":false, "mediaKey":"", "body":"212", "type":"chat", "timestamp":1662575377, "from":"79999999999@c.us", "to":"79991112233@c.us", "isForwarded":false, "quoted": { "_id": "3EB07621A4D08F9F59E0", "from": "79537226631@c.us", "type": "chat", "body": "Hello!" } }
Поля объекта сообщения:
- _id - идентификатор сообщения в WhatsApp.
- id - идентификатор сообщения в Whatsapp, который можно указывать при отправке в поле «quote», для указания того, что сообщение является ответом на указанное сообщение.
- ack - (int) флаг, показывающий, было ли сообщение просмотрено получателем, принимает следующие значения: 1 - отправлено, 2 - доставлено, 3 - прочитано
- hasMedia - флаг, указывающий на то, содержит ли сообщение медиа-файл
- mediaKey - ключ медиа-файла, который необходимо указать в методе get-media для получения media-файла.
- body - текст сообщения
- type - тип сообщения
- timestamp - дата сообщения в формате unix-timestamp
- from - указывает идентификатор отправителя сообщения
- to - указывает идентификатор получателя сообщения
- isForwarded - признак того, было ли сообщение перенаправлено с другого чата
- quoted - Если данное сообщение цитирует (является ответом на) сообщение, то в поле quoted находится объект, с параметрами цитируемого сообщения.
- _id - Идентификатор цитируемого сообщения
- from - Идентификатор автора цитируемого сообщения
- type - Тип цитируемого сообщения
- body - Текст цитируемого сообщения
Код PHP для обработки запроса webhook
<?php //буферизируем вывод ob_start(); var_dump('----------------------' . date('d.m.Y H:i:s') . '----------------'); // вытаскиваем данные запроса $input = file_get_contents('php://input'); $input_data = json_decode($input, true); var_dump($input_data); if($input_data['event_action'] == 'message') { //@TODO обрабатываем входящее сообщение } if($input_data['event_action'] == 'ack') { //@TODO обрабатываем получение или доставку if($input_data['event_data']['message']['ack'] == 2) { //@TODO доставка } if($input_data['event_data']['message']['ack'] == 3) { //@TODO прочитано } } //сохраняем лог $fo = fopen('webhook.log', 'a'); fwrite($fo, ob_get_clean()); fclose($fo); //формируем и выводим ответ $answer_data = [ 'id' => $input_data['id'], 'result' => 'OK' ]; echo json_encode($answer_data); ?>