Node.js 将成功的条带支付存储在my MongoDB中,并在向用户提供产品之前对其进行验证

Node.js 将成功的条带支付存储在my MongoDB中,并在向用户提供产品之前对其进行验证,node.js,mongodb,transactions,stripe-payments,atomicity,Node.js,Mongodb,Transactions,Stripe Payments,Atomicity,我目前正在使用NodeJS和MongoDB开发一个类似于电子商务的应用程序。它不仅仅是一个电子商务,它是一个应用程序,用户可以在其中累积积分以交换产品和服务,从而可以赚取和购买积分 整个系统依赖于两阶段提交协议来确保数据库一致性,当发生错误或禁止操作时,会触发回滚操作以恢复一致性状态 我的团队使用这种方法设计了系统,因此我们可以在任何场景中利用MongoDB的速度,借助Angular 5+Angular Universal构建的SPA,使应用程序超快速并提供更好的用户体验 现在,我们正在实施支付

我目前正在使用NodeJS和MongoDB开发一个类似于电子商务的应用程序。它不仅仅是一个电子商务,它是一个应用程序,用户可以在其中累积积分以交换产品和服务,从而可以赚取和购买积分

整个系统依赖于两阶段提交协议来确保数据库一致性,当发生错误或禁止操作时,会触发回滚操作以恢复一致性状态

我的团队使用这种方法设计了系统,因此我们可以在任何场景中利用MongoDB的速度,借助Angular 5+Angular Universal构建的SPA,使应用程序超快速并提供更好的用户体验

现在,我们正在实施支付系统,我们正在尝试定义处理支付、验证支付并相应更新数据库的最佳方式,以便将购买的产品/服务授予授权用户

我们正在考虑使用Stripe来实现这一点,通过创建令牌客户端并在收费之前将其存储在用户的购物车中,这样我们就可以跟踪未成功的付款以及在每种情况下要采取的相应措施

我们考虑了以下购物车模式:

{
    _id: USER'S MONGODB ID,
    items: [
        {
            _id: ITEM'S MONGODB ID,
            unitaryPrice: Number,
            quantity: Number
        }
    ],
    totalPrice: Number,
    totalItems: Number,
    status: 'ACTIVE',
    paymentInfo: {
        creditCardAmount: Number (value to be paid in cash),
        paymentToken: String (stripe token received from client),
        fromUserBalance: Number (points used from user's balance: defined by user, if he/she wants to use points from their account and if balance is $gt 0 : creditCardAmount + fromUserBalance must be equal to totalPrice before proceeding to charge step)
    }
}
这就是将要发生的顺序:

  • 用户在购物车中添加/删除项目
  • 用户触发签出过程,在该过程中,信用卡信息被发送到Stripe并接收令牌
  • 成功后,此令牌将发送到我们的节点服务器,用户购物车将更新为:

    { 状态:“等待付款”, 付款信息:{ paymentToken:条带生成的令牌 } }

  • 在此之后,用户不能再编辑购物车,直到付款过程完成

  • 在序列中,检索同一个购物车,并尝试向Stripe的令牌收费
  • 成功后,购物车更新为{状态:'PAYMENT_successed'}
  • 出现错误时,购物车将恢复为{状态:“活动”,令牌为$unset}
  • 成功后,将检索同一购物车,并在另一个名为“purchasehistory”的集合中创建一个文档,其中文档的_id是条带标记,使其唯一并防止同一购物车的历史文档重复。在此文档中,存储所有购物车信息,然后清空购物车
  • 在此购买历史记录中触发一个子例程,以使所有产品可供最终用户使用
就是这样,这是我们考虑过的一种机制,可以在我们的网站上进行支付

你们认为这是个好办法吗?过程中是否有任何错误或遗漏步骤?请记住,每一步都是递归进行的,通过使用两阶段提交和仅在文档满足每一步所需的键值时更新文档来保证数据一致性


我最关心的是,在对条带令牌收费之后,系统发生故障,并且我的购物车没有更新为{状态:'PAYMENT_successed'}。在恢复过程中,我必须再次充电,并且我必须收到一个答复,告诉我该代币已成功充电,以便我可以进入购买顺序的下一步。Stripe的SDK是否提供此功能?我可以检查条带令牌是否已成功充电吗?

请记住,好的问题不会要求基于意见的答案。你可能想回答这个问题,重新审视你所问的主观问题。在问题的这一部分,你会问是否有什么被忽视了。谢谢杰森,我会按照你的建议去做!好。。。裁决是什么?结论是什么?发布你的最终答案!