Процесс оплаты заказа из корзины

saxon

Новичок
Здравствуйте.
Сразу говорю, что долго искал в интернете и не нашел нужного решения.
Есть магазин, в котором набрать в корзину товара может любой посетитель, но оплатить только зарегистрированный.
Сделал корзину на сессиях и все работает хорошо. Но!
1. Для корректной проверки оплаты необходим Id заказа - идентификатор заказа уже в базе. но в какой момент его туда добавить не пойму. ведь если я добавлю заказ в базу при нажатии кнопки покупки, а юзер отменит платеж, то заказ будет уже и в сессии, и в базе. Удалять заказ из базы, если юзер отменил заказ? А если он просто закрыл страницу оплаты?
Как правильно построить работу с оплатой?
2. Как защитить платеж и добавление заказа в базу, т.к. сама информация о заказе и платеже является ценной и не должна быть подделана.
Пока идея только в двойной проверке:
- проверка по Id заказа из самой базы
- генерирование хеша случайного как идентификатора платежа (передавать его при оплате и требовать его при подтверждении платежей). В этот момент стоит почитать о CSRF?

Спасибо
 

saxon

Новичок
К какому полю? Когда я нажимаю Оплатить и закрываю страницу оплаты, потом опять повторяю это все, у меня вб азе уже 2 заказа не оплаченных и мусорных.
Или это самый оптимальный вариант - засорять базу такими вот заказами?
 

saxon

Новичок
Как не повторять?
Тогда это становится большей проблемой:
в таком случае при создании заказа в базе я должен в сессии прописать Id заказа из базы, чтобы связать сессию и БД.
тогда в случае, когда юзер отменяет оплату (заказ для которой уже есть в БД) и добавляет товар, то нужно удалять заказ (товары заказа) и заново все добавлять.
это еще хуже, т.к. нужно учитывать специфику таблицы заказов при обновлении информации - беда с поддержкой.

Вырисовалась такая схема:

т. Cart
int id,
varchar(16) hash,
bool payed default false


т. Cart_Items
int cart_id (fkey),
int item_id,
float cost

При первом нажатии на оплату корзина дублируется в БД в +- такую структуру, Id корзины записывается в сессию.
При каждом обращении к оплате поле hash генерируется заново, передается системе оплаты, которая должна вернуть его же для проверки контрольной суммы и корректности оплаты.
Как вообще защититься от того, чтобы злоумышленник не зашел по адресу, по которому платежная система вернет результат "оплачено"? Сам по себе введенный хеш-код не защищает, а просто немного усложняет взлом.
 

Redjik

Джедай-мастер
А ты думай проще =)))))

1) Формируешь заказ - добавляешь в таблицу заказов как неоплаченный, сбрасываешь сессию у пользователя.
2) Проведение оплаты сторонним сервисом.
???
Profit

ps. разберись уже как работает система оплаты.
 

saxon

Новичок
все бы ничего. вот только после того, как я сформировал заказ в БД (при нажатии на Оплатить и переходе на сервис оплаты), я не могу удалить заказ из сессии. пример:
пользователь сформировал заказ в сессии, перешел на оплату и закрыл вкладку. в итоге он должен зайти на сайт и увидеть свою корзину. Ваш пример такого не поддерживает. а дублировать данные корзины неприкольно.
С защитой разобрался. Платежка предоставляет, вроде, необходимую информацию и ключи. Если есть еще варианты, было бы интересно узнать.
 

Redjik

Джедай-мастер
Ну при клике добавляй заказ в бд и id заказа пихай в сессию пользователю - не вижу проблемы таки...
 

saxon

Новичок
да, все сводится к описанным шагам. много телодвижений. странно, но пока ничего интереснее и проще не вижу. спасибо.
 

saxon

Новичок
все относительно. когда данные дублируются, то это уже много движений..
 

saxon

Новичок
только обсуждение, только обсуждение. есть проблема, нужно решить.
 

saxon

Новичок
налетели =)
не вам решить нужно, а мне. есть задача, которую мне нужно решить. у меня есть вопросы, ответы на которые я ищу.
а вся соль в том, что это настолько часто используемая схема и функция (корзина, оплата), что я надеялся просто получить ссылку на какой-то стандартный ман и пример с описанием подводных камней.
а вопросы потому, что это с деньгами связано и здесь не хочется использовать велосипеды, а взять готовое проверенное решение.
 
Сверху