Используйте серверную идемпотентность: один заказ или попытка оплаты имеет стабильный ключ, а повторный запрос возвращает уже созданный платёж. Отключение кнопки на frontend полезно, но не является защитой.
Как защитить систему от повторного создания платежа, если пользователь много раз нажимает кнопку оплаты?
Используйте серверную идемпотентность: один заказ или попытка оплаты имеет стабильный ключ, а повторный запрос возвращает уже созданный платёж. Отключение кнопки на frontend полезно, но не является защитой.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Используйте серверную идемпотентность: один заказ или попытка оплаты имеет стабильный ключ, а повторный запрос возвращает уже созданный платёж. Отключение кнопки на frontend полезно, но не является защитой.
В БД нужен уникальный constraint и атомарное создание записи, чтобы два конкурентных запроса не прошли проверку одновременно. Ключ связывают с пользователем, суммой и назначением; несовпадающий payload отклоняют. При timeout платёжного провайдера сначала выясняют исход или повторяют с тем же ключом. Выдачу доступа делают идемпотентной по проверенному событию оплаты, а не по возвращению пользователя на страницу.