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

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

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

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


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

  1. Показывать все доступные билеты, где ни "куплен" ни "забронирован".
  2. По клику на билет AJAX'ом помечать его как забронированный под данного юзера: записывать в поле id юзера. В другое поле - время установки брони. Статус брони снимать автоматом через час-два-три.
  3. Так пользователь увидит выбранные билеты, которые гарантированно не куплены ещё.
  4. Оплатит или не оплатит их.
Ответ написан
saboteur_kiev
@saboteur_kiev
software engineer
Во всех продажах кинотеатров используется временная блокировка мест на короткое время, позволяющее пользователю совершить покупку.
Кто первый кликнул - тот забронирован. При этом место помечается как "временно заблокировано", чтобы другой пользователь видел, что возможно через минуту оно освободится. Потом помечается уже как "продано".

Если боитесь, что кто-то будет слишком много кликать, отмечайте по сессии кто кликает все подряд, блокируйте его на несколько минут. Также можно следить идет ли много блокировок без покупок с IP, и временная блокировка таких IP.
Ответ написан
Комментировать
@evgeniy_lm
Более того, временную бронь желательно выставлять на несколько мест рядом (возможно весь ряд на 10-15с пока делается выбор) с выбранным. Логично предположить, что человек пойдет не один, а с компанией будет не очень удобно покупать места через 1 или 2
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

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