支付宝接口对接指南(四、回调通知对接:websoket方式)【保姆级】

导航

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

    文章目录

      • 导航
      • 导读
      • gitee代码地址
      • 案例:新蓝海活动报名结果通知
            • 支付宝开放接口文档解读
              • 一、新蓝海活动报名结果通知文档地址
              • 二、蚂蚁金服消息文档
              • From 蚂蚁消息服务
            • 核心代码
              • 一、支付宝基础服务层
              • 二、服务启动后开启websoket长连接
      • 避坑指南
            • 一、接收不到通知-springboot项目
            • 二、接收不到通知-springcloud项目
      • 最后

导读

  • 经过前三篇的解读,对支付宝开放接口对接已经有了大体的了解,下面针对支付宝回调通知对接进行详细阐述,完成整体的支付宝接口对接闭环。开门见山。老规矩先上gitee代码。

gitee代码地址

  • https://gitee.com/zhaifengxi/zhai-docking-alipay-open

案例:新蓝海活动报名结果通知

支付宝开放接口文档解读
一、新蓝海活动报名结果通知文档地址
  • https://opendocs.alipay.com/apis/01ebii
二、蚂蚁金服消息文档
  • 地址:https://opendocs.alipay.com/open/10381/rkohsn
  • 消息的两种模式:1. From 蚂蚁消息服务 2.To 蚂蚁消息服务
  • From 蚂蚁消息服务:支付宝通知对接平台的消息服务,新蓝海活动报名结果通知 选用此模式来接收回调通知。
  • To蚂蚁消息服务:对接平台发送消息给支付宝平台。未使用,所以不展开说明。
From 蚂蚁消息服务
  • 两种对接方式:1.http(s)协议 2.websocket长连接
  • 官方原话:与 http(s) 相比,该方式接入性能更优,通道安全,减少成本,接入快速等优势,推荐使用 websocket 长连接 SDK 来接收 From 蚂蚁消息。所以选择使用此方式。
  • 消息通知间隔频率:2m、10m、10m、1h、2h、6h、15h
核心代码
一、支付宝基础服务层
@Slf4j
@Service
public class BaseAlipayApiNotifySerImpl implements BaseAlipayApiNotifySer {
     
    @Autowired
    AlipayApiProperties alipayApiProp;
    @Autowired
    BizLogSer bizLogSer;

    @SneakyThrows
    @Override
    public String alipayMessage() {
     
        AlipayMsgClient alipayMsgClient = AlipayMsgClient.getInstance(alipayApiProp.getAppid());
        alipayMsgClient.setConnector(AlipayConstant.COMMON_MESSAGE_SERVER_URL);
        alipayMsgClient.setSecurityConfig(AlipayConstant.COMMON_SIGN_TYPE, alipayApiProp.getPrivateKey(), alipayApiProp.getPublicKey());
        alipayMsgClient.setMessageHandler(new MsgHandler() {
     
            /**
             * 客户端接收到消息后回调此方法
             * @param msgApi 接收到的消息的消息api名
             * @param msgId 接收到的消息的消息id
             * @param bizContent 接收到的消息的内容,json格式
             */
            @Override
            public void onMessage(String msgApi, String msgId, String bizContent) {
     
                /** 操作:记录业务日志 */
                BaseAlipayApiMessage message = new BaseAlipayApiMessage();
                message.setMsgApi(msgApi);
                message.setMsgId(msgId);
                message.setBizContent(bizContent);
                bizLogSer.save(new BizLogSave(new BizLogDataTemp(message, null), AlipayConstant.MESSAGE_LOG));

            }
        });
        /** 开启websoket长连接 */
        alipayMsgClient.connect();
        return JSONUtil.toStr(alipayMsgClient);
    }
}

BaseAlipayApiNotifySerImpl.java 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/service/base/alipay/api/notify/BaseAlipayApiNotifySerImpl.java

二、服务启动后开启websoket长连接
@Component
public class StartupRunner implements CommandLineRunner {
     
    @Autowired
    BaseAlipayApiNotifySer baseAlipayApiNotifySer;

    @Override
    public void run(String... args) throws Exception {
     
        log.info(StringUtil.join(RUNNER_NAME, LogConstant.SERVICE, METHOD_QUERY));
        /**
         * 保证每次服务启动时,调用蚂蚁金服connect方法
         */
        String result = baseAlipayApiNotifySer.alipayMessage();
        log.info(StringUtil.join(RUNNER_NAME, LogConstant.RESULT, METHOD_QUERY, LogConstant.SUCCESS, JSONUtil.toStr(result)));
    }
}
  • 因为使用的websoket方式,每次项目重启都需要调用SDK中的connect方法,保持长连接。

StartupRunner.java 详情:https://gitee.com/zhaifengxi/zhai-docking-alipay-open/blob/master/src/main/java/zhai/docking/alipay/runner/StartupRunner.java

  • 以上核心代码就是完整的一套对接支付宝回调通知websoket方式的核心代码。

避坑指南

  • 上面的一整套代码已经躲避了支付宝开放接口的坑,下面讲解下这些坑。
一、接收不到通知-springboot项目
  • 原因:需要通过支付宝SDK的connect方法开启长连接,项目如果停止,启动之后仍然需要调用connect方法。
二、接收不到通知-springcloud项目
  • 原因:接口链路某个地方断掉了,需要通过调用connect方法,重新保持长连接。
  • 实际发生场景:gateway网关服务停后重启,业务微服务未停止,此时也接收不到通知,依然需要调用connect方法,重新保持长连接。
  • 可以提供一个手动触发connect的口,当链路中断的地方,常见网关服务,通过手动触发(如:restful接口)来进行启动长连接。

最后

  • 本篇主要通过 “案例:新蓝海活动报名结果通知”,来完整串联如何开发对接支付宝回调通知,通过对具体文档、核心代码、避坑指南来进行详细分析,希望能给你一些参考。在这里发现自己的薄弱知识websoket和https,故下篇主要讲解http和websoket由浅入深,原创不易,希望大家多多支持。

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