java實現微信公衆號的模板消息推送

文章目錄
前言
一、什麼是模板消息
二、獲取模板ID
三、獲取access_token
四、發送消息
五、完整的代碼
總結
前言
最近做項目時需要用到公衆號的模板消息,所以在這裏記錄分享一下實現過程

一、什麼是模板消息
↓↓↓↓
官方文檔

微信公衆號提供了多種消息能力,這裏我們主要講得是模板消息,有需要其他消息實現方式的朋友可以留言,出其他實現文章。

功能介紹
模板消息僅用於公衆號向用戶發送重要的服務通知,只能用於符合其要求的服務場景中,如信用卡刷卡通知,商品購買成功通知等。不支持廣告等營銷類消息以及其它所有可能對用戶造成騷擾的消息。

關於使用規則,請注意:

所有服務號都可以在功能->添加功能插件處看到申請模板消息功能的入口,但只有認證後的服務號纔可以申請模板消息的使用權限並獲得該權限;
需要選擇公衆賬號服務所處的2個行業,每月可更改1次所選行業;
在所選擇行業的模板庫中選用已有的模板進行調用;
每個賬號可以同時使用25個模板。
當前每個賬號的模板消息的日調用上限爲10萬次,單個模板沒有特殊限制。【2014年11月18日將接口調用頻率從默認的日1萬次提升爲日10萬次,可在MP登錄後的開發者中心查看】。當賬號粉絲數超過10W/100W/1000W時,模板消息的日調用上限會相應提升,以公衆號MP後臺開發者中心頁面中標明的數字爲準。

關於接口文檔,請注意:

模板消息調用時主要需要模板ID和模板中各參數的賦值內容;
模板中參數內容必須以".DATA"結尾,否則視爲保留字;
模板保留符號""。


二、獲取模板ID
百度搜索微信公衆平臺

微信掃碼登錄

找到新的功能

 

點擊未開通,找到模板消息,點擊開通


點擊已開通,找到模板消息,點擊模板消息

點擊查看功能


點擊模板庫,選擇想要的模板


在我的模板中就可以看到選擇的模板,看到模板ID,這就是我們開發要用的


注意!注意!注意!重要的事說三遍,如果你是用的是微信公衆號測試平臺發送消息模板可不配置公衆號對接相關功能,直接使用openId 發送模板信息功能即可,openId 可讓用戶關注公衆號錄入系統,
或者在公衆號添加h5 表單,綁定系統賬號, 微信打開的h5 頁面可獲取當前用戶的openId。

如果是真正的公衆號就必須配置公衆號對接相關功能!必須!必須!必須!

三、獲取access_token
首先來看下access_token是什麼,下圖是官方給出的:

其實通俗的講,access_token就是小程序官方給我們提供的一個憑證,你要調用小程序官方的接口,就必須先拿到access_token。這個和我們做的項目調用後臺接口必須登錄後臺給你一個token你帶token訪問相似。

看一下官方文檔:


grant_type是一個固定的值,只有appid和secret是需要我們填入的,這兩個值在我們的公衆號後臺就可以拿到。

下面就是Java後臺代碼的編寫了

我這裏用的是springboot,這裏要請求公衆號官方接口,正常項目開發我都是用的自己寫的接口請求工具類的,這裏爲了大家方便就用了springboot自帶的RestTemplate來做網絡請求。文章最後我會把我自己寫的這個請求工具類貼出來有需要的朋友可以copy,具體代碼如下。

代碼如下(示例):


這裏代碼很簡單,就一個簡單的get請求。不過要注意一點,這裏獲取的access_token是有兩個小時的過期時間的

所以在獲取到access_token的時候,把access_token存到數據庫,或者存到本地緩存,並且還要記錄當前時間,後面再用的時候先判斷這個access_token有沒有超過2個小時,如果超過2個小時的話,就要重新獲取了。


四、發送消息
官方文檔

老規矩還是先看官方文檔

 

上面的參數都是我們發送消息時需要的。

然後微信就收到了


