首页 > 其他分享 >WebSocket长连接接入支付宝消息服务,实现消息通知

WebSocket长连接接入支付宝消息服务,实现消息通知

时间:2023-01-28 15:34:53浏览次数:74  
标签:alipay 支付宝 WebSocket aliPay bizContent msgApi 消息

​大家好,我是小悟

在对接支付宝开放平台的一些常用功能时,常常需要收到支付宝的回调通知结果,才能处理业务逻辑。此文介绍通过WebSocket长连接接入支付宝消息服务,实现消息通知。

包括五部分内容:问题、优势、配置、代码接入、总结。

WebSocket长连接接入支付宝消息服务,实现消息通知_支付宝

问题

比如接入互联网平台直付通二级商户进件时,需要知道这个进件审核的结果,是审核通过还是审核拒绝,就要用到直付通商户进件审核通过消息接口和直付通二级商户进件拒绝消息接口。

再比如接入支付宝小程序模板开发时,需要知道第三应用授权取消结果、小程序审核结果、服务商代创建小程序结果等等,就要用到第三方应用授权取消消息接口、小程序审核通过通知接口、小程序审核驳回通知接口、商户确认服务商代创建小程序结果通知接口等等。

虽然可以通过对应的查询接口主动发起查询结果,但多个业务结果还需开发多个查询接口,体验终归不如由支付宝服务端侧直接通知开发者来的好。所以千万别干“脱裤子放pi,多此一举”的事情来,哈哈哈。

WebSocket长连接接入支付宝消息服务,实现消息通知_支付宝_02

为了解决通知的问题,支付宝开放平台消息服务提供两种通讯协议来接收消息,一种是基于 HTTPS/HTTP,一种是基于 WebSocket 长连接。

优势

选择WebSocket 长连接有诸多优势:

官方提供封装好的SDK,开发者无需考虑通信、验签、组装报文协议,只要专心根据收到的消息处理自身的业务逻辑即可。

无需申请https证书,减少繁琐的证书申请工作,消息也能触达。

开发者无需额外开发一个服务来接收开放平台的消息。

相比之下,WebSocket 长连接有更多的优势,所以一般选择使用WebSocket 长连接来接收支付宝服务端发来的消息。

配置

创建好应用后,在产品绑定-绑定产品,添加对应的产品。

WebSocket长连接接入支付宝消息服务,实现消息通知_支付宝_03

然后在开发设置-消息服务-FROM平台订阅所需监听的消息接口,接入方式选择WebSocket。

WebSocket长连接接入支付宝消息服务,实现消息通知_支付宝_04

WebSocket长连接接入支付宝消息服务,实现消息通知_支付宝_05

接入

以上操作是接入的前提条件,务必检查清楚再进行代码的开发。

可使用普通公钥方式和公钥证书方式接入,方式不同,SDK的使用也不同,这个取决于设置接口加签是何种方式,这边选择的是公钥证书方式。

WebSocket长连接接入支付宝消息服务,实现消息通知_支付宝_06

在代码中引入依赖,这边有个注意点就是,如果选择的是公钥证书模式的话,SDK版本需要使用4.11.54.ALL 及以上版本。

<!-- https://mvnrepository.com/artifact/com.alipay.sdk/alipay-sdk-java -->
<dependency>
<groupId>com.alipay.sdk</groupId>
<artifactId>alipay-sdk-java</artifactId>
<version>4.11.54.ALL</version>
</dependency>

这个是重点,开发一个支付宝消息配置类,支付宝服务端有消息通知时会自动触发。

