使用PayPal在线预订机票:防止多个访客购买同一张机票

时间:2013-02-11 16:00:13

标签: concurrency paypal conditional-statements payment race-condition

我正在为活动(如音乐会)开发在线售票系统。基本部分是座位表,向访客提供可供选择的座位/门票。一旦他们做出选择,系统会立即尝试将票证保留10分钟(通过将票证ID输入到票证ID为关键字的表格中)。 只有在预订成功的情况下,才会显示付款按钮以进行付款。

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

问题: 如果用户由于某种原因花了很多时间在Paypal(超过10分钟),我网站上的机票预订将到期,允许其他访客购买机票,这可能发生在访客1付款之前。访客1看不到任何此类因为他仍处于PayPal ...在某个时间点,他将设法付款(例如15分钟后),这将完美地起作用,因为paypal对过期的预订一无所知

最后,我可能有两位访客为同一张票/座位付了钱!

如何防止这种情况发生? 如果涉及两个系统并且其中一个系统无法控制,您如何处理竞争条件?

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

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

或者,如果PayPal通过API要求我确认付款,那就太棒了。然后,如果门票被卖给别人,我可以说“不”。但是我不认为用PayPal这是可能的。

2 个答案:

答案 0 :(得分:2)

我建议使用快速结帐。 Express Checkout允许您控制付款何时发生,因为您将启动对PayPal的API调用以实际处理付款。

您可以考虑的另一种可能性是使用授权而不是销售交易。这样,如果其他买家占用了座位,您可以取消授权,买家也不会收取费用。 (但是,PayPal可能会向您收取无效授权费用。)

答案 1 :(得分:1)

Matt Cole建议的一个解决方案是使用授权'而不是' sale'。

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