Stripe payments 如何防止在付款异步时更改购物车

Stripe payments 如何防止在付款异步时更改购物车,stripe-payments,e-commerce,shopping-cart,Stripe Payments,E Commerce,Shopping Cart,下面的步骤说明了我在Stripe的PaymentIntent流中遇到的问题,但对于我所研究的其他支付网关,您可以提出类似的方法,其中成功支付的最终通知从支付网关异步发送到商户站点 客户在购物车中添加10件物品A,现在总共100美元 客户进入结帐页面。服务器为$100总额创建一个条带PaymentIntent,并将“客户端密码”发送到浏览器 客户的浏览器显示结帐页面,显示总共100美元,以及Stripe的付款表单 客户打开一个新标签,将10个B项添加到他们的购物车中,现在总计200美元 客户返回“

下面的步骤说明了我在Stripe的PaymentIntent流中遇到的问题,但对于我所研究的其他支付网关,您可以提出类似的方法,其中成功支付的最终通知从支付网关异步发送到商户站点

  • 客户在购物车中添加10件物品A,现在总共100美元
  • 客户进入结帐页面。服务器为$100总额创建一个条带PaymentIntent,并将“客户端密码”发送到浏览器
  • 客户的浏览器显示结帐页面,显示总共100美元,以及Stripe的付款表单
  • 客户打开一个新标签,将10个B项添加到他们的购物车中,现在总计200美元
  • 客户返回“结帐”选项卡,并使用Stripe完成100美元的付款(网站无法阻止这一点-这一切都发生在客户端)
  • Stripe通过webhooks异步通知站点我们已获得100美元的付款。我们现在该怎么办
  • 付款总额与购物车总额不再匹配。我们必须退款并取消订单吗?我们如何通知客户?我们可能已经向他们展示了一个“订单完成-谢谢”页面,因为在异步通知到达之前,我们无法知道总数是错误的。客户可能已经离开了我们的网站。我们怎么处理他们的购物车

    --这一切的进一步背景:

    每当我的客户想要在他们的网站上进行在线支付时,我总是使用Stripe,因为Stripe的同步模型使我的代码变得既漂亮又简单。客户将输入他们的卡详细信息,Stripe然后返回代表付款的令牌,最后我的服务器端代码将检查所有详细信息是否正确,使用Stripe的API收取款项,并向客户的浏览器返回“谢谢”消息

    但现在,Stripe似乎正在从这种模式转向异步模式(PaymentIntents),在这种模式下,您的服务器应该在完成订单之前侦听已完成付款的通知。按照Stripe的术语,我们应该设置“webhooks”,监听“payment\u intent.successed”事件

    我在过去使用过的所有其他支付网关也都有一个异步模型,即您的Web服务器必须等待网关的某种回调通知我们支付,然后我们才能安全地开始处理订单。PayPal称之为“即时支付通知”,Worldpay称之为“订单网络钩子”,Adflex称之为“Server2ServerNotification”。。。等等


    我正在努力解决的是,在结帐开始和收到付款通知之间的间隙中可能发生的事情。考虑到这些支付网关都在使用这些异步模型,必须有一个简单的解决方案来解决这个(和类似的)问题,但我真的被卡住了-任何建议都将不胜感激。

    我认为您在这里遗漏的主要一点是PaymentIntent金额是在服务器端设置的。这意味着,当您的客户打开一个新选项卡并向其购物车添加更多项目时,您应该能够反映新的金额。然后,当他们切换回另一个选项卡并完成付款时,您应该在PaymentIntent中反映总金额


    您的客户可能仍然会看到与实际收取的金额不同的结帐过程,在这种情况下,我建议您考虑实施,以确保他们总能在购物车中看到总金额。

    我认为您在这里遗漏的主要一点是PaymentIntent金额是在服务器端设置的。这意味着,当您的客户打开一个新选项卡并向其购物车添加更多项目时,您应该能够反映新的金额。然后,当他们切换回另一个选项卡并完成付款时,您应该在PaymentIntent中反映总金额


    您的客户可能仍然会看到结账过程中的金额与实际收取的金额不同,在这种情况下,我建议您考虑实施,以确保他们总能在购物车中看到总金额。

    谢谢Paul-非常感谢您的回复。但我觉得这个解决方案是行不通的。我们现在必须在每个页面加载上调用Stripe的API来检查PaymentIntent的状态,也许还需要另一个调用来用新的总数更新它。这将使我的网站速度慢得令人无法接受。我可以理解为什么WebSocket可能有用,但它们也很难实现。如果我们需要在每个页面加载或WebSocket上对Stripe的API进行服务器端调用,那么PaymentIntents在我看来是不可行的。除非还有更多我不明白的地方。我想我可能还不够清楚。让我用你的步骤再试一次:1。当用户登录或会话启动时,创建PaymentIntent并保存ID 2、3,与步骤4相同。打开新选项卡时,从会话中检索PaymentIntent服务器端,无需前端页面加载逻辑5。PaymentIntent在步骤4中更新,因此尽管旧选项卡仍显示旧价格,PaymentIntent具有新值6。如果
    handleCardPayment
    返回一个200,您知道支付已经成功,webhook用于您自己的日志记录。对于步骤6,请参见此处:旧的charge API和PaymentIntents之间不应该有任何区别,它可以根据需要同步或异步。您说:“4.从会话中检索PaymentIntent服务器端,无需前端页面加载逻辑“我不是说前端的页面加载逻辑。我说的是后台。用户打开一个新选项卡,这意味着浏览器向我们的服务器发送一个新请求。我们如何回应?我们从会话中知道PaymentIntent存在,因此我们必须检索它以检查状态。也许他们