下面的步骤说明了我在 Stripe 的 PaymentIntent 流程中遇到的问题,但是您可以对我研究过的其他支付网关提出类似的方法,其中成功支付的最终通知是从支付网关异步发送到商家站点的。
- 客户将 10 件商品 A 添加到购物车,现在总计 100 美元
- 客户进入结账页面。服务器创建总计 100 美元的 Stripe PaymentIntent,并将“client_secret”发送到浏览器。
- 客户的浏览器显示结账页面,显示总计 100 美元,以及 Stripe 的付款表格。
- 客户打开一个新选项卡,并将 10 个商品 B 添加到购物车中,现在总计 200 美元。
- 客户返回结账选项卡,并通过 Stripe 完成 100 美元付款(该网站无法阻止这种情况发生 - 这一切都发生在客户端)
- Stripe 通过 Webhook 异步通知网站我们已收到 100 美元的付款。我们现在干什么?
付款总额不再与购物车总额相符。我们必须退还货款并取消订单吗?我们如何通知客户?我们可能已经向他们展示了“订单完成 - 谢谢”页面,因为在异步通知到达之前我们无法知道总数是错误的。客户可能已经离开我们的网站。我们如何处理他们的购物车?
-- 所有这一切的一些进一步背景:
每当我的客户想要在他们的网站上进行在线支付时,我总是会求助于 Stripe,因为 Stripe 的同步模型使我的代码变得又好又简单。客户输入他们的银行卡详细信息,Stripe 将返回代表付款的令牌,最后我的服务器端代码将检查所有详细信息是否正确,使用 Stripe 的 API 收款,并向客户返回一条“谢谢”消息。浏览器。
但现在 Stripe 似乎正在从这种模型转向异步模型(PaymentIntents),在这种模型中,您的服务器应该在履行订单之前侦听已完成付款的通知。用 Stripe 的术语来说,我们应该设置“webhooks”来监听“ payment_intent.succeeded”事件。
我过去使用过的所有其他支付网关也都有异步模型,从某种意义上说,您的网络服务器必须等待网关的某种回调通知我们付款,然后我们才能安全地开始处理订单。 PayPal 称之为“即时付款通知”,Worldpay 称之为“Order Webhooks”,Adflex 称之为“Server2ServerNotification”...等等。
我正在努力的地方是试图应对在结账开始和收到付款通知之间可能发生的事情。鉴于这些支付网关都使用这些异步模型,必须有一个简单的解决方案来解决这个(和类似的)问题,但我真的陷入困境 - 任何建议将不胜感激。
我认为您在这里缺少的要点是 PaymentIntent 金额是在服务器端设置的。这意味着当您的客户打开新选项卡并将更多商品添加到购物车时,您应该更新服务器上的 PaymentIntent https://stripe.com/docs/api/payment_intents/update以反映新的金额。然后,当他们切换回另一个选项卡并完成付款时,您的 PaymentIntent 中应该会反映总金额。
您的客户可能仍然会看到结账流程中的金额与实际收取的金额不同,在这种情况下,我建议您考虑实施网络套接字 https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API确保他们始终看到购物车中的总金额。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)