已创建 paymentintent 时如何防止在另一个选项卡中更改购物车

How to prevent shopping cart alterations in another tab when paymentintent is already created

有没有人找到 this 的解决方案?我好像也得出了同样的结论,无解

如果我去我的应用程序的结帐页面,payintent 是在后端创建的(下面解释了这个过程)。因此,在创建 payIntent 之后,如果我打开一个新选项卡并转到菜单并添加一个新菜单项,firestore 将显示新的(正确的)总数,但是由于创建了付款意图,条带会收取旧的(错误的)总数.

我做的是

  1. 每次加载页面时,我都会向我的后端发送一个 GET 请求来验证用户的身份(使用 firestore/firebase)。

  2. 检查是否有支付意图(支付意图存储在用户对应的firestore中)

(如果用户购物车是空的,则不会创建 payintent)

  1. 将 payInent.clienSecret 和购物车商品发回前端以填充页面

  2. 从前端使用stripe元素和confirmPayment确认支付

(使用 ngrok 页面加载时间约为 800-1200 毫秒,所以我认为还不错)

可能的解决方案是使用 webhooks,当 payintent 正在处理检查和更新定价时,但这似乎是胶带解决方案(如果它能工作的话)。或者在付款成功后使用 webhooks 更新付款,再次看起来像是胶带解决方案(如果它甚至可以工作的话)。

编辑:可能的解决方案 3 在后端使用 cofirmPayment,但根据取消 3ds 身份验证的文档,这就是我在前端进行 confirmPayment 的原因

解决方案: 缺少的部分是您需要在将商品添加到他们的购物车时更新付款意向的金额。添加后,我认为这将解决您的问题。

创建付款意向和更新付款意向(当已创建付款意向时)添加到购物车的功能。然后,每当他们删除项目或编辑项目时,结帐页面上的最终更新 paymentIntent

谢谢贾斯汀迈克尔

我不确定我是否完全理解你的问题。如果您使用其客户端密码确认付款意向 client-side,付款意向将尝试收取当前 amount 设置的费用。 Stripe 永远不会使用以前的或“旧的”金额。

就解决方案而言,我建议您 retrieve the Payment Intent client-side using Stripe.js 当您的客户点击您的“付款”按钮并查看付款意向中的 currently-set amount 是否与您的匹配时'目前正在向他们展示。如果不匹配,则中止付款流程,根据您刚刚检索到的最新版本的付款意向更新您的状态 client-side,提示客户确认新金额,并要求他们点击“付款”再次.