3

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

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

我写了自己的购物车。当用户想要结账时,他们点击结账按钮,该按钮具有标准的购物车上传功能,用户被带到贝宝完成付款。Paypal 然后向我发送一个 IPN 通知我付款。

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

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

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

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

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

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

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

    • 用户看到“谢谢,订单完成”完整页面。
    • 没有任何与订单表相关的处理,因为 paypal 无论如何都会发送 IPN。
  5. Paypal 发送 IPN
    • 使用交易状态更新订单

如您所见,此过程存在一些问题。如果客户在未完成付款的情况下离开贝宝页面,我将有一个“悬空”订单,并且由于库存水平也降低了,其他客户将无法使用此库存!对此的解决方案是每隔一段时间手动“清理”数据库。

备择方案?

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

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

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

请帮忙!

4

2 回答 2

2

您正在处理与航空公司预订系统多年来相同的问题。使用相同的解决方案,即

1.当用户点击结帐时(同时被重定向到贝宝)

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
于 2012-03-04T07:53:35.303 回答
1

作为商家和开发商,我更喜欢使用 IPN 调整库存库存,即使该 IPN 处于待处理状态(例如电子支票)。2 位客户在您最后剩余库存的情况下同时结账的机会通常很低。如果您确实有足够高的数量和低库存水平(您为什么要这样做?),那么您可能想要在购物车中做一些事情以在会话超时期间锁定项目。

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

于 2011-10-01T23:10:31.740 回答