Задать вопрос
fast-je
@fast-je
Пишу на php.

Как запретить два параллельных запроса?

Всем привет! Есть сайт site.com.
На сайте есть раздел выплат. Пользователь заходит и выбирает платежную систему ту, на которую он хочет получить свои деньги. Проблема в чем ?
Проблема заключается в том, что юзер заходит на сайт например в обычном режиме браузера и через инкогнито в один и тот же аккаунт, а также может создать сколько угодно изолированных сессий в один и тот же аккаунт с одного браузера с помощью sessionbox (расширение).
Так вот дальше, процесс выплат на стороне сайте происходит так, что юзер шлет запрос и сервер его принимает и php шлет запрос в платежную систему, а затем пишет в бд если транзакция успешно прошла.
Но представим ситуацию когда юзер присылает 3 одинаковых запроса с разных сессий с одного аккаунта.
В какой момент непонятно но скорее всего когда php ждет ответ от платежной системы, а то есть 3 запроса ждут ответа от ПС, то он происходит с какой-то задержкой, то есть в зависимости от ПС API мы будем ждать разное время ответа, от payeer.com например 2 секунды, от qiwi 500мс.
Но по итогу выполняются все 3 запроса и юзеру 3 раза приходит выплата, а не 1 раз.

Решение этой проблемы как мне кажется лежит в том, чтобы каждый раз когда юзер заходит на страницу выплат создать какой-то уникальный хеш, который будет записывать с таблицу юзера например и тот запрос который был последний, тот и будет записан в таблицу и при выплаты будем сравнивать.
Либо 2 вариант, когда мы просто запишем заявку юзера на выплату, а сами в фоне кроном будем выплаты делать юзеру.

Какое еще может быть решение в данной ситуации ?
  • Вопрос задан
  • 163 просмотра
Подписаться 2 Средний 13 комментариев
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
В начале транзакции снимать сумму с баланса пользователя, записывая её вместе с идентификатором транзакции. После подтверждения перевода удалять запись. При отказе или таймауте возвращать сумму на баланс пользователя.
Как вариант - не снимать сумму, а отмечать её как заблокированную, проводя реальное уменьшение баланса после подтверждения перевода.
Ну и ограничить частоту запросов на снятие средств от одного пользователя.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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