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

use*_*494 8 concurrency payment paypal race-condition conditional-statements

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

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

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

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

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

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

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

或者,如果paypal通过API要求我确认付款,那将是很好的.然后,如果门票被卖给别人,我可以说"不".但我不认为这是可能的贝宝.

Mat*_*ole 2

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

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