PayPal IPN库存控制

3

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

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

我编写了自己的购物车。当用户想要结账时,他们会点击结账按钮,该按钮周围包装了标准购物车上传功能,然后用户被带到Paypal完成付款。然后Paypal向我发送IPN以通知我付款情况。

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

我现在拥有的标准流程如下:

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

    • 如果商品已售完或添加的数量超过可用数量,则更新购物车以反映此情况。
    • 但是,添加到购物车中的库存不会减少。
  2. 用户点击结账。

    • 购物车加载到数据库中的订单记录中,并减少库存。
    • 用户被带到Paypal完成付款。
  3. (a) 用户完成付款。

    (b) 用户没有通过返回网站或转到其他地方/关闭浏览器完成付款。

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

    • 用户看到“谢谢,订单已完成”的完整页面。
    • 与订单表相关的任何内容都不会被处理,因为Paypal将发送IPN。
  5. Paypal发送IPN
    • 更新交易状态的订单

正如您所看到的,这个流程存在一些问题。如果客户在没有完成付款的情况下离开Paypal页面,我将拥有一个“悬挂”的订单,并且由于库存水平也降低了,因此其他客户将无法获得这些库存!解决这个问题的方法是定期手动“清理”数据库。

替代方案?

  • 选项I)在收到“已完成交易”IPN之前不要将订单存储在数据库中,然后使用存储在会话中的购物车信息创建订单并减少库存。但是,会话可能会过期,而Paypal支付可能需要几天时间。

  • 选项II)按原样存储订单,但在收到完成交易IPN之前不要减少库存水平。这仍然存在悬挂订单的问题,但至少在清理时不必重新添加库存,只需删除订单即可。但是,这种方法的另一个问题是,如果多个人同时下单,因此他们的订单共包含超过库存的数量。当系统收到已完成的IPN然后将库存水平减少到负数时,这可能会相当混乱!

我在互联网上寻找了各种帮助,但没有任何提及此问题的地方!每个人都直接跳到如何处理IPN。我真的不明白其他人为什么没有遇到这个问题?!

请帮忙!


我也真的需要帮助!当商品缺货时,我只能手动删除购买选项。 - maxmitch
2个回答

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 job,每隔几分钟运行一次以跟踪临时订单。如果临时订单的时间超过您允许的时间(例如20分钟),则:

remove the temporary order from database
undo the change in inventory count

1
作为一名商家和开发者,我更喜欢使用IPN来调整库存,即使该IPN处于待处理状态(例如eCheck)。两个客户同时结账购买最后一件库存商品的概率通常很低。如果您确实有足够高的销售量和低库存水平(为什么会这样?),那么您可能需要在购物车中采取措施,在会话超时期间对商品进行锁定。
确保您的订单处理代码在订单取消或退货时将库存归还给库存。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接