微信对外提供了很多 API,但是这些 API 使用起来非常不方便,用户需要实现非常底层的操作;所以我以 spring-boot-starter 的形式对其做了一次封装,形成了 wechat-spring-boot-starters
这个项目,尽量做到“零”配置运行;目前实现了消息部分的封装,完成所有类型消息的统一处理,自动执行消息加解密而无需用户参与。以下将介绍 wechat-spring-boot-starters
的基本情况。
配置
前提
- 此项目基于 Spring Boot,所以要使用本项目,必须引入 Spring Boot 的相关依赖
- JDK 1.8 及以上
引入 maven 依赖
<dependency>
<groupId>me.javaroad.openapi.wechat</groupId>
<artifactId>wechat-spring-boot-starters</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
因为目前是 snapshot 版本,所以还需要引入 snapshot repository :
<repositories>
<repository>
<snapshots />
<id>sonatype snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
</repositories>
基础配置
在 application.yml 中新增以下配置:
weixin:
mp:
endpoint:
# 微信回调地址,默认为 /weixin/callback,如需自定义,请修改以下配置项
callback-url: /weixin/callback
security:
# 微信后台配置的 token
token: 1234567890
# 微信后台配置的消息加解密 aeskey
encodingAesKey: abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG
# #############################################################
# 微信 access token 过期刷新阈值,计算方法:
# 当前时间 - (获得token时间 + token 有效期 + 阈值) < 0 则刷新 token
# 默认为 token 失效前 5 分钟刷新
# #############################################################
refresh-token-threshold: 300
auth:
# APPID
appid: appid
# APP secret
secret: secret
关于消息加密解密
系统会自动判断微信服务器推送给用户的消息是否经过加密,如果经过加密,将会自动解密,并在用户服务器返回给微信服务器时自动加密数据,这个过程不需要用户做任何操作。
消息处理 - MessageHandler
当系统接收到微信服务器推送的消息之后,做了两件事情:
- 发布了
ReceiveMessageEvent
类型的事件 - 将收到的消息分发到
MessageHandler
上
所以用户可以通过以上两种方式获取微信服务器推送的消息。
第一种方式:
@Component
public class ReceiveMessageEventListener implements ApplicationListener<ReceiveMessageEvent> {
@Async
@Override
public void onApplicationEvent(ReceiveMessageEvent event) {
System.out.println(event.getSource());
}
}
这里是通过监听系统事件获取对应的消息,此处 强烈建议 以异步的方式处理消息,如需同步处理消息,请参考第二种方式。
第二种方式
@Component
public class TextMessageHandler extends AbstractMessageHandler<TextMessage> {
public TextMessageHandler(MessageHandlerFactory messageHandlerFactory) {
super(messageHandlerFactory);
}
@Override
public ResponseMessage handleMessage(TextMessage message) {
// 此处根据业务对收到的消息做处理,注意,处理时间不能超过 5s,否则会导致微信对用户给出严重错误的提示
// 如果时间很可能超过 5s, 需要在新线程中处理
// 如果不需要对用户返回任何消息,则请在此处返回 EmptyResponseMessage
return new TextResponseMessage();
}
}
这种方式会同步执行,所以处理时间必须不能超过 5 s .
系统中提供了以下类型的消息,其中 普通消息 和 事件推送消息 是微信服务器推送给用户服务器的消息,它将作为 MessageHandler
的参数传给对应的 Handler, 被动回复消息 和 特殊消息 为用户服务器返回给微信服务器的消息, 它将作为 MessageHandler
的返回值。
普通消息
TextMessage
文本消息ImageMessage
图片消息VoiceMessage
语音消息VideoMessage
视频消息ShortVideoMessage
小视频消息LocationMessage
地理位置消息LinkMessage
链接消息
事件推送消息
-
SubscribeEventMessage
关注/取消关注 事件 -
QrCodeEventMessage
扫二维码事件 -
CustomMenuEventMessage
自定义菜单事件 -
LocationEventMessage
上报地理位置事件
被动回复消息
TextResponseMessage
文本消息ImageResponseMessage
图片消息VoiceResponseMessage
语音消息VideoResponseMessage
视频消息MusicResponseMessage
音乐消息NewsResponseMessage
图文消息
特殊消息
-
EmptyResponseMessage
这个消息仅用于被动回复用户时,如果接收了用户的消息而不希望给用户回复的话,请返回此消息
结语
以上就是目前实现的消息管理的部分接口,后续会继续完善。
最后附上源码:GitHub