MySlot

Интеграции

Проверка подписи webhook: защита оплат и статусов онлайн-записи

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

7 минут чтения·Обновлено: 2 октября 2026 г.·Автор: команда MySlot
Входящее событие проходит проверку ключа и подписи перед изменением записи в календаре
Подлинность события проверяется до изменения оплаты или статуса брони. Концептуальная иллюстрация.

Коротко

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

Этот материал посвящён входящим уведомлениям от внешних систем в процессе онлайн-записи. Конкретные заголовки, алгоритмы и правила времени зависят от поставщика: их берут из документации используемой интеграции. Примеры GitHub и Stripe ниже показывают различия протоколов, а не подтверждают наличие таких же механизмов или готовых подключений в MySlot.

Главное в статье

Корректный JSON и защищённое соединение не заменяют проверку отправителя.

Подпись проверяется по тем данным, которые определены протоколом поставщика.

Контроль времени и защита от повторной обработки решают разные задачи.

Подписанное событие должно соответствовать нужному аккаунту, объекту и операции.

При сбое проверки нельзя временно принимать все события без защиты.

Раздел 01

Почему endpoint нельзя доверять любому запросу

Адрес обработчика webhook обычно доступен внешней системе через интернет. Знание этого адреса не является разрешением менять бронирования. Если обработчик принимает любое сообщение со статусом «оплачено», посторонний запрос может выглядеть так же, как штатное уведомление, даже без доступа к самому платёжному сервису.

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

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

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

Раздел 02

Как сохранить данные для проверки подписи

Сначала выясните, какие байты и заголовки участвуют в вычислении подписи. GitHub описывает HMAC-SHA256 по содержимому запроса и общему секрету, передавая результат в X-Hub-Signature-256. В этой схеме проверяют именно согласованный алгоритм и представление подписи, используя безопасное сравнение значений.

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

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

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

Раздел 03

Какие проверки нельзя подменять друг другом

ПроверкаНа какой вопрос отвечаетЧего не гарантирует
ПодписьСоответствуют ли сообщение и его происхождение выбранному протоколу доверия?Что событие ещё не применялось и относится к нужной брони.
Время сообщенияДопустима ли давность по правилам подписанного протокола?Что два свежих одинаковых события не дадут двойной результат.
Идентификатор событияОбрабатывалось ли это событие в данном контексте?Подлинность нового сообщения от неизвестного отправителя.
Бизнес-условияМожно ли применить изменение к этому объекту сейчас?Что входящий запрос прошёл проверку отправителя.

Раздел 04

Что сверить перед изменением записи

Источник и среда

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

Тип события

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

Связанный объект

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

Расчётные данные

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

Текущее состояние

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

Раздел 05

Как разделить повтор доставки и повтор действия

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

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

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

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

Раздел 06

Как проверить обработчик до публикации

01

Собрать контракт интеграции

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

02

Проверить положительный сценарий

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

03

Проверить отрицательные случаи

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

04

Проверить сбои и смену ключа

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

Раздел 07

Как менять секрет без отключения защиты

Храните секрет проверки на сервере в предназначенном для этого хранилище или конфигурации с ограниченным доступом. Он не должен попадать в браузерный код, публичный репозиторий, ссылки или обычные журналы. Секрет webhook и ключ для произвольных запросов к API могут иметь разные назначения и права.

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

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

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

Важно

Практический совет

Попросите интегратора показать три проверки на тестовых данных: изменённое сообщение отвергается, повтор не меняет заказ второй раз, событие другого аккаунта не попадает в вашу бронь. Для интеграций MySlot отдельно уточните фактический механизм проверки входящих событий: эта статья задаёт требования, а не документирует конкретный API продукта.

Вывод

Доверяйте проверенному событию, а не знакомому формату

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

Надёжная интеграция сохраняет эти проверки при задержках, повторной доставке и смене секрета. Тогда автоматическое обновление оплаты не зависит от того, насколько правдоподобно выглядит входящий JSON.

Демо

Хотите понять, какой сценарий онлайн-записи нужен вашему бизнесу?

Покажем демо MySlot и разберём ваш процесс: услуги, расписание, ресурсы, CRM, оплаты и уведомления.

Получить демо

MySlot

Когда стоит рассмотреть MySlot

MySlot подойдёт, если вам нужно:

принимать онлайн-записи
управлять расписанием
учитывать сотрудников или ресурсы
работать с группами
принимать оплату или предоплату
отправлять уведомления
передавать заявки в CRM
адаптировать запись под бренд
убрать ручной перенос данных

Возможности

Возможности MySlot по теме статьи

Запуск

Хотите запустить онлайн-запись без хаоса и ручных переносов?

MySlot поможет принимать записи, управлять расписанием, ресурсами, оплатами и передавать данные в CRM.