@Component
@Configuration
@EnableConfigurationProperties({AliPayProperties.class})
public class AliPayMsgConfig {
private static Logger logger = LoggerFactory.getLogger(AliPayMsgConfig.class);
private AliPayProperties aliPay;
public AliPayMsgConfig(AliPayProperties aliPay) {
this.aliPay = aliPay;
}
@Bean
public AlipayMsgClient alipayMsgClient() throws Exception {
AlipayMsgClient alipayMsgClient = AlipayMsgClient.getInstance(aliPay.getAppId());
alipayMsgClient.setConnector("openchannel.alipay.com");
alipayMsgClient.setSecurityCertConfig(aliPay.getSignType(), FileUtil.readUtf8String(aliPay.getAppCertPrivateKeyPath()), aliPay.getAppCertPublicKeyPath(), aliPay.getAliPayCertPublicKeyPath(), aliPay.getAliPayRootCertPath());
alipayMsgClient.setCharset(aliPay.getChartSet());
alipayMsgClient.setMessageHandler(new MsgHandler() {
/**
* 客户端接收到消息后回调此方法
* @param msgApi 接收到的消息的消息api名
* @param msgId 接收到的消息的消息id
* @param bizContent 接收到的消息的内容,json格式
*/
@Override
public void onMessage (String msgApi, String msgId, String bizContent) {
logger.info("receive message. msgApi:{},msgId:{},bizContent:{}", msgApi, msgId, bizContent);
if (StringUtils.equals("alipay.open.app.api.field.changed", msgApi)) {
logger.info("用户信息申请记录审核通知,接收到的消息内容:{}", bizContent);
} else if (StringUtils.equals("alipay.open.auth.appauth.cancelled", msgApi)) {
logger.info("第三方应用授权取消消息,接收到的消息内容:{}", bizContent);
} else if (StringUtils.equals("alipay.open.auth.userauth.cancelled", msgApi)) {
logger.info("用户授权取消消息,接收到的消息内容:{}", bizContent);
} else if (StringUtils.equals("alipay.open.mini.version.audit.passed", msgApi)) {
logger.info("小程序审核通过通知,接收到的消息内容:{}", bizContent);
} else if (StringUtils.equals("alipay.open.mini.version.audit.rejected", msgApi)) {
logger.info("小程序审核驳回通知,接收到的消息内容:{}", bizContent);
} else if (StringUtils.equals("alipay.trade.refund.depositback.completed", msgApi)) {
logger.info("收单退款冲退完成通知,接收到的消息内容:{}", bizContent);
} else if (StringUtils.equals("alipay.open.mini.merchant.confirmed", msgApi)) {
logger.info("商户确认服务商代创建小程序结果通知,接收到的消息内容:{}", bizContent);
}
}
});
alipayMsgClient.connect();
return alipayMsgClient;
}

上面代码的AliPayProperties类是配置了应用的一些参数信息,包括应用id、加签类型、应用私钥证书路径、应用公钥证书路径、支付宝公钥证书路径、支付宝根证书路径、编码格式。

@Data
@ConfigurationProperties(prefix = "alipay")
public class AliPayProperties {
/**
* 加签类型
*/
private String signType;
/**
* 应用id
*/
private String appId;
/**
* 请求使用的编码格式,如utf-8,gbk,gb2312等
*/
private String chartSet;
/**
* 应用私钥证书路径
*/
private String appCertPrivateKeyPath;
/**
* 应用公钥证书路径
*/
private String appCertPublicKeyPath;
/**
* 支付宝公钥证书路径
*/
private String aliPayCertPublicKeyPath;
/**
* 支付宝根证书路径
*/
private String aliPayRootCertPath;
}

总结

当支付宝服务端有给客户端发送消息时,会回调MsgHandler里面onMessage的实现,因此可以在onMessage中处理接收到的消息,根据msgApi消息名判断是哪种接口来处理对应的业务逻辑。

但需要注意的是,因各种异常原因,支付宝服务端可能会重复通知,因此为了业务不重复被处理,需要做幂等性的控制,可根据每条消息的唯一msgId或者自身系统的业务id比如uuid来事先查询。

WebSocket长连接接入支付宝消息服务,实现消息通知_支付宝_07


您的一键三连,是我更新的最大动力,谢谢

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

上一篇:​​一不小心,登上支付宝开发者社区热文榜单Top3​

标签:alipay,支付宝,WebSocket,aliPay,bizContent,msgApi,消息
From: https://blog.51cto.com/wukongmazi/6024944

相关文章

  • 一不小心,登上支付宝开发者社区热文榜单Top3
    ​大家好,我是小悟那天中午要午休的时候,看到微信通讯录新朋友有个红色1,像俺这种有强迫症的,那不得去把它点掉。打开一看,加好友的备注是“我是熊二,支付宝开发者社区运营”。​......
  • WebSocket长连接接入支付宝消息服务,实现消息通知
    ​大家好,我是小悟在对接支付宝开放平台的一些常用功能时,常常需要收到支付宝的回调通知结果,才能处理业务逻辑。此文介绍通过WebSocket长连接接入支付宝消息服务,实现消息通知......
  • 30 行代码实现,支付宝蚂蚁森林自动收能量!转载
    作者| xindoo来源|CSDN博客,已获作者授权虽然我支付宝加了好多好友,平时有很多能量可以“偷”,但由于太懒,至今一棵树都没种成,所以心心念念把偷能量这事自动化。之前通......
  • websocket打造在线聊天室
    1.常见的网络通信协议 tcpudphttp和websocket等;http超文本传输协议,是一个无状态,无连接,单向的应用层协议,缺点是服务器不能主动的给客户端发送消息;消息只能由客......
  • 跟着思兼学习Klipper(19) 通知系统:蜂鸣器、语音播报与手机消息通知
    前言原创文章,转载引用请务必注明链接,水平有限,如有疏漏,欢迎指正交流。本文目的在于交流,其中原创内容禁止一切非授权商业行为。文章如有更新请访问DFRobot社区或者cnb......
  • 免费午餐结束!支付宝开始提现收费啦
    自今日起,支付宝将对提现收取0.1%的手续费,每人仅有累计2万元的免费提现额度。这意味着,免费提现服务将正式终结,而此前微信支付也对提现予以收费,第三方支付开始进入收费时......
  • 消息驱动(SpringCloud Stream)
    前言什么是消息驱动?屏蔽底层消息中间件的差异,降低切换成本,统一消息的编程模型官网:​​https://spring.io/projects/spring-cloud-stream#overview​​​​https://cloud.s......
  • Nodejs 对接支付宝沙箱
    一.开启沙箱没注册过的 ​​支付宝开放平台​​已有账号可以访问开发者中心 ​​登录-支付宝​​进行认证后,即可进入沙箱配置页二.配置密钥1,下载地址 ​​生成密......
  • 支付宝接口的数字签名
    签名某些情况下(例如用户扫码支付成功时),支付宝会给商户系统发送异步通知。在发送异步通知时,支付宝会对通知参数进行签名,并将“签名字符串sign”作为通知参数发送给商户......
  • 在CListView中添加点击右键消息响应函数!
    //简单几步就可以了,整个过程描述和截图如下所下:用ClassWizard中的MessageMaps功能添加对NM_RCLICK消息的响应函数://添加成功后,直接编辑函数代码即可voidCRightMenuView:......