跟我一起学开源设计第7节: 蓝兔支付平台SDK的封装与设计实现(上)

468 阅读8分钟

之前我们分享过支持个人签约类型的蓝兔支付平台的申请教程,本文开始基于其提供的API,进行SDK的封装的源码设计解析。如果你想做支付业务的开发和练习,不如先去申请下蓝兔支付平台的商户吧,最快20分钟内完成签约。操作过程可以看之前的分享的这篇文章:

申请支持个人签约的蓝兔支付平台

一、背景

在上一篇文章中,我们分析了开源项目微信支付工具包wxjava的核心代码结构与流程,大家应该理解了Spring Boot Starter的设计流程和套路,也对SDK的设计有了一定的认识,本节针对目前封装的蓝兔支付SDK,进行分享,分享他是如何封装和设计的,以及在代码设计上能够学到什么内容,如果你之前认真学习过上篇文章中的wxjava项目,可以非常快速的理解和入手。目前我封装的蓝兔支付的SDK的项目地址为:

github.com/wuchubuzai2…

目前项目的核心设计思想与代码设计思路基本都来源于wxjava项目,通过结合这个项目,目前这个SDK项目能够让我们学习到如下内容:

本文分享前2个知识点。

二、SDK设计与实现

1、项目中的Spring Boot Starter设计

对于一个SDK常见的开发流程为,通常先开发基础的Java SDK工程,然后提供Starter的能力,而我在设计这个项目的时候,采用的是反推的方式,先设计和开发出来一个Starter工程,然后定义好上层提供的接口,先完成Starter组件设计,然后再去细化核心的业务类,Starter的设计思想和套路再之前的几篇文章已经讲过,这个蓝兔支付的SDK的Starter组件也是如此,工程结构如下:

同样的在SDK中,为使用提供了一个Properties的属性配置类,让用户提供支付的商户号、秘钥等信息,然后再自动装配的Configuration类中进行类的状态,代码如下所示:

从中可以看到2个核心的类:

LantuWxConfigStorage(存储我们属性、参数等)

LantuWxPayService(作为全局的访问入口,业务代码使用的入口,会根据不同的HTTP类型来进行注入)

2、项目中的HTTP框架层的设计

对于一个SDK来说,通常都会提供HTTP请求的设计,针对网络请求统一封装,而wxjava项目中设计和抽象的非常好,我们的SDK也是如下,HTTP层的代码截图如下:

在HTTP包中,我们定义了3个接口,2个抽象类,OKHTTP框架封装的实现类,当你看到接口和抽象类的时候,会想到什么?

没错,这里是策略模式+模板方法设计模式的设计与实现,同时通过泛型化的参数设计,实现了一套接口,兼容不同的HTTP三方框架的请求模型,学会和掌握此模型,可以让我们日后设计其他SDK和三方Open API接口封装的时候,都可以用同一套来实现。先来看下3个接口的设计:

RequestHttp接口设计:

非常的简单,提供了3个方法和泛型化参数,将真实的HTTP请求框架分成了泛型化请求类型、泛型化代理类型的设计,同时提供了枚举类,那么我们日后对接OKHTTP、HTTPClient、RestTemplate等不同的HTTP网络请求框架时,都可以实现此接口。

RequestExecutor接口设计:

RequestExecutor的含义是代表请求的执行器,比如是Get请求还是Post请求都交给子类去实现,或者自定义的特殊的请求处理,也交给子类去实现,这个类只负责定义请求执行器的公共抽象。

ResponseHandler的设计:

ResponseHandler代表的响应的处理器,可以通过自定义的响应处理器,来实现请求结果的数据的解析和处理。

AbstractPostRequestExecutor的设计与实现:

AbstractPostRequestExecutor提供了抽象的Post请求的执行器,同时负责不同的HTTP请求框架的Post实现的路由选择,而其内部选择的OkHttpSimplePostRequestExecutor类,则封装了OKHTTP这个框架请求时的核心业务逻辑,并封装成了对应的方法,以便统一进行调用,代码如下所示:

3、项目中的请求和响应模型的设计

对于一个SDK来说,非常常见的一个点就是会针对接口的请求、响应来做模型,封装出对应的Java类,让使用者为这些类提供参数即可,很多SDK种的设计都是以Request结尾或Response结尾或Result结尾来作为请求和响应模型的设计,这个也是值得我们学习的,当在网上看到一个开放的Open API时,如果其提供了SDK,可以去很容易的找到对应的请求和响应模型的设计,同样在当前蓝兔支付的SDK设计中,也提供了,代码结构如下:

这里面针对订单创建api、订单查询api、订单退款api做了请求和响应的模型设计,参数与其提供的API文档一致,同时提供了一个公共请求的父类:AbstractWxPayRequest,该类和这些子类整合在一块又是一套策略模式+模板方法模式的融合,截图1代码如下:

在第1张的截图中,我们在理解蓝兔API的情况下,定义了3个属性:商户号、时间戳、签名,这三个参数是蓝图支付的所有API都需要传递的3个参数,所以我们进行了抽象,同时使用fastjson的jsonfield注解,来表示请求的参数名称。提供了一个公共的checkFields方法,检查类上面是否有必填参数的校验。

定义了checkAndSign方法来完成请求参数的检查和统一的签名处理。继续看代码:

在这里我们定义了getIgnoredParamsForSign这个方法,来让子类提供哪些参数不参与参数签名,对于蓝图支付的Open API来说,必填项的参数是需要签名的,非必填项的参数是不需要签名的,这里提供一个默认方法。

同时定义了getSignParams方法,来获取签名的内容,同时提供了模板方法设计模式中的钩子方法,让不同的子类提供storeMap的实现,该方法也是一个抽象方法,实现的子类必须要重写实现的方法。

以订单创建这个请求为例:

这样,设计了一套请求模型,对于新API的接入和整合,只需要定义不同的请求的结构的实现类即可,无需关注请求的调度,也做到了开闭原则。

针对HTTP的响应,在理解了蓝图支付的响应内容后,我们设计了一个公共的类,并结合泛型来接收不同的响应类:

然后不同的响应的实现类的设计如下:

对于使用者来说,只需要将响应内容传入到fromjson方法中,就可以解析出来符合当前结构的响应数据。

本篇文章只分享到这里,分享的过多感觉大家容易忘记。感兴趣的可以先看下代码,我们在下篇文章中继续分享这个SDK的设计。

三、蓝兔支付SDK的集成

在开发蓝兔支付SDK后,我们可以很方便的集成使用,快速上手,集成的说明在Github仓库描述文件中:

github.com/wuchubuzai2…

四、总结

今天简单的分享了蓝图支付平台的SDK的设计中的一部分,如果你感兴趣,可以一起来参与开发哦,可以将目前还未实现的点来进行开发,将wxjava中的那些好的优秀的设计同步过来,让自己的设计经验提高,往往设计经验来源于无数个小的设计项目的练习,如果你后续想在面试中,增加一行描述,可以写个类似这种的自定义封装的设计与实现,个人觉得也是不错的。近期还会封装一个智趣百川的SDK设计,加入了token机制,也是会用到wxjava中的设计,感兴趣的可以来一起搞一搞哦。我非常相信,当你熟悉了这种三方Open API请求的SDK设计后,可以非常优雅的写一写代码了。

五、练习

1、阅读SDK项目源码,看看是否有不懂和不理解的地方,可以与我交流哦,也可以分享学习收获哦

2、尝试为SDK项目做下开源贡献,参与建设,多少简历上可以让你一行描述信息