支付宝接口对接指南(二、对接框架基础搭建 springboot+支付宝SDK)【保姆级】

导航

  • 一、支付宝文档解读和支付宝侧沟通
  • 二、对接框架基础搭建 springboot+支付宝SDK
  • 三、支付宝开放接口对接:老版SDK
  • 四、回调通知对接:websoket方式

    文章目录

      • 导航
      • 导读
      • gitee代码地址
      • 设计思路
      • 代码结构
      • 基础搭建必备
            • springboot 基础框架
            • 支付宝SDK
      • 封装
            • 一、常量
            • 二、公共出参
              • 封装返回码+返回码描述
              • 封装判断支付宝接口是否调用成功
              • 封装统一返回码+返回码描述
      • 解耦
          • 核心代码
              • @SneakyThrows
              • 调用支付宝接口
              • 结果转换
      • 灵活配置
          • 核心代码
      • 关键日志持久化
          • 核心代码
      • 最后

导读

  • 书接上文,现在开始讲解如何搭建一个springboot + 支付宝SDK的一个完整基础框架,提高开发效率和代码的扩展性。废话不多说,直接进入主题。

gitee代码地址

  • https://gitee.com/zhaifengxi/zhai-docking-alipay-open
  • 直接抛代码,大佬可以直接看代码。

设计思路

  1. 支付宝开放接口代码封装。
  2. 支付宝开放接口代码与具体业务代码解耦。
  3. 支付宝开放接口配置代码做活,保证多环境的灵活配置。
  4. 支付宝开放接口关键日志持久化。

代码结构

  • 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.sdkgroupId>
    <artifactId>alipay-sdk-javaartifactId>
    <version>4.11.0.ALLversion>
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基础框架,其中涉及了如何搭建、封装、解耦、灵活配置、关键日志持久化,解决五个基本核心问题进行搭建的,希望能给你一些参考。下篇文章针对支付宝开放接口的对接展开细致详细的描述。原创不易,希望大家多多支持。

你可能感兴趣的:(支付宝开放接口对接,java,接口,spring,boot,支付宝)