首页 > 其他分享 >三方系统多渠道多场景的思考及代码分享

三方系统多渠道多场景的思考及代码分享

时间:2023-07-20 23:55:18浏览次数:39  
标签:三方 场景 代码 channelCode 接口 多渠道 渠道商

一 背景

我们的业务中,经常会遇到多渠道+多场景的的需求。多渠道我们可以理解为,多个服务商同时为我们某一个功能提供服务,多场景就是同一个服务商下面的多种服务,我们通过几个例子来具体看下:

我们有个电商平台,系统在付款时候弹出选项,让用户自主选择支付宝/微信/京东白条等支付,那么这里的支付宝、微信、京东我们都可以理解为他是我们的渠道。
同时,既然接入了支付宝/微信等,我们的系统就不再会单单使用他们的一个支付功能,还会涉及到对账、退款等等操作,那么这些操作,我们称之为场景。

类似的,有的公司需要将订单进行推送,根据订单类型,推送到淘宝、拼多多等。那么淘宝和拼多多也属于渠道,同样的,有了下单,那么还会有退单、订单对账等都属于场景。通过这样的案例分析下来,我们会发现,我们身边有很多这样的需求。如果针对这类需求,我们的代码缺少一些架构设计,那么就会带来很多问题,比如:

  • 代码复用度不够,新增需要会产生大量重复的冗余代码;
  • 代码耦合度过高,业务逻辑和三方交互代码夹杂在一起,每次改动牵一发而动全身,影响面不好评估。

此类问题应该存在一些通用的解决方案,可以实现以下特点:

  • 面向接口编程:业务方调用三方服务的时候,不需要关心具体服务商的实现,只针对接口调用;
  • 对拓展开放,对修改关闭:每次新增一个渠道,或者新增一个场景,对已有的代码应该是无冲突的,不需要改动的。

二 案例分析

2.1 下单支付案例

我们以下单支付为案例,通过时序图的流程来梳理下我们的思路:

关于和三方请求的操作,一般就分为两类:

  • 请求三方系统;
  • 三方系统处理完成,回调通知。

2.2 请求类

请求三方系统的具体流程如下:

不同场景下,流程相同,但是还会存在一些差异点,我们总结一下:

  • 通用:数据加签/加密,重试+告警,返回结果解密,操作日志记录等;
  • 差异:模型转换字段不一样,发起请求的方式和路径不一样;

2.3 回调类


不同回调场景也可能会存在一些差异,我们总结一下:

  • 通用:回调日志记录,数据解密,响应三方系统;
  • 差异:模型转换字段不一样,执行业务操作不一样;

2.4 渠道商的拓展

多渠道多业务通过以上分析基本上都是可以枚举的,可以通过以下表格进行拓展:

三 代码实现

代码已开源到Github:https://github.com/Shiyajian/mall-example
代码可能运行有问题,主要展示的是思路,下面是针对项目的讲解。

3.1 设计思路

通过案例分析,我们分析出来了通用和差异点,对于通用的部分,我们采用封装成标准流程,差异的地方,我们定义拓展点接口,不同渠道方各自实现,每个渠道方的代码要物理隔离。

3.2 代码结构分包

代码主要分为三部分:核心业务代码、架构代码、拓展实现代码。

  • 核心业务代码:就是我们平常写的业务代码,应该和具体的三方系统交互解耦,面向接口编程,不感知三方系统模型,也不感知具体的渠道实现。
  • 架构代码:根据不同的渠道和场景,找到对应的实现,并且提供部分流程编排能力
  • 拓展点接口定义:抽象的能力接口和公用;
  • 拓展点实现代码:不同场景不同渠道的实现。

3.3 spi 接口定义


主要使用策略模式,这里通过接口进行抽象定义,代码主要分为三个部分:

  • call :表示调用第三方渠道商的抽象服务接口;
  • callback:表示第三方渠道商回调业务系统的接口,每个场景按包进行细分
  • common:一些公用的枚举和标记性接口定义

拓展方式:

  • 如果需要新增调用渠道商的接口,那么在 ChannelCaller中定义方法,在 spi-impl 中实现;
  • 如果需要新增回调方法,首先在 ChannelCallbackSceneEnum 中增加类型,在 callback 中新增一个包,新建一个 request 模型和 parser 模型,request 表示渠道方传入的参数,parser 表示如何转换成我们业务系统模型;

3.4 spi 实现方式


每个渠道商为一个package,里面实现 call 和 callback 定义的接口即可,按需自己增加常量和工具类等;

3.5 spi的发现及路由


通过 Manger 管理类进行查找具体实现,并进行一定业务逻辑的编排,处理日志记录,错误处理等通用流程。

3.6 业务代码使用

需要调用渠道商接口的时候,通过以下方式进行调用:

@Override
public String pay(ChannelCodeEnum channelCode, Object args) {
    // 1、创建支付单;
    PayOrder payOrder = new PayOrder();
    // 2、支付单入库;

    // 3、根据不同支付渠道,调用三方的支付单创建
    ChannelCaller channelCaller = channelCallerManager.of(channelCode);
    channelCaller.submitPay(payOrder);

    // 4、更新三方订单号入库

    // 5、返回前端唤醒参数
    return payOrder.getPayParams();
}

渠道商接口回调时候,通过下面方式进行参数的转换,转换完成后执行自己系统逻辑:

@RequestMapping("/pay/{channelCode}/{bizNo}")
public ResponseEntity<?> paySuccessCallback(HttpServletRequest request,
                    @PathVariable(value = "channelCode") String channelCode,
                    @PathVariable(value = "bizNo") String bizNo) {

    log.info("进入[" + channelCode + "]支付成功回调:bizNo:[" + bizNo + "] ");

    ChannelCodeEnum channelCodeEnum = ChannelCodeEnum.ofCode(channelCode);
    return channelCallbackHandlerManager.run(channelCodeEnum, () -> {
        CallbackPayRequest payRequest = channelRequestParserManager.parse(channelCodeEnum, ChannelCallbackSceneEnum.PAY_CALLBACK, request, bizNo);
        return payService.paySuccess(payRequest);
    });
}

