0 %

Как настроить вебхуки для сайта: надежная передача событий, повторная доставка и защита данных

Как настроить вебхуки для сайта: надежная передача событий, повторная доставка и защита данных

Что такое вебхуки и зачем они нужны сайту

Вебхук — это способ автоматически передать данные из одного сервиса в другой сразу после наступления определённого события. Например, пользователь отправил заявку на сайте, оплатил заказ, зарегистрировался, изменил пароль или оформил подписку. Сайт отправляет уведомление на заранее подготовленный адрес, а другая система принимает его и выполняет нужное действие.

В отличие от обычного запроса, при котором приложение самостоятельно регулярно проверяет наличие изменений, вебхук работает по принципу уведомления. Источник события не ждёт, пока CRM или другой сервис обратится к нему. Он сам отправляет данные в момент, когда событие произошло.

Такая схема полезна для бизнеса, которому нужно быстро связывать сайт с внешними системами:

  • CRM получает новые заявки без ручного переноса данных.
  • Платёжная система сообщает сайту о результате операции.
  • Сервис рассылок добавляет нового подписчика в нужный список.
  • Система аналитики получает информацию о важных действиях пользователя.
  • Складская программа узнаёт об оплате или отмене заказа.
  • Мобильное приложение получает уведомление об изменении данных.

Однако вебхук — это не просто URL, на который отправляется случайный набор полей. Надёжная интеграция требует продуманной структуры событий, защиты от подделки запросов, обработки временных ошибок и контроля повторной доставки. Если не учесть эти детали, можно потерять заявки, создать дубли заказов или передать конфиденциальные данные третьей стороне.

Чем вебхуки отличаются от API

API и вебхуки решают похожие задачи, но работают в разных направлениях.

  • API обычно используется, когда один сервис сам запрашивает данные у другого.
  • Вебхук применяется, когда один сервис уведомляет другой о произошедшем событии.

Представим интернет-магазин и CRM. Если CRM регулярно спрашивает магазин, появились ли новые заказы, это модель периодического опроса. Если магазин сразу отправляет в CRM информацию о новом заказе, это вебхук.

У вебхуков есть важные преимущества:

  • данные передаются ближе к моменту события;
  • не нужно постоянно выполнять пустые запросы;
  • снижается нагрузка на серверы;
  • интеграция может работать практически в реальном времени;
  • проще запускать автоматические бизнес-процессы.

Но вебхук не заменяет API полностью. API может понадобиться, если принимающая система временно недоступна, если нужно запросить дополнительные сведения или если требуется повторно синхронизировать данные. На практике вебхуки и API часто работают вместе: вебхук сообщает о событии, а API используется для получения полной информации.

Какие события стоит передавать через вебхуки

Перед началом разработки нужно определить, какие события действительно важны для бизнеса. Не стоит отправлять все изменения подряд. Избыточные уведомления усложняют обработку, увеличивают объём логов и могут создавать ненужную нагрузку.

События для сайта услуг

  • создание заявки;
  • изменение статуса заявки;
  • назначение ответственного менеджера;
  • подтверждение контакта;
  • отправка формы обратной связи;
  • запись на консультацию;
  • отмена или перенос встречи.

События для интернет-магазина

  • создание заказа;
  • изменение состава заказа;
  • успешная оплата;
  • неуспешная оплата;
  • отмена заказа;
  • изменение статуса доставки;
  • возврат товара;
  • изменение остатков.

События для личного кабинета

  • регистрация пользователя;
  • подтверждение электронной почты;
  • смена пароля;
  • изменение профиля;
  • загрузка документа;
  • подключение дополнительной услуги;
  • удаление аккаунта.

Названия событий должны быть понятными и стабильными. Например, вместо расплывчатого обозначения update лучше использовать конкретные события вроде order.created, order.paid или order.cancelled. Это облегчает поддержку и позволяет принимающей системе точно понимать, какое действие требуется выполнить.

Как спроектировать структуру вебхука

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

