Подтверждение заказа
Подтверждение заказа
В v2 выполняйте только заказ, связанный с сохранённой сессией. До обработки JSON выполните полную проверку исходного тела и подписи: ограничение размера, доверенный выбор секрета по ID ключа, окно 300 секунд, точные подписанные ID и тип события, сравнение HMAC за постоянное время. Отклоняйте повторяющиеся заголовки подписи и неизвестные ключи. Сохраняйте нескомпрометированные старые секреты для существующих доставок.
Для выполнения принимайте payment_session.paid, затем серверным секретом получите GET /v2/payment-sessions/:id. Требуйте PAID и совпадение сохранённых ID сессии, externalId, проекта, режима, валюты и исходной цены с точными десятичными сравнениями. Test не оплачивает Live. Проверяйте победившую попытку в составе сессии; не выполняйте отдельно её дочерний счёт.
В одной транзакции БД сохраните уникальный ID события в нужной области и один раз отметьте заказ оплаченным, добавив задание на выполнение в исходящую очередь. Ограничьте уникальность и на уровне заказа: разные события не должны выдавать его дважды. Возвращайте 2xx после надёжного сохранения; временные ошибки БД или чтения статуса допускают повтор. Проверенные тестовые события получают 2xx, но не выполняют заказ.
Переход браузера, клиентский статус, снимок, хеш или квитанция на проверке недостаточны. Для v1 используйте сохранённую привязку счёта, авторизованное чтение v1 и контракт invoice.paid. См. дедупликацию.