您好,登錄后才能下訂單哦!
前面寫過一篇云開發(fā)實現(xiàn)小程序訂閱消息(模板消息)推送的文章,《借助云開發(fā)實現(xiàn)小程序訂閱消息和模板消息的推送功能》是有好多同學用的是Java寫后臺,所以今天就再來寫一篇Java后臺實現(xiàn)小程序訂閱消息推送的文章。
至于如何創(chuàng)建模板消息,如果獲取模板id我這節(jié)就不再講解,不知道的同學可以查看我上篇文章《借助云開發(fā)實現(xiàn)小程序訂閱消息和模板消息的推送功能》里面有詳細的講解。
其實我很早之前有寫過一篇Java實現(xiàn)模板消息推送的,但是小程序后面用訂閱消息替換了模板推送,所以我也會根據(jù)最新的知識點不定期的更新文章的。
關(guān)于用戶openid的獲取,我寫過很多篇文章了,也有錄過視頻出來的,還不知道怎么獲取的同學,可以取翻看下我之前的文章,或者看下我錄制的零基礎(chǔ)入門小程序的視頻:《5小時零基礎(chǔ)入門小程序云開發(fā)》 所以這一步不是今天的重點。
首先來看下access_token是什么,下圖是官方給出的
其實通俗的講,access_token就是小程序官方給我們提供的一個憑證,你要調(diào)用小程序官方的接口,就必須先拿到access_token。所以下面先講下如果獲取access_token
我們這里用的是springboot,這里涉及到一個請求小程序官方接口,所以我們這里用了springboot自帶的RestTemplate來做網(wǎng)絡(luò)請求。具體代碼如下。
可以看出代碼很簡單,就是用RestTemplate來實現(xiàn)一個get請求,這樣我們就可以輕松的獲取到了access_token。
關(guān)于這個access_token,是存在有效期的,來看下官方給出的提示
所以我要在獲取到access_token的時候,把access_token存到數(shù)據(jù)庫,或者存到本地緩存,并且還要記錄當前時間,后面再用的時候先判斷這個access_token有沒有超過2個小時,如果超過2個小時的話,就要重新獲取了。由于這里不是本節(jié)的重點,我這里只給大家說下原理。
我們通過上面第二步,成功的獲取到了access_token。下面就要調(diào)用小程序官方為我們提供的發(fā)送消息的接口了。先看下官方文檔。
上面的參數(shù)都是我們發(fā)送消息時需要的。這些參數(shù)的定義和設(shè)置我在前面的文章里也都講過了,不知道的同學可以去看下我前面寫的這篇文章 《借助云開發(fā)實現(xiàn)小程序訂閱消息和模板消息的推送功能》
因為用戶不點擊允許,你是沒有辦法給用戶推送消息的。每一次授權(quán)只允許發(fā)送一條消息,所以如果你想盡量多的發(fā)送消息,就得盡量多的引導用戶授權(quán)。
可以看到,我們這里需要定義用戶的openid,模板id,跳轉(zhuǎn)路徑,模板消息內(nèi)容。。。
我們在瀏覽器里調(diào)用上面接口,可以看到下圖所示,這樣就代表我們消息推送成功了。
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;
/**
* 作者:編程小石頭
* 發(fā)送小程序訂閱消息
*/
@RestController
public class SendWxMessage {
/*
* 發(fā)送訂閱消息
* */
@GetMapping("/pushOneUser")
public String pushOneUser() {
return push("o3DoL0WEdzcJ20AVJg1crP96gbjM");
}
public String push(String openid) {
RestTemplate restTemplate = new RestTemplate();
//這里簡單起見我們每次都獲取最新的access_token(時間開發(fā)中,應(yīng)該在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(要發(fā)送給那個用戶,通常這里應(yīng)該動態(tài)傳進來的)
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("第一章第一節(jié)"));
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;
}
}
對應(yīng)的兩個數(shù)據(jù)類如下
WxMssVo用來封裝請求官方接口的參數(shù)
package com.qcl.demo;
import java.util.Map;
/*
* 小程序推送所需數(shù)據(jù)
* 編程小石頭
* */
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 用來定義消息的內(nèi)容
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;
}
}
到這里我們就可以完整的實現(xiàn)Java發(fā)送小程序消息的功能了。完整代碼也已經(jīng)貼給大家了。
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。