Усі статті
Події 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 тунелю змінився, перевірки підпису не пройдуть.