结束语

上面就是我在项目开发中,针对多渠道+多场景的一些思考及个人的代码设计。由于经验有限,此方案不一定是最优方案,欢迎大家批评指正,感谢。

求职

上份工作由于公司的资金链问题,失业了,现在找份工作,我简单介绍下自己。
优势:

  • 8年工作经验,有架构、中台、微服务等经验,有虚线管理(10人以下经验),有中厂工作经验;
  • 文档能力较强、代码质量和整洁度较高,有一定代码洁癖;
  • 抗压能力强、沟通能力强、技术热情高、喜欢分享;

劣势:

  • 简历比较花,最近2年3次被裁,都是因为公司业务问题非个人问题;
  • 文科专业,跨行入门。
    如果你们公司是个小而美的公司,而且缺人,感觉我还不错,欢迎 call 我,我个人还是属于性价比比较高的。
    微信: 153 5500 0708 (如果不是推荐工作,单纯交友也可以加)
    不考虑中大厂(阿里、字节、得物等大中厂),只考虑小厂,创业公司也可以……,不是瞧不上大厂,现在环境下,大厂要求太高,我的简历筛选基本不会过,所以不去尝试了,曾经字节也在HR面被刷了,所以已经对大厂不抱希望了。

标签:三方,场景,代码,channelCode,接口,多渠道,渠道商
From: https://www.cnblogs.com/shiyajian/p/17570040.html

相关文章

  • Redis的五大数据类型及其使用场景
    前言redis是一个非常快速‎‎的非关系数据库‎‎解决方案。其简单的键值数据模型使Redis能够处理大型数据集,同时保持令人印象深刻的读写速度和可用性。‎redis提供了五种数据类型,分别是是:1、string(字符串);2、hash(哈希);3、list(列表);4、set(集合);5、sortset(有序集合)(其实随着Redis......
  • 4-7-vue框架-第三方ui组件elementui-el-select组件change事件获取label的值
    Element的el-select组件change事件获取label的值在如下el-select组件的代码中,要想在change事件时获取label的值。<el-selectv-model="ruleForm.usualReviews":readonly="true"class="oms-select"placeholder="请选择常用意见"@change="selectCh......
  • 【网易云信】直播场景播放侧常见问题分析与实践经验
    常见的播放流程播放器主要流程分析 播放器的播放流程与推流过程类似,但是顺序相反。推流端先采集音频和视频,进行音视频编码和封装,并按照流媒体协议进行处理,最终得到输出流。而播放器则将输入流经过解析和解封装,得到音频包(如AAC)和视频包(如H.264、H.265),并进行解码以获取音频帧......
  • appsmith使用第三方库进行http请求
    安装使用exportdefault{ debugMeter:async()=>{ letrID=Number(Select1.selectedOptionValue); letmetricName=Input6.text; letmeterAsset=Input7.text; letbusAddr=Input8.text; letmeterAddr=Number(Input9.text); letregisterAddr=......
  • Cilium系列-1-Cilium特色 功能及适用场景
    系列文章Cilium系列文章Cilium简介Cilium是一个开源的云原生解决方案,用于提供、保护(安全功能)和观察(监控功能)工作负载之间的网络连接,由革命性的内核技术eBPF提供动力。Cilium主要使用场景是在Kubernetes中,但Cilium的优势并不仅限于Kubernetes环境。在Kuberne......
  • 上下文(context)在odoo14中的作用以及功能。并举例说明 。最后再总结一下。所能用到的场
    在Odoo中,上下文(context)是一个非常重要的概念。Context是一个Python字典,它在各种方法之间传递,并且可以影响这些方法的行为。Context的主要作用和功能:传递参数:在执行方法的过程中,可以通过context传递参数。这些参数可以影响方法的行为。本地化:context中有一些特殊的......
  • 反向代理在系统结构中的应用场景
                    worker_processes1;#允许进程数量,建议设置为cpu核心数或者auto自动检测,注意Windows服务器上虽然可以启动多个processes,但是实际只会用其中一个events{#单个进程最大连接数(最大连接数=连接数*进程数)#......
  • 免费下载1000+工程建筑、设计领域资料,助力打造出高质量设计方案和汇报场景!
    作为一名工程设计、施工人员,设计方案制作、工程汇报场景搭建的情景再常见不过。日常需要的模型是必不可少的,但最令人头大的问题是如何寻找方案素材。想要表达的信息越多,素材获取就越是苦恼!有没有一款软件能够集方案三维汇报展示与模型数据下载为一体呢?当然有。图新说,作为国产三......
  • 分布式事务的对比、优缺点、适用场景及使用注意事项
    分布式事务的对比、优缺点、适用场景及使用注意事项分布式事务是指涉及到多个独立节点之间的事务处理,这些节点可能位于不同的物理设备或不同的网络环境下。在分布式系统中,由于节点的独立性和异构性,分布式事务的处理变得更加复杂和困难。为了确保分布式系统中数据的一致性和可靠性,......
  • 【测试联调】如何在前后端测试联调时优雅的构造异常场景
    背景当前的应用都使用了前后端分离的架构,前后端系统需要协同以实现各种功能。后端系统通常负责处理业务逻辑、数据存储和与其他服务的交互,而前端则负责用户界面和用户交互。而在前后端数据交互的过程中,各种异常和错误都有可能发生,确认异常发生时前后端系统的处理是否合理是测试验......