导航
导读
- 书接上文,现在开始讲解如何搭建一个springboot + 支付宝SDK的一个完整基础框架,提高开发效率和代码的扩展性。废话不多说,直接进入主题。
gitee代码地址
- https://gitee.com/zhaifengxi/zhai-docking-alipay-open
- 直接抛代码,大佬可以直接看代码。
设计思路
- 支付宝开放接口代码封装。
- 支付宝开放接口代码与具体业务代码解耦。
- 支付宝开放接口配置代码做活,保证多环境的灵活配置。
- 支付宝开放接口关键日志持久化。
代码结构
- api:接口
- config:配置
- constant:常量
- domain:实体
- prop:自定义微服务配置
- runnner:项目启动
- service:服务
- sync:异步
- util:工具
基础搭建必备
springboot 基础框架
- springboot 2.0.4.RELEASE
支付宝SDK
- alipay-sdk-java 4.11.0.ALL 服务端 SDK(老版)
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.11.0.ALL</version>
</dependency>
pom.xml 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/pom.xml
这里瑞思拜一位技术大佬:battcn 唐亚峰,开发的swagger2组件,非常实用。
封装
- 基于springboot 和 支付宝SDK,如何封装代码,有利于后期的灵活扩展变的尤为重要,故作了如下设计。
一、常量
- 项目启动之后不会随着系统变动的参数收集到常量类里面,方便管理和维护。
public static final String COMMON_SERVER_URL = "https://openapi.alipay.com/gateway.do";
AlipayConstant.java 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/constant/AlipayConstant.java
二、公共出参
- 在支付宝SDK中提供了 AlipayResponse.java这个类。
@ApiField("code")
private String code; //网关返回码
@ApiField("msg")
private String msg; //网关返回码描述
@ApiField("sub_code")
private String subCode; //业务返回码
@ApiField("sub_msg")
private String subMsg; //业务返回码描述
- 但是对于对接方,不管是网关失败还是业务失败,都是支付宝接口调用失败,需要整合为一套返回码+返回码描述。针对支付宝的开放接口出参进行合理封装。
封装返回码+返回码描述
/** 返回码 */
private String code;
/** 返回码描述 */
private String msg;
封装判断支付宝接口是否调用成功
public boolean isSuccess() {
return this.code.equals(AlipayConstant.RESULT_SUCCESS_CODE);
}
封装统一返回码+返回码描述
public BaseAlipayCommonOut commonOut(AlipayResponse response) {
BaseAlipayCommonOut out = new BaseAlipayCommonOut();
if (!AlipayConstant.CODE_SUCCESS.equals(response.getCode()) && StringUtil.isBlank(response.getSubCode())) {
out.setCode(AlipayConstant.RESULT_ERROR_DEF_CODE);
out.setMsg(StringUtil.join(response.getCode(), StringConstant.COLON, response.getMsg()));
} else if (StringUtil.isNotBlank(response.getSubCode()) && !AlipayConstant.SUB_CODE_SUCCESS.equals(response.getSubCode())) {
out.setCode(AlipayConstant.RESULT_ERROR_DEF_CODE);
out.setMsg(StringUtil.join(response.getSubCode(), StringConstant.COLON, response.getSubMsg()));
} else {
out.setCode(AlipayConstant.RESULT_SUCCESS_CODE);
}
return out;
}
BaseAlipayCommonOut.java 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/domain/base/alipay/common/BaseAlipayCommonOut.java
解耦
- 代码解耦的最好办法就是分层,针对支付宝的开放接口特性,分层为:支付宝API基础服务层。对接方根据具体业务拆分为多个支付宝API基础服务层。
核心代码
@SneakyThrows
- 干净优雅代码必备,替代了try catch,除非真的需要手动捕获异常。
调用支付宝接口
- 具体代码如下,参考支付宝接口文档。
结果转换
- 简化支付宝接口返回结果参数。
@SneakyThrows
@Override
public BaseAlipayBlueSeaCreateOut create(BaseAlipayBlueSeaCreateIn in) {
/** 操作:调用支付宝接口 */
AlipayClient alipayClient = new DefaultAlipayClient(AlipayConstant.COMMON_SERVER_URL, alipayApiProp.getAppid(), alipayApiProp.getPrivateKey(), AlipayConstant.COMMON_FORMAT, AlipayConstant.COMMON_CHARSET, alipayApiProp.getPublicKey(), AlipayConstant.COMMON_SIGN_TYPE);
AlipayOpenSpBlueseaactivityCreateRequest request = new AlipayOpenSpBlueseaactivityCreateRequest ();
request.setBizContent(JSONUtil.toStr(in));
AlipayOpenSpBlueseaactivityCreateResponse response = alipayClient.execute(request);
/** 操作:结果转换 */
BaseAlipayBlueSeaCreateOut result = ObjectUtil.copy(response, BaseAlipayBlueSeaCreateOut.class);
BaseAlipayCommonOut commonOut = result.commonOut(response);
ObjectUtil.copy(commonOut, result);
return result;
}
BaseAlipayApiBlueSeaSerImpl.java 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/service/base/alipay/api/BaseAlipayApiBlueSeaSerImpl.java
灵活配置
- 在实际使用时会有多套环境,根据不同环境可能会申请多个支付宝appid,遵循springboot的约定大于配置原则,故做如下设计。
核心代码
alipay: # 支付宝
api:
appid: # 自行配置
publicKey: # 自行配置
privateKey: # 自行配置
AlipayApiProperties.java 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/prop/AlipayApiProperties.java
AlipayApiConfig.java 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/config/AlipayApiConfig.java
application.yml 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/resources/application.yml
关键日志持久化
- 在实际调用过程中,防止接口异常捕获困难,通过关键日志持久化,方便排查问题。当前使用为mongodb进行异步关键业务日志存储。以防mongodb崩溃,业务依然可以正常使用。
核心代码
- BaseAlipayApiBlueSeaSerImpl.java
@Autowired
BizLogSer bizLogSer;
/** 操作:记录业务日志 */
bizLogSer.save(new BizLogSave(new BizLogDataTemp(in, response), AlipayConstant.BLUE_SEA_CREATE_LOG));
BizLogSerImpl.java 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/service/base/bizlog/BizLogSerImpl.java
BizLogAsync.java 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/sync/base/bizlog/BizLogAsync.java
最后
- 这是支付宝接口对接指南的第二篇,主要介绍了如何搭建一个基于springboot+支付宝SDK基础框架,其中涉及了如何搭建、封装、解耦、灵活配置、关键日志持久化,解决五个基本核心问题进行搭建的,希望能给你一些参考。下篇文章针对支付宝开放接口的对接展开细致详细的描述。原创不易,希望大家多多支持。