【问题标题】:Online Ticket Booking using PayPal: Prevent multiple visitors from buying same ticket使用 PayPal 在线订票:防止多个访客购买同一张票
【发布时间】:2013-01-26 18:36:05
【问题描述】:

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢。 Express Checkout 听起来不错,我会研究一下。关于第二部分:这是贝宝的特定功能吗?我已经搜索并没有真正找到有关“授权”的任何内容。
    • 不,授权在信用卡行业是相当标准的。此页面很好地介绍了 Express Checkout 提供的不同付款类型:x.com/developers/paypal/documentation-tools/express-checkout/…
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-26
      • 1970-01-01
      • 2012-01-10
      • 2011-03-15
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-18
      相关资源
      最近更新 更多