Задать вопрос
SimBioT19
@SimBioT19
{{ user.about }}

Как полностью безопасно работать с деньгами?

Есть такая упрощённая схема работы с деньгами:

1. MySQL: START TRANSACTION 
Снимаем деньги с баланса пользователя

2. Работа с внешним API, совершаем перевод реальных денег

Если API возвращает ошибку — MySQL: ROLLBACK, иначе переходим к шагу 3

3. MySQL: COMMIT


В чём вопрос и проблема: если между шагами 2 и 3 после того как внешний API перечислил деньги, произойдёт сбой и например, упадёт БД, то в нашей системе деньги не засчитаются как списанные и операцию можно будет повторить, хотя по факту перевод был.

Как избегают подобные ситуации?
  • Вопрос задан
  • 184 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 4
fox_12
@fox_12
Расставляю биты, управляю заряженными частицами
- обычно у внешнего сервиса есть callback который долбит ваш сервис информацией о проведенном платеже. Настроить и обрабатывать события этого колбека

- асинхронно по крону пробегать по незавершенным платежам и проверять их статус во внешней системе
Ответ написан
Adamos
@Adamos
Это очень безопасно. Уже на втором пользователе БД встанет колом в ожидании первого, и никаких "подобных ситуаций" произойти не сможет.
1. Создаете в базе запись о переводе денег, снимаете эту сумму со счета пользователя.
2. Колупаетесь с внешним API, сколько влезет, невзирая.
3. Если все удалось - тихо радуетесь сами и радуете пользователя.
4. Если вернулась ошибка - отменяете перевод, возвращаете сумму.
5. Если при регулярной проверке (например, ежедневной) оказываются висящие неподтвержденными платежи достаточной давности - отменяете их и извиняетесь перед пользователем за косяки.
6. И никаких транзакций, их не для этого придумали.
Ответ написан
Комментировать
uvelichitel
@uvelichitel
habrahabr.ru/users/uvelichitel
В межбанковских взаимоотношениях для поддержания консистентности применяется система корреспондентских счетов, которые можно поверять. То есть, поищите во внешнем API запросы позволяющие делать сверку состояния.
Ответ написан
Комментировать
tsklab
@tsklab
Здесь отвечаю на вопросы.
Как избегают подобные ситуации?
Ни каких "снимаем деньги с баланса". Баланс — это только сумма приходов и расходов.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы