Отправка и получение WhatsApp в Node.js
Получение выполняется через маршрут, который отвечает на проверочный GET от Meta и принимает POST-запросы. Отправка выполняется вызовом fetch к Cloud API с phone number id и токеном номера. Наш SDK и установка не нужны.
GET для проверки Meta и POST для событий.
Окно после сообщения клиента, в котором можно отправлять свободный текст.
Ошибка, возвращаемая при отправке свободного текста вне этого окна.
Как получать сообщения в Node?
Один маршрут с двумя методами, в Express, Fastify, обработчике маршрута Next или на обычном сервере.
GET отвечает на проверку Meta: прочитайте hub.mode, hub.verify_token и hub.challenge из параметров запроса, сравните токен со своим и верните challenge как обычный текст. Возврат в JSON является типичной ошибкой: эндпоинт выглядит корректно, но никогда ничего не получает.
POST принимает события. Сразу ответьте кодом 200, а обработку выполните после этого. Meta повторяет медленные запросы, поэтому обработчик, который сначала выполняет работу, получит одно и то же сообщение несколько раз. Особенно в serverless нужно сначала вернуть ответ, а затем поставить работу в очередь, чтобы холодный старт не создавал дубликаты.
Как отправлять сообщения?
Выполните fetch к messages endpoint Cloud API для phone number id, передав токен в bearer-заголовке.
Здесь нет ничего специфичного для нас, поэтому запрос полностью соответствует документации Meta и не требует изучения оболочки или привязки к ней. Оба значения находятся в панели управления, а get_api_credentials возвращает их через коннектор MCP, если подключение выполняет ассистент.
Тело запроса зависит от времени. В течение 24 часов после последнего входящего сообщения клиента отправляйте объект text. После этого отправляйте объект template с одобренными именем шаблона и языком. Код, который отправляет только text, проходит все тесты, но ломается при первом сообщении, пришедшем ночью.
Что меняется в serverless?
Два момента, и оба связаны с завершением функции до окончания работы.
Возврат 200 с продолжением обработки не работает в функции, которая замораживается сразу после ответа. Используйте механизм своей платформы для продолжения работы после ответа либо помещайте полезную нагрузку в очередь, чтобы отдельная функция обработала её. Meta нужно быстрое подтверждение, а не завершённая обработка.
Холодный старт также повышает вероятность медленного ответа, а значит, повторных запросов и дубликатов. Удаление дубликатов по идентификатору сообщения wamid обязательно в такой схеме, именно оно делает её надёжной.
Распространённые ошибки
- Возврат challenge в JSON вместо необработанного тела ответа.
- Выполнение работы до ответа 200. В serverless функция может заморозиться сразу после ответа.
- Отсутствие удаления дубликатов. Meta специально повторяет запросы, поэтому дубликаты обычны, а не исключение.
Подключите номер на easycoexistence.com, укажите адрес вебхука на свой маршрут и возьмите phone number id и токен из панели управления. От US$ 9 за номер в месяц, до US$ 2 при большом объёме, первые 7 дней бесплатно.
Часто задаваемые вопросы
Нужна ли мне библиотека?
Нет. Достаточно маршрута и fetch, а вызов полностью соответствует документации Meta.
Это работает на Vercel или Lambda?
Да, с обычной оговоркой для serverless: сначала подтвердите получение, затем обработайте запрос через очередь или фоновый механизм, а не напрямую.
Как проверить, что запрос пришёл от Meta?
Проверьте заголовок подписи с помощью секрета приложения. Это стоит сделать сразу после публикации эндпоинта.
Можно ли использовать TypeScript?
Да. С нашей стороны нечего типизировать, поскольку полезная нагрузка принадлежит Meta и описана в её документации.
Читайте дальше
Готовы начать?
Настройте WhatsApp Coexistence за несколько минут, а не месяцев. Приложение продолжит работать на телефоне.
Начать бесплатный пробный периодПроверено по состоянию на