Задать вопрос

Как правильно организовать продажу билетов?

Есть сайт мероприятия. Планирую организовать возможность пользователям выбирать место в ряде и заказывать билет, после чего происходит запись в АmoCRM о покупке и так далее. Алгоритм работы надумал следующий:

Все билеты будут находиться в базе. Для каждого билета будет статус: куплен. Те билеты, что куплены, мы выводим активными checkbox, те что нет - неактивными. Сформировали блок с выбором билетов.

  1. Человек выбирает билеты, которые ему нужны, просто жмет на квадраты.
  2. На сервер отправляется AJAX-запрос. Проверяем, куплены ли билеты, которые пользователь пытается заказать, если да - выводим сообщение об ошибке. Это я делаю для того, чтоб не возникало проблемы, если человеку выдалась страница с одними билетами и пока он пролистывал, если кто-то купил за это время билеты - он узнал об этом.
  3. Если билеты не куплены, отправляем все данные по заказу в AMOcrm.
  4. Все заявки появляются в статусе: Новая заявка.
  5. При каждом обращении пользователя(когда заявка отправляется) будет выполняться скрипт, который будет выбирать все УСПЕШНЫЕ заявки из AMOcrm, вытаскивать данные и на основе этих данных уже помечать наши билеты в базе как купленные


Теперь возвращаюсь к сути вопроса, их несколько даже:
1. Как на 100% закрыть проблему, когда одновременно два человека отправят запрос на сервер с покупкой ОДНИХ и ТЕХ ЖЕ билетов. Что делать в этом случае?
2. Возможно ли как-то оптимизировать обновление купленных билетов в базе? Получается что каждый раз, когда будет происходить заявка сначала из AMOcrm будут обновляться билеты в базе (исходя из заявок), затем будет проверяться не пытается ли купить человек билет, которого уже нет, после чего будет отправляться заявка в crm-систему и на почту.
  • Вопрос задан
  • 404 просмотра
Подписаться 3 Оценить Комментировать
Решение пользователя Saboteur К ответам на вопрос (3)
saboteur_kiev
@saboteur_kiev
software engineer
Во всех продажах кинотеатров используется временная блокировка мест на короткое время, позволяющее пользователю совершить покупку.
Кто первый кликнул - тот забронирован. При этом место помечается как "временно заблокировано", чтобы другой пользователь видел, что возможно через минуту оно освободится. Потом помечается уже как "продано".

Если боитесь, что кто-то будет слишком много кликать, отмечайте по сессии кто кликает все подряд, блокируйте его на несколько минут. Также можно следить идет ли много блокировок без покупок с IP, и временная блокировка таких IP.
Ответ написан
Комментировать