付款异步时如何防止购物车变更

时间:2019-03-10 10:42:09

标签: stripe-payments e-commerce shopping-cart

下面的步骤说明了Stripe的PaymentIntent流的问题,但是您可以为其他支付网关提供类似的功能,我已经研究过了其他一些成功完成付款的最终通知从支付网关异步发送给商家的付款网关网站。

  1. 客户在购物车中添加了10项商品A,现在总计为$ 100
  2. 客户转到结帐页面。服务器会为总计100美元的数据创建Stripe PaymentIntent,并将“ client_secret”发送到浏览器。
  3. 客户的浏览器显示结帐页面,显示总计100美元,以及Stripe的付款表格。
  4. 客户打开一个新标签,然后向其购物车中添加10 x商品B,现在总计为$ 200。
  5. 客户返回到“结帐”标签,并使用Stripe完成$ 100的付款(该网站无法采取任何措施来阻止这种情况-发生在客户端)
  6. Stripe异步地通过webhooks通知网站我们已经支付了100美元。我们现在要做什么?

付款总额不再与购物车总额匹配。我们是否必须退还付款并取消订单?我们如何通知客户?我们可能已经向他们显示了“订单已完成-谢谢”页面,因为在异步通知到达之前,我们无法得知总数是错误的。客户可能已经离开了我们的网站。我们如何处理他们的购物车?

-所有这些的进一步背景:

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

但是现在看来Stripe正在从此模型转移到异步模型(PaymentIntents),在该模型中,您的服务器应该在完成订单之前侦听有关完成付款的通知。用Stripe的术语,我们应该设置“ webhooks”来监听“ payment_intent.succeeded”事件。

我过去使用的所有其他支付网关也都具有异步模型,从某种意义上说,您的网络服务器必须等待网关进行某种回调以通知我们付款,然后我们才能安全地开始处理命令。 PayPal将其称为“即时付款通知”,Worldpay将其称为“订购Webhooks”,Adflex将其称为“ Server2ServerNotification” ...等。

在我苦苦挣扎的地方,我试图应对在结帐开始到收到付款通知之间的时间间隔内可能发生的事情。鉴于这些支付网关都使用了这种异步模型,因此必须有一个简单的解决方案来解决这个(以及类似的)问题,但是我真的很固执-任何建议都将不胜感激。

1 个答案:

答案 0 :(得分:0)

我认为您在这里缺少的要点是PaymentIntent数量是在服务器端设置的。这意味着,当您的客户打开新标签并向其购物车中添加更多商品时,您应该updating the PaymentIntent on your server来反映新金额。然后,当他们切换回另一个标签并完成付款时,您应该将总金额反映在PaymentIntent中。

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