Все статьи
SMS- и голосовые события поступают как вебхуки в локальный обработчик разработки.
Twiliowebhook debuggingSMSlocal testing

Тестирование вебхуков Twilio локально: полное руководство

Локальное тестирование вебхуков Twilio позволяет получать ответы по SMS, голосовые колбэки и обновления статуса сообщений прямо на вашей машине. Twilio отправляет вебхуки как HTTP-POST-запросы с form-encoded payload — вашему localhost нужен публичный HTTPS-URL, чтобы принимать их во время разработки.

Почему колбэкам Twilio нужен публичный URL

Когда кто-то отправляет SMS на ваш номер Twilio или завершает звонок, Twilio делает POST с данными события на настроенный URL вебхука. Локальные адреса вроде http://localhost:3000/sms недоступны из инфраструктуры Twilio. Туннель к localhost устраняет этот разрыв с помощью публичного HTTPS-эндпоинта.

Типы вебхуков Twilio для локального тестирования

  • Входящие SMS: когда пользователь отправляет текстовое сообщение на ваш номер Twilio.
  • Статус-колбэки SMS: подтверждения доставки (sent, delivered, failed).
  • Голосовые колбэки: TwiML-запросы при подключении звонка или входе в меню.
  • Мессенджинг WhatsApp: входящие и статусные вебхуки WhatsApp Business API.
  • Conversations API: события добавления сообщения и участников.

Пошагово: локальное тестирование вебхуков Twilio

  1. Запустите локальное приложение с маршрутами вебхуков Twilio (например, /sms/inbound).
  2. Выполните npx portpreview 3000, чтобы получить публичный HTTPS-URL.
  3. В консоли Twilio задайте URL вебхука вашего номера как URL туннеля плюс путь маршрута.
  4. Настройте HTTP-метод (обычно POST) и убедитесь, что content type соответствует вашему обработчику.
  5. Отправьте тестовое SMS или сделайте тестовый звонок, чтобы запустить вебхук.
  6. Изучите захваченный запрос — Twilio отправляет form-encoded payload, а не JSON.
  7. Убедитесь, что обработчик валидирует подпись Twilio и возвращает корректный TwiML или ответ 2xx.

Проверка подписей запросов Twilio локально

Twilio подписывает каждый запрос заголовком X-Twilio-Signature, вычисленным из полного URL и POST-параметров с помощью вашего auth-token. Ваш обработчик должен:

  • использовать точный публичный URL (включая хостнейм туннеля) для проверки подписи.
  • передавать все POST-параметры в функцию валидации.
  • отклонять запросы с недействительной подписью, даже при локальном тестировании.

Когда URL туннеля меняется между сессиями, обновляйте и URL вебхука в консоли Twilio, и ваш URL для валидации.

Советы по отладке, специфичные для Twilio

Form-encoded payload

В отличие от Stripe или GitHub, Twilio отправляет данные application/x-www-form-urlencoded. Убедитесь, что обработчик корректно парсит form-body, а не только JSON.

TwiML-ответы

Обработчики голоса и SMS должны возвращать корректный TwiML-XML. Тестируйте форматирование ответа локально, прежде чем Twilio пометит доставки как неудачные.

Поведение при таймауте

Для большинства вебхуков Twilio ожидает ответ в течение 15 секунд. Медленные обработчики вызывают повторы и дублирующие доставки — используйте повтор вебхуков для тестирования обработки повторов.

Цепочки статус-колбэков

SMS-воркфлоу часто связывают входящие вебхуки со статус-колбэками. Тестируйте оба эндпоинта локально, настроив отдельные маршруты или пути туннеля.

Локальное тестирование Twilio против Twilio CLI

Twilio CLI может имитировать входящие запросы через twilio phone-numbers:update и локальные туннельные плагины. Выделенный туннель к localhost с захватом запросов даёт постоянную видимость каждого колбэка, возможность повтора и воркфлоу, масштабируемый на нескольких провайдеров — не только на Twilio.

Об общих паттернах отладки вебхуков читайте в как отлаживать вебхуки локально.

Присоединяйтесь к листу ожидания PortPreview для тестирования вебхуков Twilio и других провайдеров из одного туннеля.

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

Как протестировать вебхуки Twilio на localhost?
Поднимите туннель к localhost с PortPreview, задайте URL вебхука вашего номера Twilio как HTTPS-URL туннеля, затем отправьте тестовое SMS или сделайте звонок, чтобы запустить колбэк.
Twilio отправляет вебхуки в JSON или form-encoded?
Twilio отправляет payload в формате application/x-www-form-urlencoded, а не JSON. Убедитесь, что локальный обработчик парсит form-body и валидирует заголовок X-Twilio-Signature.
Почему проверка подписи Twilio падает с туннелем?
Подписи Twilio включают полный URL запроса. Если код валидации использует localhost вместо URL туннеля или URL туннеля изменился, проверки подписи провалятся.