這個(gè)功能可能我題目中的敘述有點(diǎn)問(wèn)題。重新解釋一下构罗,我們眾所周知的微信小程序和app大不相同长酗,最大的區(qū)別是app可以獨(dú)立進(jìn)行消息推送溪北,而微信小程序卻不行,也就是這個(gè)原因夺脾,所以小程序中如果想做什么提醒用戶(hù)的操作之拨,只能走訂閱推送了。大概的步驟就是小程序授權(quán)允許消息推送(反正就這個(gè)意思咧叭,是不是叫推送我不記得了)蚀乔,然后這樣當(dāng)有需要的時(shí)候可以把消息發(fā)送到微信的服務(wù)通知里,正常來(lái)講類(lèi)似于微信收到了一條新消息的那種模式菲茬。
然后java代碼的實(shí)現(xiàn)也比較簡(jiǎn)單吉挣,主要是配置什么的要符合微信小程序后臺(tái)的配置,需要注意的是這個(gè)需要獲取的參數(shù)有小程序的accessToken和小程序中用戶(hù)的openId婉弹,當(dāng)然了還有模板消息和消息實(shí)體對(duì)象之類(lèi)的睬魂。
所以我這里會(huì)寫(xiě)的比較長(zhǎng),openId的話應(yīng)該是存儲(chǔ)在小程序用戶(hù)的用戶(hù)信息表里的镀赌,所以這里不多敘述汉买,但是accessToken的話我這里是每次都去獲取,所以專(zhuān)門(mén)封裝了個(gè)方法(小程序開(kāi)發(fā)本身的appId和秘鑰就不說(shuō)了)佩脊。
獲取accessToken:
static String appid = "你的appId";
static String secret = "你的secret";
public static String getAccessToken() throws Exception {
String requestUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid
+ "&secret=" + secret;
URL url = new URL(requestUrl);
// 打開(kāi)和URL之間的連接
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
// 設(shè)置通用的請(qǐng)求屬性
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Connection", "Keep-Alive");
connection.setUseCaches(false);
connection.setDoOutput(true);
connection.setDoInput(true);
// 得到請(qǐng)求的輸出流對(duì)象
DataOutputStream out = new DataOutputStream(connection.getOutputStream());
out.writeBytes("");
out.flush();
out.close();
// 建立實(shí)際的連接
connection.connect();
// 定義 BufferedReader輸入流來(lái)讀取URL的響應(yīng)
BufferedReader in = null;
if (requestUrl.contains("nlp"))
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
else
in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
String result = "";
String getLine;
while ((getLine = in.readLine()) != null) {
result += getLine;
}
in.close();
JSONObject jsonObject = JSON.parseObject(result);
String accesstoken = jsonObject.getString("access_token");
System.out.println(accesstoken);
return accesstoken;
}
如上蛙粘,是一個(gè)提煉的很好的獲取accessToken的方法垫卤,返回值也經(jīng)過(guò)處理只返回accessToken。
因?yàn)閛penId應(yīng)該是存儲(chǔ)在用戶(hù)表里出牧,所以這里不多敘說(shuō)穴肘,模板id也應(yīng)該在配置那里獲取到了,所以也可以用靜態(tài)常量表示舔痕。
發(fā)送小心代碼實(shí)現(xiàn)
這里有兩個(gè)是數(shù)據(jù)封裝的實(shí)體:
/**
* 訂閱消息
* @author lisijia
* @email 1151141449@qq.com
* @date 2020/7/7 10:57
*/
public class SubscribeMessage {
//接口調(diào)用憑證
private String access_token;
//接收者(用戶(hù))的 openid
private String touser;
//所需下發(fā)的訂閱模板id
private String template_id;
//點(diǎn)擊模板卡片后的跳轉(zhuǎn)頁(yè)面评抚,僅限本小程序內(nèi)的頁(yè)面。支持帶參數(shù),(示例index?foo=bar)伯复。該字段不填則模板無(wú)跳轉(zhuǎn)慨代。
private String page;
//模板內(nèi)容,格式形如 { "key1": { "value": any }, "key2": { "value": any } }
private Map<String, TemplateData> data;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
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;
}
}
/**
* @author lisijia
* @email 1151141449@qq.com
* @date 2020/7/7 10:58
*/
public class TemplateData {
private String value;
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
public TemplateData(String value) {
this.value = value;
}
}
然后是發(fā)送訂閱消息的方法(其實(shí)這里是分兩步的啸如,一步是單純的觸發(fā)發(fā)送訂閱消息侍匙,還有一部分是參數(shù)的命名及寫(xiě)法):
public static void subscribeMessage(String openId, String page, Map<String, TemplateData> map) {
try {
String accessToken = getAccessToken();
SubscribeMessage subscribeMessage = new SubscribeMessage();
// 拼接數(shù)據(jù)
subscribeMessage.setAccess_token(accessToken);
subscribeMessage.setTouser(openId);
subscribeMessage.setTemplate_id(templateId);//事先定義好的模板id
subscribeMessage.setPage(page);
subscribeMessage.setData(map);
String json = JSONObject.toJSONString(subscribeMessage);
JsonNode ret = null;
ret = Unirest.post("https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + accessToken)
.body(json).asJson().getBody();
System.out.println(ret);
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
Map<String, TemplateData> map = new HashMap<>();
map.put("date4", new TemplateData(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date())));
map.put("thing12", new TemplateData("溫度過(guò)高"));
map.put("thing1", new TemplateData("氙燈老化試驗(yàn)箱"));
map.put("thing2", new TemplateData("BJYSL-SN-500"));
map.put("thing3", new TemplateData("實(shí)驗(yàn)箱溫度"));
subscribeMessage("oPUD35dzUstVi8VDqMQOW1P6EElY", "", map);
}
注意一下,這里的什么date4.thing12叮雳,thing2之類(lèi)的都是模板自動(dòng)生成的想暗,一定key名稱(chēng)要對(duì)應(yīng)上。還有thing是有長(zhǎng)度限制的帘不,好像是20字符说莫。
然后page參數(shù)我這里沒(méi)傳,說(shuō)實(shí)話我也不清楚是干啥的寞焙,反正之前我看的demo里就是空储狭。
至于這個(gè)openId一定是這個(gè)小程序下生成的openId屬于常識(shí),我順口也就提一下捣郊。
這個(gè)我認(rèn)為比較好的一點(diǎn)是報(bào)錯(cuò)信息寫(xiě)的非常明確辽狈,我之前遇到的幾個(gè)問(wèn)題都是一看報(bào)錯(cuò)信息就找到原因了,然后直接運(yùn)行main方法打印如下說(shuō)明發(fā)送成功了:
本篇筆記就記到這里模她,如果稍微幫到你了記得點(diǎn)個(gè)喜歡點(diǎn)個(gè)關(guān)注,也祝大家工作順順利利懂牧!java技術(shù)交流群130031711侈净,歡迎各位的加入!