Простыми словами
Обычный способ обмена — запрос: ваша программа обращается к API и спрашивает «есть новые заказы?». Webhook устроен наоборот. Вы заранее сообщаете сервису адрес на вашем сервере, и когда событие происходит, сервис сам отправляет на этот адрес запрос с данными.
Так работают многие повседневные вещи: платёжная система присылает уведомление об успешной оплате, мессенджер передаёт боту входящее сообщение, CRM сообщает о смене стадии сделки, а форма на сайте отправляет заявку в таблицу.
Как это работает
Вы создаёте на сервере адрес-приёмник и указываете его в настройках сервиса. При наступлении события сервис отправляет на него запрос, в котором есть тип события и данные: номер заказа, сумма, статус. Ваш сервер принимает запрос, проверяет подпись и выполняет нужные действия.
Важно отвечать быстро и корректно. Если приёмник недоступен или вернул ошибку, большинство сервисов пробует отправить повторно через некоторое время. Поэтому обработку делают идемпотентной: повторное получение того же события не должно, например, начислить бонус дважды.
Зачем это владельцу бизнеса
Для бизнеса webhook означает мгновенную реакцию без ручной работы. Оплатил клиент — доступ к курсу открылся сразу, заказ попал на склад, менеджер получил уведомление. Задержки в минуту уже раздражают покупателя.
Кроме того, он экономит ресурсы: не нужно каждые несколько секунд запрашивать данные, нагружая и свой сервер, и чужой. Webhook — основа большинства современных интеграций между сервисами.
Пример из практики
Школа программирования в Астане продавала курс через сайт, и после оплаты менеджер вручную отправлял ссылку на доступ. Подключили webhook платёжной системы: как только деньги поступают, сервер открывает доступ и присылает ссылку в Telegram. Жалобы «оплатил, а доступа нет» прекратились.
Частые ошибки
- Не проверять подпись запроса и принимать любые данные
- Обрабатывать долго и не успевать ответить, из-за чего приходят повторы
- Не защититься от дубликатов события
- Не логировать входящие запросы и не понимать, что пошло не так
- Использовать адрес-приёмник без https