微信對(duì)外提供了很多 API,但是這些 API 使用起來非常不方便,用戶需要實(shí)現(xiàn)非常底層的操作;所以我以 spring-boot-starter 的形式對(duì)其做了一次封裝,形成了 wechat-spring-boot-starters 這個(gè)項(xiàng)目,盡量做到“零”配置運(yùn)行;目前實(shí)現(xiàn)了消息部分的封裝,完成所有類型消息的統(tǒng)一處理,自動(dòng)執(zhí)行消息加解密而無需用戶參與。以下將介紹 wechat-spring-boot-starters 的基本情況。
配置
前提
- 此項(xiàng)目基于 Spring Boot,所以要使用本項(xiàng)目,必須引入 Spring Boot 的相關(guān)依賴
- JDK 1.8 及以上
引入 maven 依賴
<dependency>
<groupId>me.javaroad.openapi.wechat</groupId>
<artifactId>wechat-spring-boot-starters</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
因?yàn)槟壳笆?snapshot 版本,所以還需要引入 snapshot repository :
<repositories>
<repository>
<snapshots />
<id>sonatype snapshots</id>
<url>https://oss.sonatype.org/content/repositories/snapshots/</url>
</repository>
</repositories>
基礎(chǔ)配置
在 application.yml 中新增以下配置:
weixin:
mp:
endpoint:
# 微信回調(diào)地址,默認(rèn)為 /weixin/callback,如需自定義,請(qǐng)修改以下配置項(xiàng)
callback-url: /weixin/callback
security:
# 微信后臺(tái)配置的 token
token: 1234567890
# 微信后臺(tái)配置的消息加解密 aeskey
encodingAesKey: abcdefghijklmnopqrstuvwxyz0123456789ABCDEFG
# #############################################################
# 微信 access token 過期刷新閾值,計(jì)算方法:
# 當(dāng)前時(shí)間 - (獲得token時(shí)間 + token 有效期 + 閾值) < 0 則刷新 token
# 默認(rèn)為 token 失效前 5 分鐘刷新
# #############################################################
refresh-token-threshold: 300
auth:
# APPID
appid: appid
# APP secret
secret: secret
關(guān)于消息加密解密
系統(tǒng)會(huì)自動(dòng)判斷微信服務(wù)器推送給用戶的消息是否經(jīng)過加密,如果經(jīng)過加密,將會(huì)自動(dòng)解密,并在用戶服務(wù)器返回給微信服務(wù)器時(shí)自動(dòng)加密數(shù)據(jù),這個(gè)過程不需要用戶做任何操作。
消息處理 - MessageHandler
當(dāng)系統(tǒng)接收到微信服務(wù)器推送的消息之后,做了兩件事情:
- 發(fā)布了
ReceiveMessageEvent類型的事件 - 將收到的消息分發(fā)到
MessageHandler上
所以用戶可以通過以上兩種方式獲取微信服務(wù)器推送的消息。
第一種方式:
@Component
public class ReceiveMessageEventListener implements ApplicationListener<ReceiveMessageEvent> {
@Async
@Override
public void onApplicationEvent(ReceiveMessageEvent event) {
System.out.println(event.getSource());
}
}
這里是通過監(jiān)聽系統(tǒng)事件獲取對(duì)應(yīng)的消息,此處 強(qiáng)烈建議 以異步的方式處理消息,如需同步處理消息,請(qǐng)參考第二種方式。
第二種方式
@Component
public class TextMessageHandler extends AbstractMessageHandler<TextMessage> {
public TextMessageHandler(MessageHandlerFactory messageHandlerFactory) {
super(messageHandlerFactory);
}
@Override
public ResponseMessage handleMessage(TextMessage message) {
// 此處根據(jù)業(yè)務(wù)對(duì)收到的消息做處理,注意,處理時(shí)間不能超過 5s,否則會(huì)導(dǎo)致微信對(duì)用戶給出嚴(yán)重錯(cuò)誤的提示
// 如果時(shí)間很可能超過 5s, 需要在新線程中處理
// 如果不需要對(duì)用戶返回任何消息,則請(qǐng)?jiān)诖颂幏祷?EmptyResponseMessage
return new TextResponseMessage();
}
}
這種方式會(huì)同步執(zhí)行,所以處理時(shí)間必須不能超過 5 s .
系統(tǒng)中提供了以下類型的消息,其中 普通消息 和 事件推送消息 是微信服務(wù)器推送給用戶服務(wù)器的消息,它將作為 MessageHandler 的參數(shù)傳給對(duì)應(yīng)的 Handler, 被動(dòng)回復(fù)消息 和 特殊消息 為用戶服務(wù)器返回給微信服務(wù)器的消息, 它將作為 MessageHandler 的返回值。
普通消息
TextMessage文本消息ImageMessage圖片消息VoiceMessage語音消息VideoMessage視頻消息ShortVideoMessage小視頻消息LocationMessage地理位置消息LinkMessage鏈接消息
事件推送消息
-
SubscribeEventMessage關(guān)注/取消關(guān)注 事件 -
QrCodeEventMessage掃二維碼事件 -
CustomMenuEventMessage自定義菜單事件 -
LocationEventMessage上報(bào)地理位置事件
被動(dòng)回復(fù)消息
TextResponseMessage文本消息ImageResponseMessage圖片消息VoiceResponseMessage語音消息VideoResponseMessage視頻消息MusicResponseMessage音樂消息NewsResponseMessage圖文消息
特殊消息
-
EmptyResponseMessage這個(gè)消息僅用于被動(dòng)回復(fù)用戶時(shí),如果接收了用戶的消息而不希望給用戶回復(fù)的話,請(qǐng)返回此消息
結(jié)語
以上就是目前實(shí)現(xiàn)的消息管理的部分接口,后續(xù)會(huì)繼續(xù)完善。
最后附上源碼:GitHub