处理支付成功但数据库更新失败
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.status
是 created
)
使用 Stripe 客户端向用户的信用卡/借记卡收费
更新订单并保存到数据库(order.status
是 accepted
或 failed
,具体取决于 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 之间添加一个步骤:重新读取数据库。您要确保您发出的每个付款请求都确实在数据库中,并完全按照您要发送的方式存储。
【讨论】:
以上是关于处理支付成功但数据库更新失败的主要内容,如果未能解决你的问题,请参考以下文章