我一直在开发一个在线零售店。
它是用 php 编写的,使用 paypal 和 IPN 来处理付款。
我写了自己的购物车。当用户想要结账时,他们点击结账按钮,该按钮具有标准的购物车上传功能,用户被带到贝宝完成付款。Paypal 然后向我发送一个 IPN 通知我付款。
我的问题是,我应该在什么时候存储订单以及何时应该减少库存水平?
我现在拥有的标准流程如下:
用户将商品添加到购物车。
- 如果项目现在已售罄或添加的数量超过可用数量,则会更新购物车以反映这一点。
- 但是,添加到购物车的库存不会降低库存水平。
用户点击结帐。
- 购物车被加载到数据库中的订单记录中,并且库存水平降低。
- 用户被带到贝宝完成付款。
(a) 用户完成付款。
(b) 用户没有通过返回网站或去其他地方/关闭浏览器来完成付款。
(可选)用户点击返回网站。
- 用户看到“谢谢,订单完成”完整页面。
- 没有任何与订单表相关的处理,因为 paypal 无论如何都会发送 IPN。
- Paypal 发送 IPN
- 使用交易状态更新订单
- 使用交易状态更新订单
如您所见,此过程存在一些问题。如果客户在未完成付款的情况下离开贝宝页面,我将有一个“悬空”订单,并且由于库存水平也降低了,其他客户将无法使用此库存!对此的解决方案是每隔一段时间手动“清理”数据库。
备择方案?
选项 I) 在收到“已完成交易”IPN 之前不要将订单存储在数据库中,然后使用会话中存储的购物车信息来创建订单并减少库存水平。但是,会话可能会过期,并且贝宝付款可能需要几天时间,具体取决于付款方式。
选项 II) 按原样存储订单,但在收到完成的交易 IPN 之前不要减少库存水平。这仍然存在悬空订单的问题,但至少在清理时无需重新添加库存,我只需删除订单即可。但是,另一个问题是,如果多个人在相似的时间订购,因此他们的订单共同包含超过库存的数量。当系统收到完整的 IPNS 然后将库存水平降低到负数量时,这可能会非常混乱!
我在互联网上到处寻找某种帮助,但没有提到任何地方!每个人都只是跳到应该如何处理 IPN。我只是不明白其他人怎么可能没有这个问题?!
请帮忙!