我们的应用程序有不同的计划(基本版、高级版、专业版)。我们使用 Stripe .
成功付款后有信用的客户
通过订阅创建、订阅更新或订阅
循环。
invoice.payment_succeeded
我们服务器上的 webhook 并将用户记入我们的数据库中。 我们面临的问题是这样的:
学分或计划。
stripe.confirmCardPayment()
在客户端上授权 3DS .他被告知付款已完成。 invoice.payment_succeeded
事件没有到达我们的服务器来更新我们的内部客户并将其归功于他积分(或将他的订阅标记为
active
)。所以用户仍然无法使用我们的应用程序。他被告知他没有任何学分。
客户订阅并记入他的信用。
如您所见,第 5 步是有问题的。客户已经付款,但是当他尝试使用他的积分时,他被告知他没有任何积分,因为将记入他的积分的 webhook 尚未到达我们的服务器。
webhook 将在下一分钟左右到达,但与此同时,客户对他支付了积分感到困惑,但在尝试使用积分时,他被告知他没有积分。
你会如何处理这件事?
可能的解决方案
客户端发送 HTTP 调用以记入他的帐户
当
stripe.confirmCardPayment()
成功,从客户端发送一个 HTTP 调用 -> 服务器以信任用户。这种解决方案既不安全又容易出错。
stripe.confirmCardPayment()
之后立即关闭浏览器成功了,将他的帐户记入贷方的调用将永远不会到达我们的服务器。客户端轮询服务器查询成功完成
每
invoice.payment_succeeded
事件在我们的服务器上处理并保存在表中 successful_invoices
.当
stripe.confirmCardPayment()
成功我们轮询我们的服务器以找出如果用
invoice_id
成功开具发票存在于该表中。如果是,我们隐藏加载屏幕并告诉客户他的付款已处理并且他的信用已成功记入贷方。
这是我们目前首选的解决方案。
最佳答案
这是我们在各种支付网关集成中已经面临的问题。您必须等待网络钩子(Hook)确认付款。
然后需要一个备份事件,请求网关确认付款状态是否成功,以便您可以在记录中更新相同的内容。
通常,webhooks 会做必要的事情,否则您的应用程序中的 payment_create 事件可以请求该提供商检查状态。但是,除非您延迟检查此 post payment_create,否则这不会得到更新的可能性很小。
我们尝试添加一个 CRON 来检查过去 1 分钟内付款的状态。上次运行中具有待处理状态的所有付款都从网关提供商处更新为已拣配状态。但是在这种情况下,您需要确保没有记录应该以事件的形式重复运行,从付款创建并同时添加到 cron。
关于stripe-payments - 使用异步 3DS 付款和 webhook 进行订单确认,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66153471/