处理支付成功但数据库更新失败

Posted

技术标签:

【中文标题】处理支付成功但数据库更新失败【英文标题】:Handling successful payment processing but database update failure 【发布时间】:2014-10-13 23:05:46 【问题描述】:

我正在尝试在我的 express.js 路由之一中实现条带结帐流程。为此,我有:

官方 Node.js Stripe 模块 官方客户端 Stripe 模块 一个 json 记录器,我用来记录诸如 javascript 错误、传入请求和来自外部服务(如 stripe、mongodb 等)的响应…… 使用 mongoose 定义的 Order 模型 - MongoDB ODM

我的步骤如下:

客户:

    提交包含条纹支付令牌的订单详细信息

服务器:

    创建未付款订单并保存到数据库(order.statuscreated) 使用 Stripe 客户端向用户的信用卡/借记卡收费 更新订单并保存到数据库(order.statusacceptedfailed,具体取决于 Stripe 的响应)

问题:如果在第 2 步之后支付成功,但在第 3 步更新订单时出现错误(由于数据库服务器错误、中断或类似原因),有哪些合适的方法来处理此失败并有可能从中恢复?

【问题讨论】:

一个确认系统?再次尝试直到收到 +ve ACK 好主意。用 5 次尝试 (github.com/caolan/async#retry) 将 db save 调用包装在 async.js 重试函数中可能会很有用。我认为还有进一步改进的空间。 【参考方案1】:

对于支付系统,您始终需要一个基于健全的会计原则的整合流程(每小时、每天、每月),以检查每笔资金流是否匹配。

在您的情况下,我建议每个外部异步调用都记录发送的参数和接收的响应。如果您在特定时间内没有响应,则您知道外部系统(在您的情况下为 Stripe)或从外部系统返回的途中出现问题(您提到您身边的数据库故障)

基本上,对于您生成的每个异步“事务”,您都知道何时启动它,并且必须在它结束前确定合理的时间量。因此,您在数据库中有一个 expected_end_ts。

如果您在 expected_end_ts 之后还没有收到答复,您就知道出了点问题。然后你可以向 Stripe 或其他 PSP 询问状态。希望 API 能够为您提供关于付款是否通过的合理答案。

还请注意,您应该在 1. 和 2 之间添加一个步骤:重新读取数据库。您要确保您发出的每个付款请求都确实在数据库中,并完全按照您要发送的方式存储。

【讨论】:

以上是关于处理支付成功但数据库更新失败的主要内容,如果未能解决你的问题,请参考以下文章

汇聚,杉德,微信原生支付,支付宝成功/失败回调记录

java中,支付成功后要进行数据库的修改,如何做?

oauth2 spring-security 成功和失败处理程序

双乾支付

axios拦截器

C# 代码执行并且数据库表成功更新但仍然出现错误