Протестировать приём вебхуков
Ловить входящие вебхуки и смотреть их заголовки и тело в реальном времени.
Чтобы протестировать приёмник вебхуков, нужен публичный URL, до которого отправитель реально достучится, — а значит, localhost отпадает. Мок вебхук-эндпоинта даёт такой URL сразу: он принимает POST, отвечает подтверждением, которого ждёт провайдер, и записывает запрос целиком, так что вы видите заголовки и тело, которые отправитель действительно прислал, а не те, что описаны в документации.
Почему провайдер не может просто позвать localhost?
Вебхук — это сервер провайдера, который вызывает ваш. http://localhost:3000 означает «эта машина» и на их стороне тоже, поэтому их вызов вообще не покидает их сеть. Туннели решают это, выставляя наружу ваш ноутбук; мок-эндпоинт решает это, убирая ваш ноутбук из схемы совсем.
На раннем этапе разница существенная. Пока обработчика ещё нет, вам на самом деле нужно узнать, что именно шлёт провайдер: какие заголовки, какое тело, какой content type. Мок отвечает на этот вопрос за одну доставку, и обработчик вы пишете уже по записанному запросу, а не по примеру из документации.
Что эндпоинт должен ответить отправителю?
Почти все провайдеры считают успехом любой 2xx, а всё остальное — поводом повторить доставку. Значит, отвечать нужно быстро, статусом 200 и коротким телом. Stripe повторяет доставку сутками, если ответ не 2xx; GitHub фиксирует неудачу в журнале доставок. Медленный обработчик оба наказывают так же, как сломанный.
Некоторым провайдерам мало одного статуса. Events API у Slack не включит эндпоинт, пока тот не вернёт обратно значение challenge из проверочного запроса. Если ваш эндпоинт обязан отвечать чем-то, вычисленным из запроса, мокайте именно это эхо, а не фиксированное тело.
Как увидеть, что отправитель прислал на самом деле?
Откройте инспектор мока — там перечислена каждая доставка с методом, заголовками, телом и временем. Это как раз то, что иначе получить тяжело: заголовки подписи, точный content type и расхождение между тем, что провайдер документирует, и тем, что он передаёт.
Инициируйте настоящее событие из панели провайдера, а не отправляйте себе самописный POST. Payload, который вы придумали сами, подтверждает ваши догадки; payload, который прислал провайдер, их исправляет.
Две доставки одного события стоит сравнить рядом. Провайдеры повторяют доставку после неудачи, и повтор не всегда байт в байт совпадает с первой попыткой — если провайдер шлёт заголовок с идентификатором доставки, ключ идемпотентности надо строить именно на нём, а не на хеше тела.
Что обычно идёт не так?
- Тестируют выдуманным payload'ом. Это доказывает, что ваш парсер справляется с вашим же JSON, в чём никто и не сомневался.
- Отвечают 200 до или после работы. Подтверждать надо быстро, а обрабатывать асинхронно: провайдеры отваливаются по таймауту задолго до того, как медленный обработчик закончит.
- Игнорируют повторные доставки. Ретраи означают, что одно и то же событие придёт дважды. Обработчик обязан быть идемпотентным, а отправить одну и ту же доставку дважды — это и есть способ это доказать.
- Думают, что мок проверяет подпись. Не проверяет. Проверка подписи — работа вашего обработчика, и тестировать её надо против настоящего отправителя.
Когда это нужно
Чтобы подключить чужой вебхук (Stripe, GitHub, платёжка), нужен URL, куда его направить — и способ увидеть, что именно он шлёт. Создай POST-мок, отдай его URL провайдеру и смотри каждый вызов в живом инспекторе: метод, заголовки, query, тело.
Создать мок
curl -X POST https://quickmock.dev/api/mocks \
-H 'Content-Type: application/json' \
-d '{
"method": "POST",
"response_status": 200,
"response_body": "{\"received\":true}"
}'
Вызвать
curl -X POST -H 'Content-Type: application/json' -d '{"event":"payment.succeeded"}' https://quickmock.dev/m/<slug>
Открой страницу мока и вставь его admin-токен, чтобы видеть метод, заголовки, query и тело входящих запросов в приватном живом инспекторе.
Что получите
{"received":true}
Частые вопросы
- Можно ли протестировать вебхук, не выставляя наружу локальную машину?
- Да, ради этого мок-приёмник и нужен. Провайдер зовёт публичный URL, который не является вашим ноутбуком, так что доставки можно ловить и читать без туннеля и без открытого порта.
- Увижу ли я заголовки подписи, которые шлёт провайдер?
- Да. Инспектор пишет заголовки каждой доставки, включая подписные заголовки провайдеров — Stripe-Signature, X-Hub-Signature-256 и подобные. Заголовки с учётными данными (Authorization, Cookie, X-Api-Key) сохраняются замаскированными, а из повторяющегося заголовка остаётся только первое значение. Проверка подписи по-прежнему задача вашего обработчика — мок принимает всё, что пришло.
- Может ли эндпоинт ответить значением из самого запроса?
- Да. Токены запроса позволяют вернуть в ответе часть входящего тела — именно этого требуют рукопожатия вроде url_verification у Slack, без которого эндпоинт не включится.
Собери свой
Создать мокГотовые шаблоны для этого: Замокать вебхук Stripe, Замокать вебхук заказа Shopify, Замокать push-вебхук GitHub
Похожие гайды
Обновлено: 2026-09-08