如果order.PaymentProcessing()方法之后的代码报错了,订单未支付,但状态已改为Processing,此时该订单不能重新提交支付

来源:13-7 【应用】模拟支付

慕莱坞0578141

2020-11-23

如果order.PaymentProcessing()方法之后的代码报错了,订单未支付,但状态已改为Processing,此时该订单不能重新提交支付,需把状态改为Pending才能重新支付。
对于此种情况应该如何处理呢

写回答

1回答

阿莱克斯刘

2020-11-25

hello 同学,你的问题非常有水平!如果在PaymentProcessing的时候报错,我们的状态的确应该rollback回到pending,而且这个步骤应该是自动的不需要人工参与。但问题是rollback的逻辑应该放在哪里比较好呢?而我们怎么会知道哪里、哪一步报错呢?这就要结合异常处理才能完成了。

给个例子:

1)第一步,给oder FSM 的Processing状态加一个Permit

    _machine.Configure(OrderStateEnum.Processing)

        .Permit(OrderStateTriggerEnum.Approve, OrderStateEnum.Completed)

        .Permit(OrderStateTriggerEnum.Reject, OrderStateEnum.Declined)

        .Permit(OrderStateTriggerEnum.回到pending, OrderStateEnum.Pending);


2)第二步,在services中给payment处理加上 try...catch

    try{

        order.PaymentProcessing()

    }catch {

        //如果报错,不管任何错误,只要是支付不成功,我们就rollback。当然,你要细化也可以

        order.回到pending()

        // 继续向上抛出异常,让异常被controller接住,返回状态码500,并在log中记录此次异常

        throw exception("支付系统内部错误") 

    }





2
0

.Net 开发电商后端API 从0到精通RESTful

. Net 实战+RESTful思想纵深课程,开发优雅RESTful风格API。

979 学习 · 553 问题

查看课程