下面的步骤说明了我使用Stripe的PaymentIntent流程的问题,但您可以为我查看的其他支付网关提供类似的功能,其中成功支付的最终通知从支付网关异步发送到商家网站。
付款总额不再与购物车总额相匹配。我们必须退还付款并取消订单吗?我们如何通知客户?我们可能已经向他们展示了“完成订单 - 谢谢”页面,因为在异步通知到达之前我们无法知道总数是否错误。客户可能已离开我们的网站。我们如何处理他们的购物车?
- 所有这些的一些进一步背景:
每当我的客户想在他们的网站上进行在线支付时,我总是转向Stripe,因为Stripe的同步模型使我的代码变得简单易用。客户将输入他们的卡片详细信息,然后Stripe将返回代表付款的令牌,最后我的服务器端代码将检查所有细节是否正确,使用Stripe的API收取钱,并向客户返回“谢谢”消息浏览器。
但现在似乎Stripe正在从这个模型转向异步模型(PaymentIntents),在完成订单之前,您的服务器应该在完成付款时收听通知。在Stripe的术语中,我们应该设置'webhooks'来监听'payment_intent.succeeded'事件。
我过去使用的所有其他支付网关也都有一个异步模型,因为在我们可以安全地开始处理订单之前,您的网络服务器必须等待来自网关的某种回调通知我们付款。 PayPal称之为“即时付款通知”,Worldpay称之为“订购Webhooks”,Adflex称之为“Server2ServerNotification”......等。
在我努力的地方,正在努力应对在结账开始和收到付款通知之间的差距期间可能发生的事情。鉴于这些支付网关都使用这种异步模型,必须有一个简单的解决方案来解决这个(和类似的)问题,但我真的很困难 - 任何建议都会受到高度赞赏。
我认为你在这里缺少的主要观点是PaymentIntent数量是服务器端设置的。这意味着当您的客户打开一个新标签并向购物车添加更多商品时,您应该使用updating the PaymentIntent on your server来反映新的金额。然后,当他们切换回另一个标签并完成付款时,您应该将总金额反映在您的PaymentIntent中。
您的客户可能仍会看到与实际收费金额不同的结帐流程,在这种情况下,我建议您查看实施websockets以确保他们始终在购物车中查看总金额。