Минимальная структура обычно включает следующие элементы:

  • идентификатор события — уникальное значение для защиты от повторной обработки;
  • тип события — например, создание заказа или успешная оплата;
  • время формирования — момент создания уведомления;
  • версия формата — помогает менять структуру без поломки старых обработчиков;
  • идентификатор объекта — номер заказа, заявки или пользователя;
  • данные события — необходимые поля объекта;
  • метаданные — источник, язык, канал или дополнительные параметры.

Важно заранее решить, какие данные передаются непосредственно в вебхуке. Необязательно включать в запрос всю карточку клиента или полный заказ. Часто безопаснее передать идентификатор объекта и ограниченный набор сведений, а остальные данные получить через защищённый API.

Например, для события создания заявки могут понадобиться:

  • идентификатор события;
  • номер заявки;
  • имя клиента;
  • контактный телефон или адрес электронной почты;
  • страница, с которой пришёл пользователь;
  • источник рекламного перехода;
  • дата и время отправки формы.

Не следует передавать через вебхук пароли, секретные ключи, данные банковских карт и другую информацию, которая не нужна принимающей системе. Чем меньше чувствительных данных участвует в обмене, тем ниже потенциальный ущерб при ошибке конфигурации.

Версионирование формата событий

Интеграция может работать годами, а требования бизнеса будут меняться. В структуру события могут добавляться новые поля, переименовываться статусы или изменяться правила обработки. Если менять формат без предупреждения, старый обработчик может перестать работать.

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

При изменении формата полезно придерживаться нескольких правил:

  • не удалять старые поля без периода перехода;
  • не менять смысл существующего поля;
  • добавлять новые значения статусов с учётом обратной совместимости;
  • заранее уведомлять владельцев интеграции о существенных изменениях;
  • хранить описание каждой версии в технической документации.

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

Как защитить вебхуки от подделки

Адрес обработчика вебхука нельзя считать секретом. URL может попасть в журналы, настройки интеграций или сообщения разработчиков. Поэтому одного знания адреса недостаточно для доверия к входящему запросу.

Используйте HTTPS

Вебхук должен принимать запросы только по HTTPS. Это защищает данные во время передачи и снижает риск перехвата. Незащищённый HTTP особенно опасен, если в запросе присутствуют персональные данные, сведения о заказах или токены.

Нужно также корректно настроить сертификат, проверить цепочку доверия и исключить автоматический переход с HTTPS на небезопасный протокол. Если конечная точка доступна по HTTP, её лучше закрыть или настроить принудительное перенаправление на защищённый адрес.

Проверяйте подпись запроса

Надёжный способ подтвердить источник вебхука — цифровая подпись. Отправитель формирует подпись на основе тела запроса и секретного ключа. Получатель самостоятельно рассчитывает ожидаемое значение и сравнивает его с подписью в заголовке.

При проверке важно использовать именно необработанное тело запроса. Если сначала преобразовать данные, изменить пробелы или порядок элементов, результат вычисления может отличаться от исходной подписи.

Секретный ключ должен:

  • храниться вне открытого кода;
  • быть доступным только нужному приложению;
  • не передаваться через обычные параметры URL;
  • периодически заменяться по утверждённой процедуре;
  • не попадать в логи и сообщения об ошибках.

Добавляйте метку времени

Даже корректная подпись не защищает от повторной отправки старого запроса. Если злоумышленник перехватит действительный вебхук, он может попытаться воспроизвести его позже.

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

Ограничивайте доступ

Если поставщик вебхуков использует фиксированные IP-адреса, их можно разрешить на уровне сетевого экрана. Но такой метод не должен быть единственным: адреса могут меняться, а сама IP-проверка не подтверждает содержимое запроса.

Также полезно ограничить:

  • допустимые HTTP-методы;
  • максимальный размер тела запроса;
  • число запросов за определённый период;
  • список разрешённых типов событий;
  • время ожидания ответа.

Почему нельзя сразу выполнять действие при получении запроса

Одна из распространённых ошибок — выполнять всю бизнес-логику непосредственно внутри HTTP-запроса вебхука. Например, принять уведомление, обновить заказ, отправить письмо, создать документ и обратиться ещё к нескольким сервисам, не возвращая ответ до завершения всех операций.

