使用 Spring Boot Starter 封裝 微信 SDK

微信對(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ù)器推送的消息之后,做了兩件事情:

  1. 發(fā)布了 ReceiveMessageEvent 類型的事件
  2. 將收到的消息分發(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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容