Написал приложение, которое позволяет пользователю купить билеты на конкретное мероприятие.
Суть работы: Перед человеком появляется схема зала, он жмет на любое место, в этот момент производится ajax-запрос, который выполняет запись в базу что билет забронирован. Пользователю показывается модальное окно с формой заказа или формой оплаты (выбирает сам в пределах модального окна). Так же выполнения запроса и показа модального окна в форме этого окна в спрятанные readonly INPUT вставляется значение 0, показывающее, что человек еще не произвел оплату или не отправил заявку. Соответственно если человек просто закрывает модальное окно, выполняется скрипт, который эту бронь сразу же снимает (чтобы другие могли сразу бронировать). Если же он производит оплату или отправляет заявку, в инпут записывается значение 1 и при закрытии модального окна его бронь не забирается, а переводится в статус (оплачено или в обработке) и на схеме для других показывается что место уже нельзя купить.
Вопрос: как быть, если попадется какой-нибудь человек, который немного понимает javascript и решит просто менять значение инпута с 0 на 1? Следовательно он будет кликать по месту, будет проходить мгновенная бронь, он меняет через код значение инпута с 0 на 1 и скрипт расценивает это как успешную операцию и место остается забронированным. Таким образом можно просто забронировать вообще все места и не производить ничего. Конечно это место ни за кем не будет значиться и его легко можно чистить из бд, но это плохой вариант.
Пока моих знаний в этой области хватает только что бы работать с cookie пользователя и подменять их все время, в зависимости от его действий, но я не знаю, насколько это хорошая практика. Что можно почитать по этой задаче?
Сергей: я же говорю, бронь билета ни за кем не закрепляется. то есть человек нажал на место, оно появилось в базе. если он его оплатил или отправил заявку - все данные по человеку напрвялются в CRM-систему, где уже показывается его статус, место, ряд и все остальное.
Хотя, насколько я сейчас понимаю можно в самой оплате вписывать ряд,место, сектор и уже просматривать данные по оплате, и если она произведена, то ищем строку в таблице с соответствующими данными и присваиваем статус "оплачено". Верно?
Алексей Скляров:Ну да. Клиенту верить нельзя. Только сервер и общение между серверами. Вам сервер оплаты должен прислать статус платежа, и от статуса, изменяете данные.
У меня был точно такой же вопрос когда-то, в итоге сделал валидацию на сервере и в IPN Paypal, который общался с базой и получал сигналы от Paypal на счет новых оплат.