我一直在开发一个在线零售商店。
它是用PHP编写的,使用paypal和IPN来处理付款。
我写了自己的购物车。当用户想要结账时,他们点击结账按钮,该按钮具有围绕按钮的标准购物车上传功能,并且用户被带到paypal以完成支付。 Paypal然后给我发送IPN通知我付款。
我的问题是,我应该在什么时候存储订单,什么时候应该减少库存水平?
我现在的标准流程如下:
用户将商品添加到购物车。
用户点击结帐。
(a)用户完成付款。
(b)用户无法通过返回网站或去其他地方/关闭浏览器来完成付款。
(可选)用户点击返回网站。
正如您所看到的,此过程存在一些问题。如果客户离开PayPal页面而没有完成付款,我将有一个“悬空”订单,并且由于库存水平也会降低,这个库存将无法供其他客户使用!解决方案是每隔一段时间手动“清理”数据库。
替代?
选项I)在收到“已完成的交易”IPN之前,不要将订单存储在数据库中,然后使用会话中存储的购物车信息创建订单并降低库存水平。但是,会话可能会过期,而PayPal付款可能需要数天时间,具体取决于付款方式。
选项II)按顺序存储订单,但在收到完成的交易IPN之前不要降低库存水平。这仍然存在悬空订单的问题,但至少在清理时不必重新添加库存,我只需要删除订单。然而,另一个问题是如果多个人在相似的时间订购,因此他们的订单总共包含超过库存的数量。当系统收到完整的IPNS,然后将库存水平降低到负数量时,这可能会非常混乱!
我在互联网上到处寻找某种帮助,但在任何地方都没有提到它!每个人都会跳过如何处理IPN的问题。我只是不明白其他人怎么会遇到这个问题?!
请帮忙!
答案 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位客户同时使用您的最后剩余库存进行结账的可能性通常很低。如果你做有足够高的音量和低库存水平(你为什么会这样?)那么你可能想在购物车中做一些事情,在会话超时期间对项目进行锁定。
如果订单被取消或退回,请确保您的订单处理代码将库存退回库存。