五、完整的代碼
獲取access_token
@Data
public class AccessToken {

private String accessToken;
//過期時間 當前系統時間+微信傳來的過期時間
private Long expiresTime;

public AccessToken(String accessToken, String expiresIn) {
this.accessToken = accessToken;
this.expiresTime = System.currentTimeMillis()+Integer.parseInt(expiresIn)*1000;
}

/**
* 判斷token是否過期
* @return
*/
public boolean isExpired(){
return System.currentTimeMillis()>expiresTime;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
下面的WX_OPEN_APP_ID,WX_OPEN_APP_SECRET替換成你們自己的,具體的可以去公衆號後臺查看

public static final BASE_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential" +
"&appid=%s" +
"&secret=%s";

private static AccessToken at;

public static String getToken(){
if (at == null || at.isExpired()){
getAccessToken();
}
return at.getAccessToken();
}

/**
* 獲取token
*/
private static void getAccessToken() {
String accessTokenUrl = String.format(
BASE_ACCESS_TOKEN_URL,
WX_OPEN_APP_ID,
WX_OPEN_APP_SECRET
);

//發送請求獲取token
String token = null;
try {
token = HttpClientUtils.get(accessTokenUrl);
} catch (Exception e) {
e.printStackTrace();
}
JSONObject jsonObject = JSONObject.parseObject(token);
String accessToken = (String) jsonObject.get("access_token");
Integer expiresIn = (Integer) jsonObject.get("expires_in");
//創建token對象,並存儲
at = new AccessToken(accessToken,String.valueOf(expiresIn));
System.out.println(token);

}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
發送消息
public static final SEND_URL = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN";

/**
* 1、發送模版消息-拼接數據(測試信息)
* @param openId 微信用戶的openId
*/
public static String sendMessage(String openId, String templateId,String machineAlias,String shopName,String openStatus, String dropStatus,int number) {
// 模板參數
Map<String, WeChatTemplateMsg> sendMag = new HashMap<String, WeChatTemplateMsg>();
String content = "店鋪:"+shopName+",機器別名:"+machineAlias+",當前庫存:"+number;
sendMag.put("first", new WeChatTemplateMsg("請注意!"));
sendMag.put("system", new WeChatTemplateMsg(content));
sendMag.put("time", new WeChatTemplateMsg(DateUtils.getCurrDateTime()));
sendMag.put("account", new WeChatTemplateMsg("1"));
sendMag.put("remark", new WeChatTemplateMsg("請儘快補貨,謝謝!"));
// 發送
String send = send(openId, templateId, sendMag);
return send;

}


/**
* 2、發送模版消息
* openId 用戶Id
* templateId 模板Id
* data 模板參數
* @param data
*/
private static String send(String openId, String templateId, Map<String, WeChatTemplateMsg> data) {
RestTemplate restTemplate = new RestTemplate();
String accessToken = getToken();
String url = SEND_URL.replace("ACCESS_TOKEN", accessToken);
//拼接base參數
Map<String, Object> sendBody = new HashMap<>();
sendBody.put("touser", openId); // openId
// sendBody.put("url", "www.baidu.com"); // 點擊模板信息跳轉地址
sendBody.put("topcolor", "#FF0000"); // 頂色
sendBody.put("data", data); // 模板參數
sendBody.put("template_id", templateId); // 模板Id
ResponseEntity<String> forEntity = restTemplate.postForEntity(url, sendBody, String.class);
return forEntity.getBody();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
消息封裝實體類 (模板參數)
@Data
@ToString
public class WeChatTemplateMsg {
/**
* 消息
*/
private String value;
/**
* 消息顏色
*/
private String color;


public WeChatTemplateMsg(String value) {
this.value = value;
this.color = "#173177";
}

public WeChatTemplateMsg(String value, String color) {
this.value = value;
this.color = color;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
微信就能收到了


到這裏我們就可以完整的實現Java發送公衆號模板消息的功能了。完整代碼也已經貼給大家了。

總結
以上就是今天要分享給大家的內容,本文簡單的講了怎麼發送模板消息,其實大部分大家參考官方文檔都是可以寫出來的
————————————————
版權聲明:本文爲CSDN博主「虞澤」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/qq_41940721/article/details/120449739

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章