Paypal IPN Инвентаризация - PullRequest
       9

Paypal IPN Инвентаризация

3 голосов
/ 02 октября 2011

Я занимаюсь разработкой интернет-магазина.

Он написан на php и использует PayPal и IPN для обработки платежей.

Я написал свою собственную корзину. Когда пользователь хочет оформить заказ, он нажимает кнопку «Оформить заказ», в которой стандартная функция загрузки корзины обернута вокруг кнопки, и пользователь попадает в PayPal для завершения платежа. Затем Paypal отправляет мне IPN, чтобы уведомить меня о платеже.

У меня вопрос: в какой момент я должен хранить заказ и когда следует снижать уровень запасов?

Стандартный процесс процесса, который у меня сейчас выглядит следующим образом:

  1. Пользователь добавляет товар в корзину.

    • Если товар сейчас распродан или добавленное количество превышает доступное, корзина обновляется, чтобы отразить это.
    • Однако добавленный в корзину запас не снижает уровень запасов.
  2. Пользователь нажимает кнопку оформления заказа.

    • Корзина загружается в запись заказа в БД И уровень запасов снижается.
    • Пользователь принят на PayPal для завершения платежа.
  3. (a) Пользователь завершает платеж.

    (b) Пользователь не завершает платеж, возвращаясь на веб-сайт или переходя в другое место / закрывая браузер.

  4. (Необязательно). Клики пользователей возвращаются на веб-сайт.

    • Пользователь видит заполненную страницу «Спасибо, заказ выполнен».
    • Ничего не обрабатывается в связи с таблицей заказов, так как PayPal будет отправлять IPN в любом случае.
  5. Paypal отправляет IPN
    • Обновление заказа со статусом транзакции

Как видите, в этом процессе есть некоторые проблемы. Если клиент покидает страницу PayPal, не завершив платеж, у меня будет «висячий» заказ, и, поскольку уровни запасов также уменьшатся, этот запас не будет доступен для других клиентов! Решением этой проблемы является ручное «очищение» базы данных очень часто.

Альтернативы

  • вариант I) Не сохраняйте заказ в базе данных, пока не будет получен IPN «завершенная транзакция», затем используйте информацию о корзине, сохраненную в сеансе, для создания заказа и снижения уровня запасов. Однако сеансы могут истечь, и платежи через PayPal могут занять дни в зависимости от платежа.

  • вариант II) Сохраните заказ как есть, но не уменьшайте уровень запасов до тех пор, пока не будет получен IPN завершенной транзакции. Это все еще имеет проблему висячих заказов, но, по крайней мере, нет необходимости повторно добавлять запасы при очистке, мне просто нужно удалить заказы. Однако другая проблема заключается в том, что если несколько человек заказывают в одинаковое время и, следовательно, все вместе, их заказы содержат количества, превышающие запас. Это может быть довольно хаотично, когда система получает заполненный IPNS, а затем снижает уровень запасов до отрицательных количеств!

Я искал повсюду в Интернете какую-то помощь, но нигде не упоминается! Все просто переходят к тому, как должен обрабатываться IPN. Я просто не понимаю, как другие люди не могли иметь эту проблему?!

Пожалуйста, помогите!

Ответы [ 2 ]

2 голосов
/ 04 марта 2012

Вы столкнулись с той же проблемой, что и системы бронирования авиабилетов на века.Используйте то же решение, например

1.При нажатии кнопки «Оформить заказ» (при перенаправлении на Paypal)

reduce inventory count
place a timestamp in the database along with a state that this order is temporary

2aКак только вы получите IPN, т.е. узнаете, что выставление счета прошло успешно

change state of the order to permanent

2b.Иметь задание cron, которое запускается каждые несколько минут для отслеживания временных заказов.Если временные заказы превышают допустимые вами, например, на 20 минут, то:

remove the temporary order from database
undo the change in inventory count
1 голос
/ 02 октября 2011

Как продавец и разработчик, я предпочитаю корректировать запасы с помощью IPN, даже если этот IPN находится на рассмотрении (например, eCheck). Вероятность одновременного оформления заказа двумя покупателями с последним оставшимся запасом, как правило, невелика. Если у вас do достаточно высокий уровень громкости и низкий уровень запасов (зачем вам?), Вы можете сделать что-то в корзине, чтобы блокировать предметы на время ожидания сеанса.

Убедитесь, что ваш код обработки заказа возвращает товар на склад в случае отмены или возврата заказа.

...