Paypal IPN库存控制

时间:2011-10-01 21:17:49

标签: php paypal paypal-ipn orders

我一直在开发一个在线零售商店。

它是用PHP编写的,使用paypal和IPN来处理付款。

我写了自己的购物车。当用户想要结账时,他们点击结账按钮,该按钮具有围绕按钮的标准购物车上传功能,并且用户被带到paypal以完成支付。 Paypal然后给我发送IPN通知我付款。

我的问题是,我应该在什么时候存储订单,什么时候应该减少库存水平?

我现在的标准流程如下:

  1. 用户将商品添加到购物车。

    • 如果商品现已售罄或添加的数量超过可用数量,则会更新购物车以反映此情况。
    • 但是,添加到购物车的库存不会降低库存水平。
  2. 用户点击结帐。

    • 购物车被加载到数据库中的订单记录中,库存水平降低。
    • 用户被Paypal付款以完成付款。
  3. (a)用户完成付款。

    (b)用户无法通过返回网站或去其他地方/关闭浏览器来完成付款。

  4. (可选)用户点击返回网站。

    • 用户看到“谢谢,订购完整”的完整页面。
    • 由于paypal无论如何都会发送IPN,因此无法处理与订单表相关的任何内容。
  5. Paypal发送IPN
    • 使用交易状态更新订单
  6. 正如您所看到的,此过程存在一些问题。如果客户离开PayPal页面而没有完成付款,我将有一个“悬空”订单,并且由于库存水平也会降低,这个库存将无法供其他客户使用!解决方案是每隔一段时间手动“清理”数据库。

    替代?

    • 选项I)在收到“已完成的交易”IPN之前,不要将订单存储在数据库中,然后使用会话中存储的购物车信息创建订单并降低库存水平。但是,会话可能会过期,而PayPal付款可能需要数天时间,具体取决于付款方式。

    • 选项II)按顺序存储订单,但在收到完成的交易IPN之前不要降低库存水平。这仍然存在悬空订单的问题,但至少在清理时不必重新添加库存,我只需要删除订单。然而,另一个问题是如果多个人在相似的时间订购,因此他们的订单总共包含超过库存的数量。当系统收到完整的IPNS,然后将库存水平降低到负数量时,这可能会非常混乱!

    我在互联网上到处寻找某种帮助,但在任何地方都没有提到它!每个人都会跳过如何处理IPN的问题。我只是不明白其他人怎么会遇到这个问题?!

    请帮忙!

2 个答案:

答案 0 :(得分:2)

您正在处理航空公司预订系统长期存在的同样问题。使用相同的解决方案,即

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 :(得分:1)

作为商家和开发商,我更倾向于使用IPN调整库存,即使该IPN正在等待(例如,eCheck)。 2位客户同时使用您的最后剩余库存进行结账的可能性通常很低。如果你有足够高的音量和低库存水平(你为什么会这样?)那么你可能想在购物车中做一些事情,在会话超时期间对项目进行锁定。

如果订单被取消或退回,请确保您的订单处理代码将库存退回库存。