Интеграции
Как проверять подпись webhook для онлайн-записи: сохранить исходное тело запроса, проверить источник и время, обработать повторы и безопасно сменить секрет.

Коротко
Подпись webhook нужно проверять до изменения статуса оплаты, брони или CRM-карточки. Проверка подтверждает соответствие сообщения правилам аутентификации отправителя и защищает от незаметной подмены подписанных данных. Но даже подлинное событие может быть повторным, устаревшим или относящимся к другой учётной записи, поэтому одной подписи недостаточно.
Этот материал посвящён входящим уведомлениям от внешних систем в процессе онлайн-записи. Конкретные заголовки, алгоритмы и правила времени зависят от поставщика: их берут из документации используемой интеграции. Примеры GitHub и Stripe ниже показывают различия протоколов, а не подтверждают наличие таких же механизмов или готовых подключений в MySlot.
Главное в статье
Корректный JSON и защищённое соединение не заменяют проверку отправителя.
Подпись проверяется по тем данным, которые определены протоколом поставщика.
Контроль времени и защита от повторной обработки решают разные задачи.
Подписанное событие должно соответствовать нужному аккаунту, объекту и операции.
При сбое проверки нельзя временно принимать все события без защиты.
Раздел 01
Адрес обработчика webhook обычно доступен внешней системе через интернет. Знание этого адреса не является разрешением менять бронирования. Если обработчик принимает любое сообщение со статусом «оплачено», посторонний запрос может выглядеть так же, как штатное уведомление, даже без доступа к самому платёжному сервису.
HTTPS защищает передачу данных и позволяет отправителю проверить сервер получателя, но сам по себе не доказывает получателю, какая внешняя система прислала запрос. Для этого используется предусмотренный поставщиком механизм: например, подпись или другой способ аутентификации. Не следует придумывать собственный заголовок и считать его общим стандартом.
У каждой точки приёма должен быть известен доверенный контекст: поставщик, среда, аккаунт и набор разрешённых событий. Тестовое уведомление не должно менять реальную запись, а сообщение одного подключённого бизнеса не должно попадать в данные другого. Эта граница важна даже при использовании одной общей интеграционной платформы.
Отдельно ограничьте размер запросов, допустимые методы и формат сообщений. Эти меры помогают обработчику предсказуемо отказывать некорректным обращениям, но не делают подпись необязательной. Публичный маршрут не должен превращаться в универсальную команду изменения любого поля CRM.
Раздел 02
Сначала выясните, какие байты и заголовки участвуют в вычислении подписи. GitHub описывает HMAC-SHA256 по содержимому запроса и общему секрету, передавая результат в X-Hub-Signature-256. В этой схеме проверяют именно согласованный алгоритм и представление подписи, используя безопасное сравнение значений.
Stripe отдельно предупреждает, что для проверки нужен исходный body запроса без преобразований. Если приложение сначала разобрало JSON, изменило пробелы или порядок полей, а затем собрало строку заново, смысл данных может сохраниться, но подписанная последовательность байтов изменится. Настройка обработчика должна учитывать это до запуска обычного разбора содержимого.
Предпочитайте поддерживаемую библиотеку поставщика или проверенную реализацию по его документации. Не переносите названия заголовков и способ сборки подписываемого сообщения из другого проекта по аналогии. Неизвестный формат или отсутствующая обязательная подпись должны приводить к отказу в обработке, а не к обходному режиму.
Практический порядок для точки приёма: получить ограниченное по размеру исходное сообщение, проверить предусмотренные протоколом сведения, затем разобрать данные и передать их в обработку. До успешной проверки не нужно обновлять оплату, резервировать ресурс или сохранять идентификатор события как уже выполненный.
Раздел 03
| Проверка | На какой вопрос отвечает | Чего не гарантирует |
|---|---|---|
| Подпись | Соответствуют ли сообщение и его происхождение выбранному протоколу доверия? | Что событие ещё не применялось и относится к нужной брони. |
| Время сообщения | Допустима ли давность по правилам подписанного протокола? | Что два свежих одинаковых события не дадут двойной результат. |
| Идентификатор события | Обрабатывалось ли это событие в данном контексте? | Подлинность нового сообщения от неизвестного отправителя. |
| Бизнес-условия | Можно ли применить изменение к этому объекту сейчас? | Что входящий запрос прошёл проверку отправителя. |
Раздел 04
Источник и среда
Проверьте поставщика, подключённый аккаунт и рабочий или тестовый режим. Контекст берётся из проверенного протокола и конфигурации, а не только из произвольного поля, которое прислал запрос.
Тип события
Обрабатывайте только нужные интеграции события. Неизвестный тип может быть корректным сообщением поставщика, но это не разрешает угадывать его смысл и менять статус по похожему названию поля.
Связанный объект
Сопоставляйте внешнюю операцию с внутренним заказом по сохранённой связи. Совпадение имени клиента или свободного комментария недостаточно, особенно когда один человек имеет несколько записей.
Расчётные данные
Для события оплаты сверяйте ожидаемую операцию, сумму, валюту и применимые условия. Подлинное уведомление о другом платеже не должно автоматически подтверждать текущую бронь.
Текущее состояние
Проверьте допустимость перехода. Уведомление может прийти после переноса или отмены; подтверждённый источник не отменяет необходимость разобраться с уже изменившимся заказом и доступностью ресурса.
Раздел 05
Учебный пример: поставщик отправил подтверждение оплаты, обработчик его сохранил, но ответ потерялся в сети. Следующая доставка остаётся подлинной и может иметь новую служебную подпись. Если каждую доставку считать новой бизнес-операцией, система повторно отправит уведомление или повторно изменит связанные данные.
Сначала проверяйте подлинность входящего запроса, затем определяйте, обработано ли соответствующее событие в нужном контексте. Уникальность должна охватывать поставщика и аккаунт, если их идентификаторы не являются глобально уникальными. Сам факт получения сообщения и завершение связанного действия удобно учитывать отдельно.
Если протокол включает подписанную временную отметку, проверяйте её по документации и поддерживайте корректное время сервера. Stripe описывает такую проверку как меру против воспроизведения старых доставок. Это не универсальное свойство любой подписи: у другого поставщика защита от повторов может быть устроена иначе.
Для отложенной внутренней обработки фиксируйте результат проверки на входе и помещайте событие в защищённую очередь с контролем доступа и целостности. Повтор внутренней задачи не должен превращаться в публичный маршрут «пропустить подпись». Ответ об успешном приёме отправляйте только после надёжного сохранения события или завершения необходимой операции.
Раздел 06
Собрать контракт интеграции
Запишите алгоритм, подписываемые данные, обязательные заголовки и правила времени. Разделите секреты рабочих и тестовых подключений. Укажите ответственного за изменение конфигурации и диагностику отказов.
Проверить положительный сценарий
Доставьте тестовое событие штатным инструментом поставщика. Убедитесь, что проверка проходит, событие связано с нужной записью, а повтор не создаёт повторного бизнес-действия.
Проверить отрицательные случаи
В изолированной среде измените тело, уберите подпись и используйте секрет другого тестового подключения. Во всех случаях недостоверное сообщение должно остановиться до изменения брони или оплаты.
Проверить сбои и смену ключа
Смоделируйте недоступную очередь, потерю ответа и плановую замену секрета. После восстановления сверяйте результат, а не только успешный HTTP-код. Не проводите эти эксперименты на реальных клиентских платежах.
Раздел 07
Храните секрет проверки на сервере в предназначенном для этого хранилище или конфигурации с ограниченным доступом. Он не должен попадать в браузерный код, публичный репозиторий, ссылки или обычные журналы. Секрет webhook и ключ для произвольных запросов к API могут иметь разные назначения и права.
Порядок ротации зависит от поставщика. Когда он поддерживает переходный период, заранее проверьте приём нового ключа, установите ограниченное окно совместимости и завершите приём старого по плану. Если такого механизма нет, согласуйте другой порядок с учётом повторной доставки и возможного перерыва.
При массовых ошибках сначала проверьте конфигурацию нужной среды, исходное тело запроса и время. Не отключайте проверку ради быстрого восстановления статусов: так технический сбой превращается в возможность принять произвольное изменение. Затронутые операции можно сверить через доверенный API или рабочий кабинет поставщика.
В отчёте различайте отказы проверки, принятые дубли и ошибки применения к заказу. Это разные причины и разные ответственные. Для диагностики обычно нужны идентификатор доставки, время и код результата, а не полный секрет или бесконтрольная копия всех клиентских сведений.
Важно
Попросите интегратора показать три проверки на тестовых данных: изменённое сообщение отвергается, повтор не меняет заказ второй раз, событие другого аккаунта не попадает в вашу бронь. Для интеграций MySlot отдельно уточните фактический механизм проверки входящих событий: эта статья задаёт требования, а не документирует конкретный API продукта.
Вывод
Подпись webhook является первым барьером перед изменением данных, но не завершает проверку. После неё остаются контекст аккаунта, допустимость события, защита от повторов и соответствие текущему состоянию заказа.
Надёжная интеграция сохраняет эти проверки при задержках, повторной доставке и смене секрета. Тогда автоматическое обновление оплаты не зависит от того, насколько правдоподобно выглядит входящий JSON.
Демо
Покажем демо MySlot и разберём ваш процесс: услуги, расписание, ресурсы, CRM, оплаты и уведомления.
MySlot
MySlot подойдёт, если вам нужно:
Похожие статьи
Интеграции
Webhook и API онлайн-записи: как автоматизировать CRM, сайт и внутренние системы
Как использовать webhook и API онлайн-записи: события бронирования, статусы, оплаты, CRM, сайт, BI-отчёты, повторная отправка и контроль ошибок.
ЧитатьИнтеграции
Пропущенные webhook: как восстановить записи в CRM без дублей
Как восстановить пропущенные webhook онлайн-записи: журнал обработки, сверка с источником, устаревшие события, защита от дублей и контроль результата в CRM.
ЧитатьАвтоматизация
Сверка оплат и записей: платежи, возвраты, CRM, отчёты и ошибки
Как сверять оплаты и записи: предоплаты, возвраты, статусы платежей, ошибки, CRM, отчёты, выручку и спорные бронирования.
ЧитатьЗапуск
MySlot поможет принимать записи, управлять расписанием, ресурсами, оплатами и передавать данные в CRM.