Выбор ответа Senior Мобильный system design обновлено

Оплата в мобильном приложении при плохой сети

Вопрос

Пользователь нажал «Оплатить», запрос ушёл, ответ не пришёл. Что должен сделать клиент?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Повторить с тем же ключом идемпотентности или запросить статус, показав «проверяем оплату». В платежах «неизвестно» это отдельное состояние.

Варианты ответа

  1. Показать ошибку и попросить нажать «Оплатить» ещё раз: повторный запрос безопасен, банк отклонит дубль
  2. Создать новый платёж с новым id, а старый отменить запросом, когда соединение восстановится
  3. Повторить с тем же ключом идемпотентности или запросить статус, показав «проверяем оплату»правильный ответ
  4. Считать оплату успешной и показать чек: при ошибке сервер сам вернёт деньги на карту

Разбор

В платежах «неизвестно» это отдельное состояние. Клиент создаёт идентификатор попытки оплаты заранее, повторы идут с ним, а сервер не спишет деньги дважды. Затем клиент опрашивает статус или ждёт push. Кнопка «Оплатить ещё раз» без идемпотентности приводит к двойному списанию, а оптимистичный успех к выдаче товара без денег.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.