前面寫過一篇雲開發實現小程序訂閱消息(模板消息)推送的文章,《藉助雲開發實現小程序訂閱消息和模板消息的推送功能》是有好多同窗用的是Java寫後臺,因此今天就再來寫一篇Java後臺實現小程序訂閱消息推送的文章。java
至於如何建立模板消息,若是獲取模板id我這節就再也不講解,不知道的同窗能夠查看我上篇文章《藉助雲開發實現小程序訂閱消息和模板消息的推送功能》裏面有詳細的講解。web
其實我很早以前有寫過一篇Java實現模板消息推送的,可是小程序後面用訂閱消息替換了模板推送,因此我也會根據最新的知識點不按期的更新文章的。spring
關於用戶openid的獲取,我寫過不少篇文章了,也有錄過視頻出來的,還不知道怎麼獲取的同窗,能夠取翻看下我以前的文章,或者看下我錄製的零基礎入門小程序的視頻:《5小時零基礎入門小程序雲開發》 因此這一步不是今天的重點。數據庫
首先來看下access_token是什麼,下圖是官方給出的
其實通俗的講,access_token就是小程序官方給咱們提供的一個憑證,你要調用小程序官方的接口,就必須先拿到access_token。因此下面先講下若是獲取access_token編程
咱們這裏用的是springboot,這裏涉及到一個請求小程序官方接口,因此咱們這裏用了springboot自帶的RestTemplate來作網絡請求。具體代碼以下。
能夠看出代碼很簡單,就是用RestTemplate來實現一個get請求,這樣咱們就能夠輕鬆的獲取到了access_token。json
關於這個access_token,是存在有效期的,來看下官方給出的提示
因此我要在獲取到access_token的時候,把access_token存到數據庫,或者存到本地緩存,而且還要記錄當前時間,後面再用的時候先判斷這個access_token有沒有超過2個小時,若是超過2個小時的話,就要從新獲取了。因爲這裏不是本節的重點,我這裏只給你們說下原理。小程序
咱們經過上面第二步,成功的獲取到了access_token。下面就要調用小程序官方爲咱們提供的發送消息的接口了。先看下官方文檔。
上面的參數都是咱們發送消息時須要的。這些參數的定義和設置我在前面的文章裏也都講過了,不知道的同窗能夠去看下我前面寫的這篇文章 《藉助雲開發實現小程序訂閱消息和模板消息的推送功能》api
由於用戶不點擊容許,你是沒有辦法給用戶推送消息的。每一次受權只容許發送一條消息,因此若是你想盡可能多的發送消息,就得儘可能多的引導用戶受權。瀏覽器
能夠看到,咱們這裏須要定義用戶的openid,模板id,跳轉路徑,模板消息內容。。。緩存
咱們在瀏覽器裏調用上面接口,能夠看到下圖所示,這樣就表明咱們消息推送成功了。
package com.qcl.demo; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestClientException; import org.springframework.web.client.RestTemplate; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * 做者:編程小石頭 * 發送小程序訂閱消息 */ @RestController public class SendWxMessage { /* * 發送訂閱消息 * */ @GetMapping("/pushOneUser") public String pushOneUser() { return push("o3DoL0WEdzcJ20AVJg1crP96gbjM"); } public String push(String openid) { RestTemplate restTemplate = new RestTemplate(); //這裏簡單起見咱們每次都獲取最新的access_token(時間開發中,應該在access_token快過時時再從新獲取) String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccessToken(); //拼接推送的模版 WxMssVo wxMssVo = new WxMssVo(); wxMssVo.setTouser(openid);//用戶的openid(要發送給那個用戶,一般這裏應該動態傳進來的) wxMssVo.setTemplate_id("CFeSWarQLMPyPjwmiy6AV4eB-IZcipu48V8bFLkBzTU");//訂閱消息模板id wxMssVo.setPage("pages/index/index"); Map<String, TemplateData> m = new HashMap<>(3); m.put("thing1", new TemplateData("小程序入門課程")); m.put("thing6", new TemplateData("杭州浙江大學")); m.put("thing7", new TemplateData("第一章第一節")); wxMssVo.setData(m); ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, wxMssVo, String.class); return responseEntity.getBody(); } @GetMapping("/getAccessToken") public String getAccessToken() { RestTemplate restTemplate = new RestTemplate(); Map<String, String> params = new HashMap<>(); params.put("APPID", "wx7c54942dfc87f4d8"); // params.put("APPSECRET", "5873a729c365b65ab42bb5fc82d2ed49"); // ResponseEntity<String> responseEntity = restTemplate.getForEntity( "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={APPID}&secret={APPSECRET}", String.class, params); String body = responseEntity.getBody(); JSONObject object = JSON.parseObject(body); String Access_Token = object.getString("access_token"); String expires_in = object.getString("expires_in"); System.out.println("有效時長expires_in:" + expires_in); return Access_Token; } }
對應的兩個數據類以下
WxMssVo用來封裝請求官方接口的參數
package com.qcl.demo; import java.util.Map; /* * 小程序推送所需數據 * 編程小石頭 * */ public class WxMssVo { private String touser;//用戶openid private String template_id;//訂閱消息模版id private String page = "pages/index/index";//默認跳到小程序首頁 private Map<String, TemplateData> data;//推送文字 public String getTouser() { return touser; } public void setTouser(String touser) { this.touser = touser; } public String getTemplate_id() { return template_id; } public void setTemplate_id(String template_id) { this.template_id = template_id; } public String getPage() { return page; } public void setPage(String page) { this.page = page; } public Map<String, TemplateData> getData() { return data; } public void setData(Map<String, TemplateData> data) { this.data = data; } }
TemplateData 用來定義消息的內容
package com.qcl.demo; public class TemplateData { private String value;// public TemplateData(String value) { this.value = value; } public String getValue() { return value; } public void setValue(String value) { this.value = value; } }
到這裏咱們就能夠完整的實現Java發送小程序消息的功能了。完整代碼也已經貼給你們了。