2009-11-24 4 views
8

этим вопрос похоже на this one, но с изюминкой (так что ответ принят на старший вопрос не является действительным в следующем сценарии)электронной коммерции управление запасами с внешним платежным шлюзом

У меня есть сайт для продажи билетов (PHP/MYSQL). Предположим, у меня есть только один билет налево:

  • покупателю кладет билет в ее корзину и идет на страницу платежного шлюза (т.е. PayPal.)
  • билет заперт в течение 5 минут, так что покупатель B не может купить это
  • покупатель а ждет 5 минут с PAYPAL страницы открытой, ничего не делая
  • билет разблокирован поэтому покупатель B кладет его в корзине и идет страница PayPal
  • покупатель выполняет процедуру оплаты на PayPal с успех
  • покупатель B успешно выполняет процедуру оплаты на paypal

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

Каков наилучший способ справиться с этим сценарием?

ответ

1

Как насчет более социального решения вместо технического? Почему бы не сделать абсолютно очевидным, что билет будет разблокирован, если вы слишком долго будете ждать?

+0

это не решит проблему, так как, даже если это очевидно, оба плательщика в конечном итоге делают два юридических платежа за один пункт. – gpilotino

+0

Да, вы правы, это не остановит одного из двух клиентов от покупки билета описанным способом. Вы могли бы также сказать, что первый клиент ждал долго. Возможно, вы можете включить свое правило 5 минут в свой запрос Paypal ...? –

+0

в этом случае вопрос будет: делать (все) платежные шлюзы (настраиваемые) таймауты? даже если это разрешит только первую половину =) – gpilotino

6

Все платежные шлюзы будут делать обратную передачу, чтобы сообщить вам (например) ссылку на оплату и т. Д. Большинство из них также будут получать информацию об авторизации/аутентификации обратной связи, такую ​​как результаты проверки CSC/CVV2, чтобы вы (торговец) получили последнее слово в том, принимать ли платеж или нет.

При получении обратной передачи вы должны быть в состоянии проверить, все ли по-прежнему заблокирован билет, а если нет, то вы можете сделать возврат платежа через платежный шлюз, чтобы отменить платеж. Затем вам нужно отобразить сообщение «извините, превышение тайм-аута, пожалуйста, попробуйте еще раз»

Если шлюз не поддерживает функциональность стиля «мгновенного разворота», то они, по крайней мере, будут поддерживать какую-то «недействительную» функциональность, благодаря которой средства будут никогда не берется с карты клиентов, а авторизация сохраняется автоматически (обычно через два дня, хотя на некоторых картах она может занять больше времени). Для (надеюсь, малого) количества транзакций, что тайм-аут, это может быть приемлемым. Было бы целесообразно следить за тем, сколько тайм-аутов транзакций позволяет отрегулировать период тайм-аута.

В качестве альтернативы, если билет больше не заблокирован (и, опять же, если шлюз поддерживает его), отправьте обратно платеж.

+0

afaik postback происходит после того, как платеж завершился, поэтому оба пользователя найдут меньше денег на своем cc внезапно. исправьте меня, если я ошибаюсь, но это будет эквивалентно ручному переходу на брандмауте платежного шлюза и отметьте «не принимайте этот платеж» (перерывы в обращении обычно занимают несколько дней, поэтому я не хочу справляться с тысячами p.r.). – gpilotino

+0

Невозможно говорить за каждый шлюз, но я знаю, что большинство из Великобритании позволяют отправить сообщение «разворота», чтобы отменить платеж. Это мгновенный разворот и не требует обычных двух или более дней, чтобы уйти. – PaulG

+0

Приятно знать, что я буду благодарен вам – gpilotino

1

Я думаю, что вы не должны блокировать билет, если кто-то положил его в свою тележку, как в эти 5 минут. вы можете в конечном итоге отгонять нескольких других клиентов ...

Я предлагаю вам разрешить всем добавлять билет в свою тележку, если только кто-то не делает платеж и не покупает его. Теперь, когда другие приступают к оформлению заказа, просто запустите сообщение как «Извините, что вы поздно ... билет распродан !!!» и билет должен быть удален из их тележки.

Таким образом, билет не будет заблокирован от ваших клиентов, и все же сценарий двух человек, осуществляющих оплату за тот же билет, не возникнет.

+3

, вы знаете, если платеж будет успешно завершен только после его завершения. если оба пользователя уже находятся на оплате (т.е.paypal), у вас нет контроля: они оба платят (на paypal) за последний билет. – gpilotino

2

Вероятно, вы не можете использовать страницу входа в внешний шлюз для оплаты и выполнять то, что вы пытаетесь сделать.

Paypal и многие другие процессоры имеют прямой интеграционный веб-сервис. Это означает, что вы собираете платежную информацию на своей странице, ее отправляют на ваш сервер, и вы вызываете вызов веб-службы и получаете немедленный ответ от процессора. (Я не помню, как PayPal называет продукт, который это делает, но он раньше назывался PayFlow Pro и был куплен у Verisign.)

Таким образом, вы не блокируете билеты, когда их помещают в корзину. Ваш рабочий процесс будет:

  1. Соберите информацию об оплате.
  2. Как только информация о платеже возвращается на ваш сервер: a. Попробуйте заблокировать билеты - возврат отказа, если он недоступен b. При успешной блокировке авторизация процесса
  3. При успешной авторизации билеты удаляются из имеющегося пула.
  4. При неудачной авторизации или ошибке билеты разблокированы и доступны для других пользователей.

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

Вы не задавали вопрос о решении проблемы при предотвращении воздействия PCI. Так как вы, вероятно, спросите:

Есть процессоры, которые позволяют вам встраивать сбор информации о платежах на свою страницу. Есть некоторые, которые позволяют вам получить «токен» для замены номера карты, чтобы ваш сервер никогда не получал номер карты. Затем токен можно использовать при вызове веб-службы на стороне сервера. Вы получаете то, что вам нужно, и вам не нужно иметь дело с проблемами PCI, связанными с получением номеров карт.

Смежные вопросы