Java對接微信公衆號模板消息推送

內容有點多,請耐心!html

最近公司的有這個業務需求,又很湊巧讓我來完成:java

首先想要對接,先要一個公衆號,再就是開發文檔了:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.htmlgit

 不過請注意這一點github

 

ok,咱們繼續:再來完成公衆號的基本配置:  spring

 

    服務器地址(URL):必須以http://或https://開頭,分別支持80端口和443端口。這個URL是很重要的,須要響應微信發送的token驗證小程序

    令牌(Token):必須爲英文或數字,長度爲3-32字符。上面說過作驗證的安全

    消息加解密密鑰:能夠直接隨機生成springboot

    消息加解密方式:明文、兼容、安全  看業務需求選擇:我以爲明文省事點(我的看法)服務器

詳解微信開發文檔:https://developers.weixin.qq.com/doc/offiaccount/Getting_Started/Overview.html微信

 

若是一直用微信的接口調用,會有點麻煩因此這邊我就引用了     ---》WxJava《---         

gitub:https://github.com/Wechat-Group/WxJava 

gitee:https://gitee.com/binary/weixin-java-tools

 

先來看看官方文檔對於推送模板消息參數說明:

 

 剛開始看這個開發文檔的時候我仍是有些懵的

 

openId怎麼拿?   不知道!那好吧,度娘一下、google一下,疑惑不就解決了!

 

 ok,下一步template_id:模板Id;對於這個能夠本身申請 or 選用已有的

 

我就省去不必的麻煩方正是個Demo,就選擇已有的:

 

 選擇一個進去添加模板就好了:

 

 ok,模板id也拿到了,如今就開始

 

請你們也詳細的看看 WxJava 的文檔

 

---先創建 SpringBoot 項目---

 

導入wxjava公衆號 對應的pom

 

<!-- WxJava公衆號 -->
<dependency>
   <groupId>com.github.binarywang</groupId>
   <artifactId>weixin-java-mp</artifactId>
   <version>3.6.0</version>
</dependency>

 

而後就須要配置公衆號相關的信息了,我我的比較喜歡在 yml 裏面配置

 

# 微信公衆號配置
wx:
  appid: 11111
  secret: 22222
  token: 33333
  aeskey: 44444

配置了這個就須要對應這個配置的Component了(實體類)

/** * @ClassName WXProperties * @Author chenghao * @Date 2020/1/10 15:44 **/ @Data @Component @ConfigurationProperties(prefix = "wx") public class WxMpProperties { /** * 公衆號appId */
    private String appId; /** * 公衆號appSecret */
    private String secret; /** * 公衆號token */
    private String token; /** * 公衆號aesKey */
    private String aesKey; }

關於註解啥的我就不去詳解了 不明白的本身去看看官方文檔

 

SpringBoot:

https://docs.spring.io/spring-boot/docs/2.2.4.RELEASE/reference/html/spring-boot-features.html#boot-features-external-config-yaml

Lombok:

https://projectlombok.org/features/all

 

-----------------------------好的,各位,咱們如今開始-----------------------------

 

  我先給你們一步一步分析

 

 

 剛剛咱們選擇的模板,這些key都一個一個參數,文檔上面說的很明白,賦值替換!!! 明白了這點就ok了。

 

好,再來回頭看 WxJava 

 

恩,根據上面的示例代碼,我寫了個Demo

/**
* 微信消息推送
*
* @ClassName WxMsgPush
* @Author chenghao
* @Date 2020/1/10 16:20
**/
@Slf4j
@Component
public class WxMsgPush {

/**
* 微信公衆號API的Service
*/
private final WxMpService wxMpService;

/**
* 構造注入
*/
WxMsgPush(WxMpService wxMpService) {
this.wxMpService = wxMpService;
}


/**
* 發送微信模板信息
*
* @param openId 接受者openId
* @return 是否推送成功
*/
public Boolean SendWxMsg(String openId) {
// 發送模板消息接口
WxMpTemplateMessage templateMessage = WxMpTemplateMessage.builder()
// 接收者openid
.toUser(openId)
// 模板id
.templateId("xxxxxxxxxxxxxxxxxxxxxxxxxxx")
// 模板跳轉連接
.url("http://www.baidu.com")
.build();
// 添加模板數據
templateMessage.addData(new WxMpTemplateData("first", "您好", "#FF00FF"))
.addData(new WxMpTemplateData("keyword1", "這是個測試", "#A9A9A9"))
.addData(new WxMpTemplateData("keyword2", "這又是個測試", "#FF00FF"))
.addData(new WxMpTemplateData("remark", "這仍是個測試", "#000000"));
String msgId = null;
try {
// 發送模板消息
msgId = wxMpService.getTemplateMsgService().sendTemplateMsg(templateMessage);
} catch (WxErrorException e) {
e.printStackTrace();
}
log.warn("·==++--·推送微信模板信息:{}·--++==·", msgId != null ? "成功" : "失敗");
return msgId != null;
}
}

 

