Полный каталог, сформированный на основе схемы, см. в разделе Все примеры.
Что это такое
Обработка обновлений сообщений для WhatsApp, Messenger, Email, SMS и голосовых сообщений.Перед началом работы
- Создайте общедоступную конечную точку HTTPS в своем приложении.
- Настройте конечную точку Webhook YCloud для необходимых типов событий.
- Надежно сохраните секретный ключ подписи конечной точки.
- Обеспечьте идемпотентность обработки событий.
Принцип работы
YCloud отправляет HTTP-запросPOST при возникновении события. Проверьте подпись, надежно сохраните событие, верните ответ 2xx и выполняйте длительные операции асинхронно.
Запрос
Приведенные ниже сценарии демонстрируют запросы, доставляемые на ваш URL Webhook. Используйтеid события в качестве идентификатора доставки, а type — для маршрутизации полезной нагрузки.
Ответ
После принятия события верните статус2xx.
Сведения о настройке конечной точки, проверке подписи и логике повторных попыток см. в разделе Настройка Webhook.
accepted. Обновления статуса сообщения будут вызывать Webhook whatsapp.message.updated.
Обычно статус сообщения:
- Изменяется на
failed, если нам не удается доставить это сообщение. - Изменяется на
sent, если доставить это сообщение возможно, а позже может измениться наfailed,deliveredилиread. - Изменяется на
deliveredилиread, если это сообщение было доставлено на устройство получателя.
delivered могут происходить после failed и наоборот, особенно если конечный пользователь использует несколько устройств.
Сообщение отправлено
В этом случае ваша конечная точка Webhook получила событие сообщенияsent:
- Параметр
statusсообщения имеет значениеsent, что означает, что сообщение находится в процессе передачи в системах WhatsApp. - Содержит информацию о переписке, включая время истечения срока действия переписки и исходный тип.
- Содержит предварительные значения
pricingCategoryиtotalPrice, которые могут быть списаны. - Содержит
wamid— исходный идентификатор сообщения на платформе WhatsApp, начинающийся сwamid..
Запрос
Ответ
Подтвердите доставку после надежного сохранения события.Пояснение
-
totalPriceявляется лишь предварительной ценой до доставки первого сообщения и становится окончательной ценой, когдаstatusпринимает значениеdeliveredилиread. Баланс, зарезервированный под отправленные, но еще не доставленные сообщения, будет недоступен до тех пор, пока сообщения не будут аннулированы (отправленные сообщения, которые не были доставлены в течение 30 дней, аннулируются). -
Как правило, сообщение со статусом
sentвскоре переходит в статусdeliveredилиread, за исключением следующих случаев:- Аккаунт WhatsApp получателя находится не в сети; ваши отправленные сообщения WhatsApp не будут доставлены, пока у получателя не появится работающее или активное подключение к интернету.
- Любое сообщение, отправленное заблокировавшему вас контакту, всегда будет иметь статус
sentи никогда не изменится наdelivered. - Получатель отключил отчеты о прочтении, поэтому вы не получите отчеты о статусе
read. - Сообщение позже переходит в статус
failedс кодом ошибки131026, что означает «Message Undeliverable.» («Невозможно доставить сообщение») или «Receiver is incapable of receiving this message» («Получатель не может принять это сообщение»). Скорее всего, получатель не зарегистрирован или использует устаревшую версию WhatsApp. - Сообщение не было доставлено для обеспечения высокого качества взаимодействия с пользователем. См. раздел Ограничения маркетинговых сообщений по шаблону на пользователя.
Сообщение доставлено
В этом случае ваша конечная точка Webhook получила событие сообщенияdelivered:
- Параметр
statusсообщения имеет значениеdelivered, что означает, что сообщение было доставлено на устройство получателя.
Запрос
Ответ
Подтвердите доставку после надежного сохранения события.Пояснение
- Это событие указывает на то, что сообщение, отправленное вашей компанией, было доставлено на устройство пользователя.
- Чтобы статус стал
read, он обязательно должен был бытьdelivered. В некоторых сценариях, например, когда пользователь находится на экране чата и поступает сообщение, оно переходит в статусыdeliveredиreadпрактически одновременно. В этом и подобных сценариях уведомлениеdeliveredотправляться не будет, так как факт прочтения сообщения подразумевает, что оно было доставлено. Причиной такого поведения является внутренняя оптимизация. - Мы можем сгенерировать более одного события Webhook
deliveredдля одного и того же сообщения, особенно если конечный пользователь использует несколько устройств. - pricingModel: «PMP» — указывает, что применяется тарификация за каждое сообщение. См. также whatsapp-message-pricing-updates
- pricingType
- regular — указывает, что сообщение подлежит оплате.
- free_customer_service — указывает, что сообщение бесплатно, так как оно либо являлось сервисным шаблонным сообщением, либо нешаблонным сообщением, отправленным в рамках окна обслуживания клиентов.
- free_entry_point — указывает, что сообщение бесплатно, так как оно является частью переписки из бесплатной точки входа.
Сообщение прочитано
В этом случае ваша конечная точка Webhook получила событие сообщенияread:
- Поле
statusсообщения имеет значениеread, что означает, что сообщение было прочитано получателем.
Запрос
Ответ
Подтвердите доставку после надёжного принятия события.Объяснение
- Если получатель отключил отчёты о прочтении, вы не получите уведомления
readдля сообщения.
Сбой доставки сообщения
В этом случае ваша конечная точка Webhook получила событие сообщенияfailed:
- Поле
statusсообщения имеет значениеfailed. - Содержит
errroCode,errorMessageиwhatsappApiError.
Запрос
Ответ
Подтвердите доставку после надёжного принятия события.Объяснение
- Эти события предназначены для уведомления об изменениях статуса исходящих сообщений, ранее отправленных клиентам.
- Причиной сбоя отправки обычно являются неверные параметры запроса сообщения, незарегистрированный номер телефона клиента и т. д. Дополнительные сведения об обработке ошибок см. в разделе Ошибки WhatsApp.
- Поле
whatsappApiErrorпредоставляется, если мы пытались отправить это сообщение на платформу WhatsApp компании Meta, чтобы помочь вам разобраться в деталях ошибки. См. также Коды ошибок Cloud API. - Плата за недоставленные сообщения не взимается.
Обновление статуса доставки Email
Используйтеemail.delivery.updated, когда статус доставки электронного письма меняется на delivered или failed.
Запрос
Ответ
Подтвердите доставку после надёжного принятия события.Объяснение
Сопоставьте доставку с помощьюemailId и recipientAddress: статус относится к этому получателю. Используйте externalId (при наличии) для сопоставления с вашей собственной записью. Проверьте errorCode и errorMessage в случае неудачной доставки. Свойство полезной нагрузки — emailDelivery, а не whatsappMessage.
Обновление статуса доставки SMS
Используйтеsms.message.updated, когда статус доставки SMS меняется на delivered или undelivered.
Запрос
Ответ
Подтвердите доставку после надёжного принятия события.Объяснение
Идентифицируйте SMS с помощьюsms.id и прочитайте sms.status. Проверьте errorCode в случае неудачной доставки. Для отрицательного отчёта о доставке в SMS используется undelivered; не применяйте модель статусов WhatsApp read к этому событию.
Обновление статуса голосовой доставки
Используйтеvoice.message.updated, когда статус голосового сообщения меняется на delivered или undelivered.
Запрос
Ответ
Подтвердите доставку после надёжного принятия события.Объяснение
Идентифицируйте голосовое сообщение с помощьюvoice.id и прочитайте voice.status. Проверьте errorCode (при наличии). Это событие доставки относится к Voice messaging API; оно отделено от событий жизненного цикла WhatsApp Calling.
Снимок статуса прочтения исходящего сообщения Messenger
Подпишитесь наmessenger.message.updated для получения сохранённых снимков обычных индивидуальных исходящих сообщений. При повторной попытке доставки сохраняется Event.id; повторное создание события из того же исходного факта может привести к созданию нового Event.id. Сопоставляйте обновления по messengerMessage.id.
Состояния отправки и получения
accepted означает, что Meta приняла отправку, а не то, что сообщение было sent или delivered. rejected является окончательным отклонением отправки; unknown — это неподтверждённый результат, который нельзя рассматривать как сбой. Не отправляйте сообщение повторно автоматически после истечения времени ожидания или результата unknown. Проверьте его сохранённый статус с помощью возвращённого ID сообщения (если доступен) или обратитесь в службу поддержки.
Снимок сохраняет текущие зафиксированные факты, при этом read имеет приоритет над delivered, sent и результатом отправки. Запоздалые подтверждения не понижают это состояние. Вы можете получать повторные снимки или пропускать промежуточные состояния. Используйте GET /v2/messenger/messages/{id} с from или выполните запрос по подтверждённому ID сообщения Meta для согласования текущего сохранённого состояния.
Уведомления о результатах отправки доставляются по мере возможности (best effort). Не полагайтесь на получение Webhook для каждого синхронного результата отправки. Необязательные идентификаторы, errorCode и время получения опускаются, если они недоступны. Сохранённая ошибка отправки может оставаться, даже если последующие факты получения устанавливают более сильное состояние.
Запрос
Ответ
Объяснение
ID страницы Facebook —from, а PSID клиента — to. В этом примере показано сохранённое состояние read без домысливания недостающих sendTime или deliverTime. id — это ID сообщения YCloud, а metaMessageId — идентификатор провайдера.
Реакция на сообщение в Messenger
Запрос
Ответ
Объяснение
ИспользуйтеpageId и psid для идентификации переписки, а metaMessageId — для идентификации целевого сообщения. Реакция является взаимодействием и не меняет статус доставки. Для целевого сообщения может отсутствовать локальная запись сообщения YCloud. Сохраняйте исходный createTime; возможна повторная доставка. Проверьте YCloud-Signature по необработанному телу запроса перед возвратом успешного ответа.
Реакция на сообщение в Messenger удалена
Запрос
Ответ
Пояснение
Удалите реакцию, связанную с этой Страницей, PSID клиента и целевым сообщением Meta.unreact может опускать reaction и emoji. Не требуйте наличия локального ID сообщения и не делайте вывод об изменении статуса сообщения. При повторных попытках доставки по HTTP сохраняются тот же ID события и тело запроса; повторные обратные вызовы от источника могут создавать новый ID события. Проверьте YCloud-Signature по необработанному телу запроса перед возвратом успешного ответа.