Такой подход создаёт проблемы:

  • поставщик вебхука может решить, что запрос не доставлен из-за долгого ответа;
  • повторная отправка создаст дубль операции;
  • временный сбой внешнего сервиса заблокирует обработчик;
  • увеличивается вероятность тайм-аута;
  • сложно отделить приём события от его последующей обработки.

Более надёжная схема состоит из двух этапов:

  1. Сайт быстро принимает запрос, проверяет его базовую корректность и сохраняет событие.
  2. Фоновый обработчик забирает сохранённое событие и выполняет бизнес-логику.

Для промежуточного хранения можно использовать очередь сообщений, таблицу событий или специальный сервис доставки. Конкретная технология зависит от архитектуры сайта, но принцип остаётся одинаковым: получение вебхука и выполнение длительных действий не должны быть жёстко связаны по времени.

Как правильно отвечать на входящий вебхук

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

Если запрос не прошёл проверку подписи, имеет неправильный формат или содержит слишком большой объём данных, сервер должен вернуть ошибку. Это позволяет отправителю понять, стоит ли повторять попытку.

Полезно разделять ошибки на несколько групп:

  • временные ошибки — перегрузка, недоступность базы данных или кратковременный сбой;
  • ошибки авторизации — неверная подпись или отсутствующий секрет;
  • ошибки формата — отсутствует обязательное поле или передано недопустимое значение;
  • ошибки бизнес-логики — событие нельзя обработать в текущем состоянии.

Временные ошибки обычно допускают повторную доставку. Ошибки подписи и формата бессмысленно повторять без исправления причины. Если все ситуации обрабатываются одинаково, интеграция будет либо терять события, либо создавать лишнюю нагрузку.

Повторная доставка и защита от дублей

Вебхук нельзя проектировать с предположением, что каждое событие придёт ровно один раз. На практике уведомление может быть отправлено повторно из-за тайм-аута, сетевой ошибки, перезапуска сервиса или неполученного ответа.

Поэтому обработчик должен быть идемпотентным. Это означает, что повторная обработка одного и того же события не меняет итоговый результат и не создаёт побочных эффектов.

Для этого используется уникальный идентификатор события. При получении запроса система:

  1. проверяет подпись;
  2. извлекает идентификатор события;
  3. проверяет, не обрабатывался ли он ранее;
  4. если событие уже завершено, возвращает успешный ответ без повторного действия;
  5. если событие новое, сохраняет его и передаёт в обработку.

Проверку нужно выполнять атомарно. Если два одинаковых запроса поступят одновременно, простая последовательность «проверить, затем записать» может не защитить от дубля. Для критичных операций необходимы ограничения в базе данных, транзакции или другой механизм блокировки.

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

  • создание платежа;
  • списание средств;
  • создание заказа у поставщика;
  • отправка юридически значимого документа;
  • начисление бонусов;
  • отправка сообщения клиенту.

Стратегия повторных попыток

Если принимающий сервис временно недоступен, отправитель может повторить доставку. Но повторы не должны выполняться бесконечно и с одинаковым интервалом. Иначе при сбое несколько систем начнут одновременно создавать дополнительную нагрузку.

Для повторной доставки применяют увеличивающиеся интервалы. После первой ошибки следующая попытка выполняется через небольшой промежуток, затем пауза увеличивается. Такой подход даёт принимающему сервису время восстановиться.

При проектировании стратегии нужно определить:

  • какие ответы считаются временными ошибками;
  • сколько попыток выполняется автоматически;
  • какой максимальный период доставки допустим;
  • куда попадает событие после исчерпания попыток;
  • кто получает уведомление о невыполненной доставке.

События, которые не удалось доставить, нельзя просто удалять. Их стоит помещать в отдельное хранилище или очередь неуспешных сообщений. Оттуда администратор сможет повторить отправку после исправления причины.

Журналирование и мониторинг вебхуков

Без наблюдаемости интеграция быстро превращается в «чёрный ящик». Пользователь сообщает, что заявка не попала в CRM, а разработчику приходится вручную искать причину по нескольким системам.

Для каждого события полезно сохранять:

  • идентификатор события;
  • тип события;
  • время создания;
  • время отправки;
  • адрес назначения без секретных параметров;
  • результат доставки;
  • код ответа;
  • число попыток;
  • время последней ошибки;
  • техническое описание проблемы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21