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