Адрес, на который приходят уведомления о платежах, доступен любому, кто его знает. Без проверки подлинности магазин поверит и постороннему запросу — поэтому уведомление подписывается секретным ключом, а обработчик на стороне магазина обязан эту подпись сверить.
Что произойдёт без проверки
- Любой, кто знает адрес обработчика и номер заказа, сможет отправить туда «успешную оплату».
- Магазин пометит заказ оплаченным и отгрузит товар, денег при этом не будет.
- В отчётах расхождение всплывёт только при сверке с реестром выплат — то есть с задержкой.
Как проверяется подпись
- Секретный ключ известен только вам и сервису — в запросах к API он не передаётся.
- Из тела уведомления и ключа считается контрольная сумма и передаётся в заголовке.
- Обработчик считает её сам и сравнивает: не совпало — запрос отклоняется с ошибкой 401.
Что проверить в своём коде
- Подпись сверяется до любых действий с заказом, а не после.
- Сравнение делается функцией, устойчивой к атаке по времени, а не обычным равенством строк.
- Неподошедший запрос отклоняется, а не игнорируется молча: иначе проблему никто не заметит.
Что делать при утечке секретного ключа — в отдельном ответе.