Перед началом работы
- Подключите и зарегистрируйте бизнес-номера телефонов WhatsApp, с которых будут отправляться сообщения.
- Сохраните свой API-ключ YCloud на сервере.
- Настройте подписанный эндпоинт Webhook для
whatsapp.message.updated. - Определите, как ваша система фиксирует согласие, отказы от рассылки, цель сообщений и сроки хранения данных.
- Назначьте ответственных за отправку, обработку Webhook и реагирование на инциденты.
Выбор эндпоинта отправки
Используйте асинхронный эндпоинт с очередью по умолчанию. Используйте прямую отправку только в тех случаях, когда приложению необходимо знать, принял ли WhatsApp отправку, прежде чем продолжить.
Успешный ответ от любого из эндпоинтов не является подтверждением доставки. Сохраните возвращенный
id сообщения и используйте события whatsapp.message.updated, чтобы узнать, находится ли сообщение в статусе sent, failed, delivered или read.
Создание одной внутренней записи об отправке
Создайте надежную запись перед вызовом API. Присвойте записи уникальный бизнес-ключ, например ID события заказа плюс цель сообщения. Обеспечьте эту уникальность на уровне вашей базы данных, чтобы параллельные воркеры не могли отправить одно и то же бизнес-событие дважды. Сохраняйте как минимум следующие данные:
Используйте непрозрачный
externalId, не содержащий содержимого сообщения или персональных данных. API рекомендует уникальное значение, но externalId является ссылочным полем. Оно не служит ключом идемпотентности на стороне сервера и не делает повторные запросы POST безопасными.
Связывание ответа с Webhook статуса
В следующем примере используются одинаковые идентификаторы на протяжении всего процесса отправки.1. Отправка сообщения
2. Сохранение принятого ответа
MESSAGE_ID, accepted и время ответа в существующей внутренней записи. Не помечайте бизнес-уведомление как доставленное.
3. Применение последующих событий статуса
whatsappMessage.id. Используйте externalId для бизнес-сверки и wamid для расследования на стороне провайдера.
Построение модели сходящихся статусов
Стандартная последовательность:accepted → sent → delivered → read. Статус failed может возникнуть до или после обновления sent. Webhook-уведомления могут дублироваться, задерживаться или приходить не по порядку. Обновление read также может прийти без отдельного события delivered.
Обрабатывайте каждое событие следующим образом:
- Проверяйте подпись Webhook по исходному (raw) телу запроса.
- Надежно сохраняйте событие, используя
idсобытия в качестве ключа дедупликации. - Своевременно возвращайте ответ
2xx, после чего обрабатывайте событие асинхронно. - Сопоставляйте
whatsappMessage.idс внутренней записью об отправке. - Сохраняйте статус события и доступные метки времени сообщения. Сохраняйте исходные метаданные события, необходимые для аудита, но удаляйте ненужный контент сообщения.
- Обновляйте текущее бизнес-представление, не отбрасывая противоречивые или более поздние данные. Рассматривайте
readкак подтверждение факта доставки, даже если отдельное событиеdeliveredотсутствует. - Запрашивайте
GET /whatsapp/messages/{id}, когда события конфликтуют, финальный статус задерживается сверх установленных целевых показателей обслуживания или если конвейер Webhook был недоступен.
Повторные попытки без создания дубликатов отправок
Классифицируйте ошибку перед повторной попыткой.
Безопасная политика на уровне приложения может начинаться с небольшого количества попыток, экспоненциальных задержек, полного джиттера и максимального времени ожидания. Это элементы управления на стороне приложения, а не гарантии API. Направляйте исчерпавшие лимит попыток запросы в очередь на проверку, а не повторяйте их бесконечно.
Перед каждой повторной попыткой:
- Блокируйте или атомарно резервируйте внутренний бизнес-ключ.
- Проверьте, содержит ли запись уже
idот YCloud или событие статуса. - Не используйте новый
externalId, чтобы скрыть более раннюю неоднозначную попытку. - Останавливайте попытки после достижения настроенного лимита количества или времени жизни.
- Требуйте явного действия оператора перед повторным выполнением неоднозначной отправки.
Выбор шаблонов и сессионных сообщений
Используйте одобренный шаблон сообщения при инициации бизнес-сообщения или отправке за пределами 24-часового окна обслуживания клиентов. Выбирайте категорию шаблона исходя из причины получения сообщения пользователем и храните его имя, язык и контракт переменных в конфигурации приложения. Используйте текстовые, медиа, интерактивные сообщения, геолокацию, контакты или реакции только тогда, когда окно обслуживания клиентов открыто и данный тип контента разрешен. Определяйте окно по последнему сообщению от клиента. Не делайте вывод об открытом окне на основе вашего последнего исходящего сообщения. См. раздел Управление шаблонами WhatsApp для получения информации о версионировании шаблонов, этапах согласования, локалях и откате изменений.Эффективная работа с медиафайлами
- Проверяйте поддерживаемый MIME-тип и размер файла перед загрузкой. Не повторяйте попытку загрузки неподдерживаемого или превышающего лимиты файла без изменений.
- Загружайте файлы от имени того бизнес-номера телефона, с которого будет отправлено сообщение.
- Используйте возвращенный ID медиафайла повторно для регулярных отправок одного и того же утвержденного ресурса, пока он остается действительным. Загруженные медиафайлы хранятся 30 дней.
- Сохраняйте контрольную сумму ресурса, MIME-тип, ID медиафайла, отправителя и срок действия, чтобы воркеры не загружали один и тот же файл для каждого получателя заново.
- Выполняйте повторную загрузку после истечения срока действия или при изменении контекста отправителя.
- Используйте публичный URL-адрес, если схема сообщения требует ссылки, включая медиафайлы в заголовках интерактивных сообщений.
- Передавайте большие файлы потоком из хранилища, задавайте таймауты запросов и удаляйте временные локальные файлы после использования.
Контроль согласия и минимизация данных
Перед отправкой фиксируйте источник согласия, цель, время и разрешенный канал связи. Применяйте самый актуальный подтвержденный отказ от рассылки во всех кампаниях, транзакционных процессах (где это требуется политикой), повторных попытках и ручных перезапусках. ДляPOST /whatsapp/messages задайте filterUnsubscribed: true и filterBlocked: true, если рабочий процесс должен соблюдать списки подавления YCloud. По умолчанию эти поля имеют значение false. Они не применяются к sendDirectly, поэтому процесс прямой отправки должен проверять статус подавления до вызова API.
Фильтры подавления — это окончательная мера безопасности, а не замена согласия. Храните только те идентификаторы и метаданные доставки, которые необходимы для указанной цели. Исключите ключи API, переменные шаблонов, тела сообщений и номера телефонов из общих журналов приложения. Настройте правила хранения и контроля доступа к записям сообщений и Webhook.
Контроль пропускной способности пакетов
Помещайте пакетные задачи в ограниченную очередь и отправляйте через фиксированный пул воркеров. Отслеживайте параллелизм раздельно по аккаунтам и бизнес-номерам телефонов, чтобы один отправитель или тенант не мог занять всех воркеров. Применяйте противодавление (backpressure) при увеличении любого из следующих сигналов:- ответы
429 - задержка запросов и таймауты
- ответы
5xx - время нахождения в очереди или накопление повторных попыток
- задержка Webhook и необработанные сообщения со статусом
accepted
accepted к каждому последующему статусу, глубину очереди, возраст самого старого элемента в очереди, количество повторных попыток, задержку Webhook, количество дедупликаций и расхождения при сверке. Настраивайте оповещения на устойчивые отклонения от нормального базового уровня, а не на единичные сбои сообщений.
Распространенные антипаттерны
- Пометка сообщения как доставленного, когда API возвращает
accepted. - Использование
externalIdв качестве ключа идемпотентности YCloud. - Повторная отправка каждого ответа, отличного от
2xx, или таймаута без ограничения количества попыток. - Использование
sendDirectlyдля всего трафика. - Предположение, что вебхуки уникальны, упорядочены или полны.
- Отправка сообщений в свободной форме за пределами окна обслуживания клиентов.
- Загрузка одного и того же медиафайла для каждого получателя.
- Использование фильтров подавления без фиксации согласия.
- Логирование ключей API, полных полезных нагрузок или избыточных персональных данных.
- Запуск пакетной обработки с неограниченным параллелизмом и без противодавления (backpressure).
Чек-лист перед запуском в продакшн
- Выбор эндпоинта соответствует рабочей нагрузке и требованиям к задержке.
- Правило уникальности в базе данных защищает внутренний бизнес-ключ.
- Для
externalId,idYCloud иwamidопределены и задокументированы отдельные роли. - Первоначальные ответы остаются неокончательными до получения подтверждения статуса.
- Протестированы подписи вебхуков, дедупликация событий, быстрое подтверждение получения и повторная обработка.
- Запланированная задача выборки сверяет задержанные или отсутствующие события.
- Ошибки, допускающие и не допускающие повторные попытки, имеют ограниченные сценарии обработки.
- Правила шаблонов и сессионных окон проверяются перед отправкой.
- Загрузка медиафайлов валидируется, файлы используются повторно, срок их действия отслеживается, а очистка выполняется безопасно.
- Проверены механизмы согласия, отписки, черных списков, хранения данных и логирования.
- Очереди пакетной обработки имеют ограничения параллелизма, противодавление, дашборды и алерты.
- Операторы могут приостанавливать отправку и проверять неоднозначные попытки без их автоматического повтора.
Отправка сообщения WhatsApp
Ознакомьтесь с типами запросов, полями, примерами и данными ответов.
Настройка Webhook
Проверяйте подписи и безопасно обрабатывайте повторные доставки событий.
Загрузка медиафайлов WhatsApp
Загружайте поддерживаемые медиафайлы и повторно используйте возвращенный media ID.
Обработка ошибок API
Парсите ответы с ошибками и применяйте ограниченные повторные попытки.

