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

我试图在我的一个express.js路由中实现一个分条签出过程。 要做到这一点,我有:

  • 官方的Node.js条纹模块
  • 官方的客户端条纹模块
  • 一个JSONlogging器,我用来logging的东西,如JavaScript错误,传入的请求和外部服务,如条纹,mongodb等响应…
  • 一个使用mongoose定义的Order模型 – 一个MongoDB ODM

我的步骤如下:

客户:

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

服务器:

  1. 创build一个无薪订单并保存到数据库( order.statuscreated
  2. 使用条纹客户端来收取用户的信用卡/借记卡
  3. 更新订单并保存到数据库( order.statusacceptedfailed取决于来自Stripe的响应)

问题 :如果在步骤2之后付款成功,但在步骤3中更新订单时发生错误(由于数据库服务器错误,停电或类似情况),有什么适当的方法可以处理这种故障情况并可能从中恢复?

有了支付系统,你总是需要一个合理的过程(每小时,每天,每月)基于合理的会计原则,将检查每一个资金stream量匹配。

在你的情况下,我build议每个外部asynchronous调用logging发送的参数和收到的响应。 如果在一定的时间内没有响应,就知道外部系统出现了问题(Stripe,在你的情况下),或者从外部系统回来的路上(你提到数据库故障在你身边)

基本上,对于你产生的每一个asynchronous“交易”,你知道什么时候开始,并且在结束之前必须决定合理的时间。 因此在数据库中有一个expected_end_ts。

如果您在expected_end_ts之后没有收到答案,那么您知道有什么地方是错误的。 然后你可以向Stripe或其他PSP请求状态。 希望API能够给你一个理智的答案,看看付款是否已经结束。

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