8

我正在为活动(如音乐会)开发一个在线票务系统。一个基本部分是座位表,其中将向游客展示可供选择的可用座位/门票。一旦他们做出选择,系统会立即尝试保留 10 分钟的门票(通过将门票 ID 输入到门票 ID 为关键的表格中)。仅当预订成功时,才会显示一个贝宝按钮以进行付款。

这一切都很好。订票对我来说不是问题。我可以在我的系统中处理它。但是一旦贝宝进入游戏,事情就变得困难了。

问题:如果用户由于某种原因在 Paypal 上花费了很多时间(超过 10 分钟),我网站上的门票预订将过期,允许其他访客购买门票,这可能发生在访客 1 完成之前支付。访客 1 没有看到任何这些,因为他仍在贝宝中...在某个时间点,他将设法付款(例如 15 分钟后),这将完全有效,因为贝宝不知道任何有关过期预订的信息.

最后,我可能有两个游客支付了同一张票/座位!

我怎样才能防止这种情况发生?如果涉及两个系统并且其中一个不受您的控制,您如何处理竞争条件?

我的想法是:实际上应该在付款之前进行检查,但是我当然无法控制贝宝中发生的事情!

我知道我可以使用 Paypal 的 IPN 等,但这只会在付款后发生,为时已晚。

或者,如果贝宝通过 API 要求我确认付款,那就太好了。然后我可以说“不”,以防门票已经卖给了其他人。但我认为贝宝不可能做到这一点。

4

2 回答 2

2

我建议使用 Express Checkout。Express Checkout 允许您控制付款发生的时间,因为您将触发对 PayPal 的 API 调用以实际处理付款。

您可以研究的另一种可能性是使用授权而不是销售交易。这样,如果其他买家上座,您可以取消授权,并且不会向买家收费。(但是,PayPal 可能会因授权无效而向您收费。)

于 2013-02-11T16:16:49.353 回答
1

Matt Cole 建议的一种解决方案是使用“授权”而不是“销售”。

您可以在创建 Paypal 付款时在调用 Paypal API 时将“intent”设置为“authorize”而不是“sale”({intent: "authorize"})。客户批准交易后,您可以通过捕获付款来授权此交易。

于 2015-08-11T16:13:10.430 回答