【问题标题】:How prevent to buy one item by two customers如何防止两个顾客买一件商品
【发布时间】:2017-01-28 22:23:24
【问题描述】:

我正在使用 paypal IPN + PDT 在我的网站上销售一些东西。我总是在付款前检查库存中有多少物品。客户下订单后,他被重定向到贝宝进行付款。付款完成后,我正在更新有关销售物品的数据库,直到此刻我没有问题,因为我正在销售无限量的物品。我不确定如果我有 10 件物品要出售,例如在这种情况下,我应该怎么做:

有最后一件商品待售。客户下订单,他打算在贝宝上付款,但他还没有付款(网站仍然显示有一件商品待售),同时客户 B 看到还有一件商品有货,所以他要也买吧。在这种情况下,两个客户都会付款,但只有一个(更快的)得到他的产品。

我必须做些什么才能避免这种情况发生?

【问题讨论】:

  • 你使用购物篮吗?如果商品在购物篮中,则其他客户无法购买。

标签: php paypal


【解决方案1】:

如果不先看到你的答案,我无法给你一个代码答案,但这是可以在纸上完成的方法:

  • 当客户 A 点击“支付”按钮时,数据库中的商品数量会更新
  • 如果支付成功,什么也不做,如果支付失败(取消、支付信息不正确等),则将数量恢复为原始数量

只要您在用户单击结帐按钮时进行最终的“数量检查”,这应该可以正常工作。假设客户 A 和客户 B 在购物车中都有一件商品 X,并且只剩下一件。他们不能同时为商品付款,因为您的系统会在重定向到 Paypal 之前检查数量,并且一旦其中一位客户确实点击了按钮,数量就会更新以反映购买情况。

【讨论】:

  • 没错,但如果客户 A 点击“支付”按钮,系统会在数据库中更新它,那么客户将离开我的页面在贝宝网站上付款,但如果他改变主意但他没有付款并且永远不会回到我的网站,我如何取消阻止数据库中的最后一项?
  • 不幸的是,没有完美的方法来处理这个问题。您可以使用计时器将商品仅保留一段时间,或者在两个用户在同一确切时间为同一商品付款的极少数情况下允许第二个订单通过 - 只是因为商品缺货现在并不意味着它将永远存在。确保用户可以在需要时轻松取消订单。 Read more here
  • 预留一定时间是个好主意。一些网站(铁路)通知用户他的座位只保留 20 分钟以支付费用。
  • 如果有人有两个网络爬虫(两者都带有错误的信用卡信息)循环通过这个过程会发生什么?其他用户的 Stock 可能为 0...
【解决方案2】:

我不知道世界其他地方的情况如何,但在伊朗,情况是这样的:

  1. 您要求网关提供令牌
  2. 您使用该令牌获取到网关的链接
  3. 您将用户重定向到网关
  4. 如果用户支付了钱,网关将用户重定向到您的回调地址,并带有转码(钱在网关的银行账户中)
  5. 您的网站使用该转码来验证交易(钱将在接下来的几个小时内进入您的银行帐户)否则,网关会认为您的网站出现故障并且没有注意到用户已付款,因此会触发之后自动退款,款项将退还给用户。 (您有 30 分钟的时间来验证交易)

这就是网关的工作方式。我也知道我的网站不会出售已售罄的商品。如何?只需在用户单击“购买”按钮后检查它是否可用。为了防止客户购买同一商品的最后一件商品或两个或更多客户(例如:火车票),我处理收到的第一笔交易并更新剩余的商品数量(在我们的例子中为 0)。但在此之前,我只是检查该项目是否可用,所以一旦我将最后一个项目发给第一个支付它的客户,就不可能为另一个支付它的客户发出它,因此我只是不验证交易,网关会在30分钟后自动退款,我只需要向用户显示一个交易不成功警报的页面。

如果您的网站不大,这是一个好方法。

【讨论】:

    猜你喜欢
    • 2014-11-05
    • 1970-01-01
    • 2011-06-08
    • 2011-01-18
    • 1970-01-01
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多