wdnmd!一上來就發現報錯!!!   

Could not autowire. No beans of 'WxMpService' type found. -------> 沒法自動接線。找不到「 WxMpService」類型的bean 

  一臉懵逼,而後看了下這個WxMpService接口 我靠,這些實現類,淦!

 

 

後來仔細研究了下須要本身寫個Configuration

/** * @ClassName WxConfig * @Author chenghao * @Date 2020/1/11 09:23 **/ @Configuration public class WxConfig { /** * 聲明實例 * * @return
     */ @Bean public WxMpService wxMpService() { WxMpService wxMpService = new WxMpServiceImpl(); return wxMpService; }

 

ok,開始分析代碼

 

首先這個

 

 點進去瞅一眼有四個屬性:

      

/** * 接收者openid. */
private String toUser; /** * 模板ID. */
private String templateId; /** * 模板跳轉連接. * <pre> * url和miniprogram都是非必填字段,若都不傳則模板無跳轉;若都傳,會優先跳轉至小程序。 * 開發者可根據實際須要選擇其中一種跳轉方式便可。當用戶的微信客戶端版本不支持跳小程序時,將會跳轉至url。 * </pre> */
  private String url; /** * 跳小程序所需數據,不需跳小程序可不用傳該數據. * * @see #url */
  private MiniProgram miniProgram;

 

ok,咱們繼續分析

 

留意一下這個 

須要跟你本身申請的模板那些key對應!!!

 

這個就是賦值的內容了

文字對應的顏色

最後一步:推送

 

 懵逼中·········

點進去,又來個接口

 

 看到相應的方法了

 

好了,知道了對應方法的做用,終於能夠推送了。可是可是,到如今,我纔想起一件事情,我配置的公衆號信息,他能本身讀?很顯然咱們少配置了信息。

 

 

 https://gitee.com/binary/weixin-java-mp-demo-springboot/blob/master/src/main/java/com/github/binarywang/demo/wx/mp/config/WxMpConfiguration.java

真的是讓我一頓好找啊

他用是Lambda表達式+Stream 這裏我就不用了,我不想太騷(主要是不會)

改了一下本身寫的config,你們要注意這個!!!

 
 
/**
* @ClassName WxConfig
* @Author chenghao
* @Date 2020/1/11 09:23
**/
@Configuration
public class WxConfig {

private final WxMpProperties wxMpProperties;

/**
* 構造注入
*
* @param wxMpProperties
*/
WxConfig(WxMpProperties wxMpProperties) {
this.wxMpProperties = wxMpProperties;
}

/**
* 微信客戶端配置存儲
*
* @return
*/
@Bean
public WxMpConfigStorage wxMpConfigStorage() {
WxMpDefaultConfigImpl configStorage = new WxMpDefaultConfigImpl();
// 公衆號appId
configStorage.setAppId(wxMpProperties.getAppId());
// 公衆號appSecret
configStorage.setSecret(wxMpProperties.getSecret());
// 公衆號Token
configStorage.setToken(wxMpProperties.getToken());
// 公衆號EncodingAESKey
configStorage.setAesKey(wxMpProperties.getAesKey());
return configStorage;
}

/**
* 聲明實例
*
* @return
*/
@Bean
public WxMpService wxMpService() {
WxMpService wxMpService = new WxMpServiceImpl();
wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
return wxMpService;
}
 

 

ok,主要 code 部分都完成了,開始測試吧。請本身建一個Controller

 

 
 
/**
* 微信消息推送
*/
private final WxMsgPush wxMsgPush;

/**
* 構造注入
*/
protected PushMsgApi(WxMsgPush wxMsgPush) {
this.wxMsgPush = wxMsgPush;
}

/**
* 發送微信模板消息 */ @ApiOperation("發送微信模板消息") @ApiImplicitParams({ @ApiImplicitParam(name = "openId", value = "接受者openId", dataType = "String", paramType = "query") }) @PostMapping("/sendWxInfo") public void sendWxInfo(String openId) { // 執行發送 Boolean aBoolean = wxMsgPush.SendWxMsg(openId); System.out.println(aBoolean); }

 

ok!推送完成!!請你們自行去編寫!!!

 

(下篇出個微信登陸詳解)

相關文章
相關標籤/搜索