Клиент повторил POST оплаты после таймаута, и заказ оплатили дважды
Мобильное приложение отправляет POST /payments. На плохой сети ответ не пришёл за 10 секунд, приложение повторило запрос. Выяснилось, что первый запрос дошёл и выполнился — деньги списаны дважды.
Как устроить API, чтобы клиент мог безопасно повторять такой запрос?
- Ключ идемпотентности: повтор с тем же ключом не выполняется заново
- Запретить приложению повторять POST-запросы вообще
- Увеличить таймаут на клиенте до минуты, чтобы ответ успевал прийти
- Заменить POST на PUT — PUT идемпотентен по стандарту
