Я работаю над проектом, который требует, чтобы мое приложение платило пользователю за его счет PayPal, когда он просит об этом.
Вот как я это сделал до сих пор:
- (зарегистрированный) пользователь переходит на страницу оплаты, на которой перечисляются все его платежи (полученные или нет)
- Он вводит свою электронную почту Paypal и пароль своего приложения (мой) (для безопасности)
- Страница POST получает список всех Платежей, которые имеют статус = «НЕПОЛАДОК» для этого пользователя, и обновляет статус до «РАБОТАЮЩИЙ» (чтобы пользователь не обновлял страницу до завершения всего процесса и не отправлял ее повторно). сумма денег)
- Мы считаем общую сумму для оплаты в этом списке (простой
for
)
- Сумма отправляется в Paypal через PayPal Adaptive Payment API (запрос: PAY)
- Ответ проверяется, если он завершен, статус списка устанавливается на «ЗАВЕРШЕНО», если нет, список возвращается к «НЕПРАВИЛЬНО» (обновление SQL выполняется через
WHERE id IN(x, y, z)
в случае, если второй запрос на платеж имеет было сделано за это время.
- Затем пользователю отображается сообщение
Но мне нужна ваша помощь, я столкнулся с одной рискованной проблемой, которую я хотел бы избежать, и я бы знал, как вы поступите:
- Если пользователь нажал кнопку «Обновить» на странице процесса, я не хочу отправлять ему дважды (или более) сумму (здесь работает «РАБОЧАЯ» блокировка, но что произойдет, если пользователь нажмет кнопку «Обновить», прежде чем я установлю замок?)
- Редко возможно: что произойдет, если пользователь нажмет клавишу f5 после того, как будет сделана блокировка «РАБОТАЕТ», но до запроса к PayPal и получения нового платежа. Следуя тому, что я сделал, только один элемент (новый) будет получен и установлен на РАБОТУ, но все остальные предыдущие платежи будут стоить
Как бы вы сделали? Каков наилучший способ сделать его на 100% надежным?
Спасибо за вашу помощь
Примечание:
Шаги с 4 по 6 выполняются с помощью заданий PlayFramework , вызываемых с now()
и awaiting()
результатом