状态机匹配(三)(从零实现)

之前一直配合源码,来讲,可能有点生硬,所以花了会功夫构思了支付相关的应用场景,写了一个简化版的mapFunc的匹配案例,欢迎提建议

/*
支付相关的状态机
 */
@Component
@Slf4j
@Builder
public class PayFuncMap implements IMapFunction {

    /*
    状态入口:交易请求进入
     */
    @MapFunctionListener(name = "交易请求检查",group = "deal",code = "requestEnter")
    public StateNode dealRequestEnter(StateNode<HttpServletRequest, ResultDTO> currentNode){
        log.info("交易请求进入");
        /*
        注意此处声明是servlet的请求体,最原始请求数据,便于统一处理
         */
        log.info(currentNode.getRequestDto().toString());
        /*
        跟据当前节点的请求入参数去匹配子状态机
         */
        /*
        这里加入一个子检查状态机,签名校验,ip检查,身份验证,交易能力,匹配请求成功或失败
         */

        /*
        拿到子检查状态机的结果回归主线状态机匹配
         */
        boolean 校验成功 = true;
        if(校验成功){
            return StateNode.builder().nodeCode("business_match").build();
        }
        //否则进入交易异常
        return StateNode.builder().nodeCode("deal_exception").build();
    }

    /*
    用于匹配交易的实体
     */
    static class BusinessInfo{}

    @MapFunctionListener(name = "匹配具体交易",group = "business",code = "match")
    public StateNode businessMatch(StateNode<BusinessInfo,ResultDTO> currentNode){
        log.info("business_match");

        log.info(currentNode.getRequestDto().toString());

        /*
        根据请求体去匹配 具体的第三方的支付或退款或账单其他操作,等等
        可以依据实际情况选择是否分离子状态机
         */
        return StateNode.builder().response(ResultDTO.builder().message("测试终点状态").build()).build();
    }
    @MapFunctionListener(name = "支付宝支付",group = "alipay",code = "o2oPay")
    public StateNode alipayO2oPay(StateNode currentNode){
        log.info("alipayO2oPay");
        // 支付宝支付 子状态机
        /*
        1.证书
        2.特有参数组装
        3.发起支付请求
        4.判断请求成功与否
        5.加入订单(等待第三方的支付结果回调,此处也许一个处理)
         */
        return StateNode.builder().response(ResultDTO.builder().message("deal_end").build()).build();
    }

    @MapFunctionListener(name = "支付宝退款",group = "alipay",code = "o2orenfund")
    public StateNode alipayO2oRefund(StateNode currentNode){
        log.info("alipayO2oRefund");
        log.info("alipayO2oPay");
        // 支付宝支付 子状态机
        /*
        1.证书
        2.特有参数组装
        3.发起退款请求
        4.判断请求成功与否
        5.加入订单(等待第三方的支付结果回调,此处也许一个处理)
        6.如果第三方不支持回调,此处需要加入一个异步轮询任务池
         */
        return StateNode.builder().response(ResultDTO.builder().message("deal_end").build()).build();
    }


    @MapFunctionListener(name = "交易结束",group = "deal",code = "end")
    public StateNode dealEnd(StateNode currentNode){
        log.info("test02");
        return StateNode.builder().response(ResultDTO.builder().message("测试终点状态").build()).build();
    }

    @MapFunctionListener(name = "交易异常",group = "deal",code = "exception")
    public StateNode dealException(StateNode currentNode){
        log.info("test03");
        //测试异常
        int ss = 1/0;
        return StateNode.builder().nodeCode("t_test02").build();
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,203评论 25 708
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,229评论 4 61
  • 文/绿骏马 星期天,一家人总会回去看看父母。午饭时,岳父对妞妞说:“还记不记得楼后那个带外孙女的老爷爷?他开了个人...
    绿骏马sja阅读 284评论 0 2
  • 很多时候我们与爱人相处时,我们虽然深爱着彼此,却总是在不经意间伤害对方,而且不一定能够让彼此感到幸福,因为不懂得对...
    翠霞_0256阅读 404评论 1 2
  • 这几天跟我妈聊天,我告诉她,我们学生会有一个小品是我改编,然后上台表演了。虽然在我心里觉得这件事并没有什么了不起的...
    阿来卡桑阅读 157评论 2 1