Перейти к основному содержанию

Что это такое

Webhooks — это HTTPS-запросы, которые YCloud отправляет вашему приложению при изменении статуса доставки сообщений, входящих сообщений, контактов, шаблонов, вызовов и других ресурсов.

Перед началом работы

  • Сохраните свой API-ключ YCloud в YCLOUD_API_KEY.
  • Разверните общедоступную конечную точку HTTPS.
  • Сохраняйте исходное тело запроса (raw body) для проверки подписи.
  • Определите, какие типы событий требуются вашему приложению.

Как это работает

  1. Создайте конечную точку Webhook и подпишите ее на нужные типы событий.
  2. Сохраните возвращенный secret конечной точки.
  3. YCloud отправляет запрос события на вашу конечную точку.
  4. Проверьте YCloud-Signature, прежде чем доверять запросу.
  5. Своевременно верните ответ 2xx.
  6. Обрабатывайте событие идемпотентно, так как доставка может повторяться.

Запрос

Создайте конечную точку с помощью POST /webhookEndpoints.

Поля запроса

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

Подписка на события echo и handover

Для Agents, подключенных через общедоступный REST API, создайте конечную точку со следующими подписками. Agents, созданные через Console, не отправляют эти три события. Чтобы изменить существующую конечную точку, сохраните подписки на события, которые вам по-прежнему необходимы.
Оба типа событий echo передают стандартную полезную нагрузку whatsappMessage в формате сообщения. Событие handover передает whatsappMetaBusinessAgent и сохраняет информацию об Agent/управлении. Они не используют контракт whatsapp.smb.message.echoes WhatsApp Business App. См. сведения о событиях echo и handover для определений полей, примеров, порядка и ограничений корреляции handover.

Подписка на события сообщений Messenger

Укажите необходимые имена событий в enabledEvents при создании или обновлении конечной точки. Например, чтобы подписаться на все четыре:
В Dashboard новая конечная точка создается без выбранных событий. При выборе категории Messenger выбираются все доступные в ней события, включая редактирование и реакции. Затем вы можете отменить выбор отдельных событий. Существующие подписки не включают автоматически новые события редактирования или реакций. При обновлении конечной точки обязательно сохраняйте подписки, которые вам все еще нужны. При редактировании сохраняются те же messengerInboundMessage.id и metaMessageId, заменяется text.body и добавляются editCount и editTime. Поля сообщения sendTime и createTime остаются неизменными; оболочка события createTime указывает время редактирования. В неотредактированных сообщениях поля редактирования отсутствуют. Обновляется только существующее входящее сообщение. Более ранние правки игнорируются; недостающие сообщения и история правок не восстанавливаются. Сопоставляйте обновления по ID сообщения и используйте накопительный счетчик, чтобы предотвратить применение более старого текста поверх более новой версии. Повторные попытки источника могут создавать другой ID события для той же сохраненной правки. См. пример редактирования входящего сообщения. События реакций содержат pageId, psid отреагировавшего клиента, целевой metaMessageId и action (react или unreact). Необязательные поля reaction и emoji могут отсутствовать, особенно для unreact. Реакция не меняет статус доставки сообщения. Целевое сообщение может быть создано вне YCloud API, поэтому событие не требует локальной записи сообщения и не содержит локальный ID сообщения. Поле события createTime сохраняет время исходного взаимодействия. Повторные попытки доставки клиенту сохраняют его id события и полезную нагрузку. Обработка обратного вызова источником может приводить к созданию другого ID события для повторяющегося взаимодействия; не используйте ID событий в качестве идентификаторов реакций или сообщений. См. примеры полезной нагрузки реакций для обоих действий.

Ответ

В ответе возвращается созданная конечная точка и ее secret для подписи. Храните секрет в безопасности. YCloud использует его для создания подписей Webhook.

Пример ответа

Поля ответа

Получение событий

Запрос события

YCloud отправляет JSON-объект события на настроенный url. Событие содержит общие поля, такие как id, type, apiVersion и createTime, а также полезную нагрузку, зависящую от типа события. Ваш обработчик должен:
  1. Считывать необработанное тело запроса (raw request body).
  2. Проверять заголовок YCloud-Signature с помощью секрета эндпоинта перед тем, как доверять полезной нагрузке.
  3. Своевременно возвращать успешный ответ 2xx.
  4. Переносить длительную обработку в очередь.
  5. Обеспечивать идемпотентность обработки событий, чтобы повторная доставка не дублировала бизнес-действия.
Не парсите и не изменяйте тело запроса до валидации подписи. Используйте в точности те исходные байты, которые были получены вашим сервером.

Ответ получателя

Возвращайте успешный HTTP-ответ 2xx, как только подпись и запрос будут приняты. Тело ответа может быть пустым.
Переносите длительную бизнес-обработку в очередь. Таймаут или ответ, отличный от 2xx, может привести к повторной отправке события со стороны YCloud, поэтому дедуплицируйте события по id.

Примеры стандартных полезных нагрузок

Разверните событие, чтобы просмотреть полный пример его полезной нагрузки. Эти примеры взяты из спецификации OpenAPI для webhook. См. раздел все примеры полезной нагрузки вебхуков для каждого поддерживаемого типа событий.
Пример полезной нагрузки при изменении атрибутов контакта
Пример полезной нагрузки при создании нового контакта
Пример полезной нагрузки при удалении контакта
Пример полезной нагрузки при отмене подписки клиентом
Пример полезной нагрузки при возобновлении подписки клиентом
Пример полезной нагрузки при архивации шаблона WhatsApp
Пример полезной нагрузки при разархивации шаблона WhatsApp. Статус шаблона является текущим статусом, возвращенным Meta, и не означает прохождение новой проверки на одобрение.
Пример полезной нагрузки при установке соединения вызова WhatsApp
Пример полезной нагрузки при завершении вызова WhatsApp
Пример полезной нагрузки при обновлении статуса вызова WhatsApp
См. раздел Полезные нагрузки событий Webhook для получения полной схемы Event и интерактивного справочника полезных нагрузок.

Ротация секрета эндпоинта

Выполните ротацию секрета в случае его компрометации или в соответствии с вашей политикой безопасности:
Разверните новый секрет на вашем приемнике сразу после ротации.
Эндпоинт, который неоднократно не может принять уведомления, может перейти в статус pending и прекратить получение событий. Отслеживайте сбои доставки Webhook и статус эндпоинта.
Информацию о коде проверки подписи, интервалах повторных попыток и реализации приемника см. в статье Реализация приемника Webhook.