处理成功的付款处理但数据库更新失败
我试图在我的一个express.js路由中实现一个分条签出过程。 要做到这一点,我有:
- 官方的Node.js条纹模块
- 官方的客户端条纹模块
- 一个JSONlogging器,我用来logging的东西,如JavaScript错误,传入的请求和外部服务,如条纹,mongodb等响应…
- 一个使用mongoose定义的
Order
模型 – 一个MongoDB ODM
我的步骤如下:
客户:
- 提交包含条形支付令牌的订单详细信息
服务器:
- 创build一个无薪订单并保存到数据库(
order.status
被created
) - 使用条纹客户端来收取用户的信用卡/借记卡
- 更新订单并保存到数据库(
order.status
被accepted
或failed
取决于来自Stripe的响应)
问题 :如果在步骤2之后付款成功,但在步骤3中更新订单时发生错误(由于数据库服务器错误,停电或类似情况),有什么适当的方法可以处理这种故障情况并可能从中恢复?
有了支付系统,你总是需要一个合理的过程(每小时,每天,每月)基于合理的会计原则,将检查每一个资金stream量匹配。
在你的情况下,我build议每个外部asynchronous调用logging发送的参数和收到的响应。 如果在一定的时间内没有响应,就知道外部系统出现了问题(Stripe,在你的情况下),或者从外部系统回来的路上(你提到数据库故障在你身边)
基本上,对于你产生的每一个asynchronous“交易”,你知道什么时候开始,并且在结束之前必须决定合理的时间。 因此在数据库中有一个expected_end_ts。
如果您在expected_end_ts之后没有收到答案,那么您知道有什么地方是错误的。 然后你可以向Stripe或其他PSP请求状态。 希望API能够给你一个理智的答案,看看付款是否已经结束。
另外请注意,您应该在1.和2之间添加一个步骤:重新读取数据库。 你要确保你所做的每一个支付请求都在数据库中,完全按照你要发送的方式存储。