这个问题类似于this one但有一个转折(所以旧问题接受的答案在以下情况下无效)
我有一个售票网站 (PHP/MYSQL)。假设我只剩下一张票:
- 买家 A 将票放入她的购物车并转到支付网关页面(即 paypal)
- 门票被锁定5分钟,买家B无法购买
- 买家 A 在 paypal 页面打开的情况下等待 5 分钟,什么都不做
- 门票已解锁,买家 B 将其放入购物车并进入 paypal 页面
- 买家A在paypal上成功完成支付程序
- 买家B在paypal上执行付款程序成功
我可以等更长时间,但我认为这不会解决更一般情况下的问题。此外,如果我这样做,将有可能产生某种 DoS,将库存元素锁定很长一段时间。
处理这种情况的最佳方法是什么?
最佳答案
所有支付网关都会进行回传,让您知道(例如)付款引用等。大多数还会回传授权/认证信息,例如 CSC/CVV2 检查结果,以便您(商家)拥有最终决定权是否接受付款。
收到回发后,您应该能够检查票证是否仍处于“锁定”状态,如果没有,则通过支付网关发出支付撤销以取消支付。然后您需要显示一条消息“抱歉,超时请重试”
如果网关不支持“即时撤销”式功能,那么它们至少会支持某种“作废”功能,资金永远不会真正从客户卡中提取,并且授权保留会自动取消(通常两天后,尽管某些卡可能需要更长时间)。对于超时的(希望是少量的)事务,这可能是可以接受的。值得监控有多少事务超时,以便可以调整超时期限。
或者,如果票不再被锁定,(同样,如果网关支持的话)发回退款。
关于php - 带有外部支付网关的电子商务库存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1793218/