8

这个问题与这个问题相似,但有一个转折(因此旧问题接受的答案在以下情况下无效)

我有一个卖票的网站(PHP/MYSQL)。假设我只剩下一张票:

  • 买家 A 将票放入她的购物车并转到支付网关页面(即贝宝)
  • 门票锁定5分钟,买家B无法购买
  • 买家 A 等待 5 分钟,paypal 页面打开,什么也不做
  • 票已解锁,因此买家 B 将其放入购物车并进入 paypal 页面
  • 买家A在paypal上执行支付程序成功
  • 买家B在paypal上执行支付程序成功

我可以等待更长的时间,但我认为这不会在更一般的情况下解决问题。此外,如果我这样做,将有可能进行某种 DoS,将物品长期锁定在库存中。

处理这种情况的最佳方法是什么?

4

4 回答 4

6

所有支付网关都会回发让您知道(例如)支付参考等。大多数还会回发授权/身份验证信息,例如 CSC/CVV2 检查结果,以便您(商家)对是否接受拥有最终决定权付款与否。

收到回发后,您应该能够检查票证是否仍然“锁定”,如果没有,则通过支付网关发出支付撤销以取消支付。然后你需要显示一条消息'对不起,超时请重试'

如果网关不支持“即时反转”风格的功能,那么它们至少会支持某种“无效”功能,即资金实际上不会从客户卡中取出,并且授权暂停会自动下降(通常在两天后,尽管在某些卡上可能需要更长的时间)。对于超时的(希望很小)数量的事务,这可能是可以接受的。值得监控有多少事务超时,以便可以调整超时期限。

或者,如果票证不再被锁定,(同样,如果网关支持它)发回退款付款。

于 2009-11-25T13:44:29.167 回答
2

您可能无法使用外部支付网关入口页面来做您想做的事情。

Paypal 和许多其他处理器具有直接的 Web 服务集成路径。这意味着您在您的页面上收集付款信息,将其提交到您的服务器,然后您进行 Web 服务调用并从处理器获得即时响应。(我不记得 PayPal 将执行此操作的产品称为什么,但它曾经被命名为 PayFlow Pro,并且是从 Verisign 购买的。)

因此,当您将门票放入购物车时,您不会将其锁定。您的工作流程将是:

  1. 收集付款信息。
  2. 付款信息发布回您的服务器后:尝试锁定票 - 如果不可用,则返回失败 b。成功锁定后,处理授权
  3. 成功授权后,票证将从可用池中删除。
  4. 如果授权不成功或出错,票证将被解锁并可供其他用户使用。

无需处理锁定超时。它们仅被锁定足够长的时间以验证有效付款。

您没有询问如何在防止 PCI 暴露的同时解决问题。因为你可能会问:

有一些处理器允许您将付款信息收集嵌入到您自己的页面中。有些允许您获取“令牌”来替换卡号,以便您的服务器永远不会收到卡号。然后可以在服务器端 Web 服务调用中使用该令牌。你得到你需要的,你不必处理接收卡号周围的 PCI 问题。

于 2009-12-05T07:05:19.977 回答
1

How about a more social solution instead of a technical one? Why not make it absolutely obvious that a ticket will become unlocked when you wait too long?

于 2009-11-24T22:37:33.187 回答
1

我认为如果有人像那 5 分钟那样把它放在他的购物车里,你不应该阻止它。你最终可能会赶走其他几个客户......

我建议您允许每个人将票添加到他/她的购物车,除非有人实际付款并购买。现在,当其他人继续结帐时,只需闪烁一条消息“对不起,你迟到了......票已售罄!!!” 并且应该从他们的购物车中删除票。

这样就不会阻止您的客户购买该票,并且仍然不会出现两个人为同一张票付款的情况。

于 2009-12-02T18:46:51.750 回答