导航
导读
- 经过前三篇的解读,对支付宝开放接口对接已经有了大体的了解,下面针对支付宝回调通知对接进行详细阐述,完成整体的支付宝接口对接闭环。开门见山。老规矩先上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 {
/**
* 保证每次服务启动时,调用蚂蚁金服connect方法
*/
String result = baseAlipayApiNotifySer.alipayMessage();
}
}
- 因为使用的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接口)来进行启动长连接。
这个问题关键点在于分布式项目如何保持websocket通信,分布式项目会有很长的链路,至少两层,先是网关然后是具体微服务,中间任意环节中断websocket也会中断通信,导致接不到消息,所以需要针对分布式服务做好websocket的长连接的畅通。
最后
- 本篇主要通过 “案例:新蓝海活动报名结果通知”,来完整串联如何开发对接支付宝回调通知,通过对具体文档、核心代码、避坑指南来进行详细分析,希望能给你一些参考。在这里发现自己的薄弱知识websoket和https,故下篇主要讲解http和websoket由浅入深,原创不易,希望大家多多支持。