Meta Tech Provider

Отправка и получение WhatsApp в Node.js

Получение выполняется через маршрут, который отвечает на проверочный GET от Meta и принимает POST-запросы. Отправка выполняется вызовом fetch к Cloud API с phone number id и токеном номера. Наш SDK и установка не нужны.

2 handlers

GET для проверки Meta и POST для событий.

24 hours

Окно после сообщения клиента, в котором можно отправлять свободный текст.

131047

Ошибка, возвращаемая при отправке свободного текста вне этого окна.

Как получать сообщения в 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

Подключите номер на easycoexistence.com, укажите адрес вебхука на свой маршрут и возьмите phone number id и токен из панели управления. От US$ 9 за номер в месяц, до US$ 2 при большом объёме, первые 7 дней бесплатно.

Часто задаваемые вопросы

Нужна ли мне библиотека?

Нет. Достаточно маршрута и fetch, а вызов полностью соответствует документации Meta.

Это работает на Vercel или Lambda?

Да, с обычной оговоркой для serverless: сначала подтвердите получение, затем обработайте запрос через очередь или фоновый механизм, а не напрямую.

Как проверить, что запрос пришёл от Meta?

Проверьте заголовок подписи с помощью секрета приложения. Это стоит сделать сразу после публикации эндпоинта.

Можно ли использовать TypeScript?

Да. С нашей стороны нечего типизировать, поскольку полезная нагрузка принадлежит Meta и описана в её документации.

Читайте дальше

Готовы начать?

Настройте WhatsApp Coexistence за несколько минут, а не месяцев. Приложение продолжит работать на телефоне.

Начать бесплатный пробный период

Проверено по состоянию на

Отправка WhatsApp из Node.js