课程安排
- 支付微服务的需求
- 了解项目中的代码规范
- 阅读渠道管理相关的代码
- 理解分布式锁的应用
- 阅读支付宝扫码支付的代码
- 阅读微信支付扫码支付的代码
- xxl-job的入门学习
- 读懂同步支付状态的两种方式
1、背景说明
目前支付微服务完成了支付宝和微信的对接,主要实现的功能有支付渠道的维护、扫码支付(微信称Native支付,支付宝称当面付)、退款等功能。
其中扫码支付功能是快递员上门取件时,会亮出二维码,用户可以通过支付宝或微信进行扫描后,对运费的支付。
2、需求分析
2.1、整体流程
流程说明: 本资源分享自 www.cx1314.cn 欢迎访问下载该项目
- 用户下单成功后,系统会为其分配快递员
- 快递员根据取件任务进行上门取件,与用户确认物品信息、重量、体积、运费等内容,确认无误后,取件成功
- 快递员会询问用户,是支付宝还是微信付款,根据用户的选择,展现支付二维码
- 用户使用手机,打开支付宝或微信进行扫描操作,用户进行付款操作,最终会有支付成功或失败情况
- 后续的逻辑暂时不考虑,支付微服务只考虑支付部分的逻辑即可
2.2、业务功能
2.3、产品需求
【付款方式】判断寄付/到付交互
- 寄付→点击【取件】进入取件成功页面,点击左上方返回按钮返回待取件任务列表;点击【去收款】按钮进入扫码支付页面,此时用户有双向选择:
-
- 在用户端【待支付】页面进行支付
- 在快递员端【扫码支付】页面进行支付,可选择微信或支付宝进行支付,分别生成不同的收款码,用户进行扫码支付;
- 点击页面左上方返回按钮页面返回至上一页;
- 两种方式支付成功,均显示支付成功页面,点击【知道了】,返回任务列表首页
- 到付→点击【取件】按钮,进入取件成功页面,点击返回主页按钮进入任务列表主页
2.4、分析
本资源分享自 www.cx1314.cn 欢迎访问下载该项目
支付业务与其他业务相比,相对独立,所以比较适合将支付业务划分为一个微服务,而支付业务并不关系物流业务中运输、取派件等业务,只关心付款金额、付款平台、所支付的订单等。
支付微服务在整个系统架构中的业务时序图:
2.5、开发环境
2.5.1、微服务工程规范
在神领物流项目中,微服务代码是独立的工程(非聚合项目结构),这样更适合多团队间的协作,在部署方面更加的独立方便。
1个微服务需要创建3个工程,分别是:
- sl-express-ms-xxx-api(定义Feign接口)
- sl-express-ms-xxx-domain(定义DTO、枚举对象)
- sl-express-ms-xxx-service(微服务的实现)
它们之间的依赖关系如下:
2.5.2、拉取代码
需要拉取的工程有3个:
工程名 | git地 |
在idea中拉取开发会有2种方式:
- 每一个工程打开一个idea窗口
- 将多个工程合并到一个idea窗口开发(非maven聚合),每一个工程作为一个module进行开发
在这里我们建议使用第2中方法,这样在开发过程中可以减少多窗口间的切换。
拉取代码完成后,需要添加到项目的modules中:
git分支说明:
在学习阶段我们统一使用master分支。
下面展现了支付微服务的工程结构:
更多最新IT精品,微服务项目实战地址: www.cx1314.cn
├─sl-express-ms-trade-api 支付Feign接口
├─sl-express-ms-trade-domain 接口DTO实体
└─sl-express-ms-trade-service 支付具体实现├─com.sl.ms.trade.config 配置包,二维码、Redisson、xxl-job├─com.sl.ms.trade.constant 常量类包├─com.sl.ms.trade.controller web控制器包├─com.sl.ms.trade.entity 数据库实体包├─com.sl.ms.trade.enums 枚举包├─com.sl.ms.trade.handler 三方平台的对接实现(支付宝、微信)├─com.sl.ms.trade.job 定时任务,扫描支付状态├─com.sl.ms.trade.mapper mybatis接口├─com.sl.ms.trade.service 服务包├─com.sl.ms.trade.util 工具包
2.5.3、代码规范
2.5.3.1、DTO对象
在神领物流项目中,微服务之间的对象传输都使用DTO,命名规范:XxxxDTO(DTO必须大写),并且将DTO类放置到domain工程中,如下:
DTO类中统一使用lombok的@Data注解进行标注。
2.5.3.2、数据校验
微服务之间的接口调用,对于传输的数据是需要做校验的,一般校验方式有2种:
- 方式一:采用hibernate-validator注解方式校验,如下:
- 方式二:在程序中通过if()进行判断,如下:
我们采用哪一种方式呢?实际上在项目中,我们采用二者结合的方式进行校验。
对于第一种方式的补充说明:
- 在Controller中需要增加
@Validated
注解,来开启校验