Ответ
Критический баг с двойным списанием средств в платежном шлюзе.
Контекст: Веб-приложение для онлайн-покупок. Пользователь нажимает кнопку "Оплатить".
Шги воспроизведения:
- Добавить товар в корзину.
- Быстро (двойным кликом или нажатием Enter дважды с интервалом < 300 мс) инициировать оплату.
Ожидаемый результат: Одна транзакция, один созданный заказ.
Фактический результат:
- Со счета пользователя списывались средства дважды.
- В системе создавался только один заказ.
- Второе списание не было привязано ни к какому заказу, что приводило к финансовым потерям клиента.
Анализ и причина: На фронтенде не было реализовано дебаунсирование (debounce) или блокировка кнопки после первого нажатия на время обработки запроса. Бэкенд принимал два почти одновременных HTTP-запроса, оба проходили проверки и инициировали списание.
Исправление: По моему баг-репорту команда:
- Добавила дебаунс на кнопку оплаты на фронтенде.
- Реализовала на бэкенде механизм идемпотентности (проверка уникального ключа транзакции) для предотвращения повторной обработки одинаковых запросов.
Итог: Баг был исправлен до попадания в продакшен, что предотвратило потенциальные финансовые потери и потерю доверия пользователей.