最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Java點餐系統(tǒng)和點餐小程序新加微信消息推送功能

2020-05-31 11:33 作者:編程小石頭  | 我要投稿

其實想給點餐系統(tǒng)加推送很久了,之前也有單門寫過Java版的微信消息推送和云開發(fā)版的微信消息推送。之所以一直沒有加,也是考慮到大家的學習接受度,因為做訂閱消息推送是一個綜合性的開發(fā)工作。
需要你既要會小程序端開發(fā),又要會Java端開發(fā),還要會web網(wǎng)頁端開發(fā)。還要懂得小程序公眾號后臺操作,還要自己去申請消息模板,自己配置appid,模板id,模板內(nèi)容。就是因為怕大家一上來被這么多問題嚇到,所以一直沒有搞點餐系統(tǒng)的消息推送。

老規(guī)矩,先看效果圖

我們今天就以排號入座為例,當排號等位的用戶被叫號時,會給用戶發(fā)送一條微信訂閱消息。就是在管理點擊下圖的可入座時,發(fā)送訂閱消息給用戶。


至于如何創(chuàng)建模板消息,如果獲取模板id我這節(jié)就不再講解,不知道的同學可以查看我上篇文章《借助云開發(fā)實現(xiàn)小程序訂閱消息和模板消息的推送功能》里面有詳細的講解。
今天呢就來重點講下如何在Java后臺編寫小程序訂閱消息推送的知識。
其實我很早之前有寫過一篇Java實現(xiàn)模板消息推送的,但是小程序后面用訂閱消息替換了模板推送,所以我也會根據(jù)最新的知識點不定期的更新文章的。

發(fā)送訂閱消息三步走
1,拿到用戶的openid
2,獲取access_token
3,調(diào)用小程序消息推送的接口

一,獲取用戶的openid

關于用戶openid的獲取,我寫過很多篇文章了,也有錄過視頻出來的,還不知道怎么獲取的同學,可以取翻看下我之前的文章,或者看下我錄制的零基礎入門小程序的視頻:《5小時零基礎入門小程序云開發(fā)》?所以這一步不是今天的重點。
我們點餐系統(tǒng)里前面的排號功能講解里也已經(jīng)成功的存入了我們的openid到數(shù)據(jù)庫了。

二,獲取access_token

首先來看下access_token是什么,下圖是官方給出的

其實通俗的講,access_token就是小程序官方給我們提供的一個憑證,你要調(diào)用小程序官方的接口,就必須先拿到access_token。所以下面先講下如果獲取access_token

  • 看下官方文檔,可以知道我們需要用到下面的幾個參數(shù)


  • grant_type是一個固定的值,只有appid和secret是需要我們填入的,這兩個值在我們的小程序后臺就可以拿到,我也有錄視頻教大家如何拿到,如果不知道怎么獲取的同學可以去看下我的視頻。


  • 這里需要注意的是,AppSectet一定要記好,要不然每次都要重置。

下面就是Java代碼的編寫了

我們這里用的是springboot,這里涉及到一個請求小程序官方接口,所以我們這里用了springboot自帶的RestTemplate來做網(wǎng)絡請求。具體代碼如下。

可以看出代碼很簡單,就是用RestTemplate來實現(xiàn)一個get請求,這樣我們就可以輕松的獲取到了access_token。獲取到的access_token返回數(shù)據(jù)如下圖。


請求上面代碼,返回的數(shù)據(jù)如下。

注意點

關于這個access_token,是存在有效期的,來看下官方給出的提示

所以我要在獲取到access_token的時候,把access_token存到數(shù)據(jù)庫,或者存到本地緩存,并且還要記錄當前時間,后面再用的時候先判斷這個access_token有沒有超過2個小時,如果超過2個小時的話,就要重新獲取了。由于這里不是本節(jié)的重點,我這里只給大家說下原理。

三,發(fā)送消息到小程序

我們通過上面第二步,成功的獲取到了access_token。下面就要調(diào)用小程序官方為我們提供的發(fā)送消息的接口了。先看下官方文檔。

上面的參數(shù)都是我們發(fā)送消息時需要的。這些參數(shù)的定義和設置我在前面的文章里也都講過了,不知道的同學可以去看下我前面寫的這篇文章?《借助云開發(fā)實現(xiàn)小程序訂閱消息和模板消息的推送功能》

這里需要注意的一點是,我們要給用戶發(fā)送消息,就必須引導用戶授權(quán),就是下面這個圖

因為用戶不點擊允許,你是沒有辦法給用戶推送消息的。每一次授權(quán)只允許發(fā)送一條消息,所以如果你想盡量多的發(fā)送消息,就得盡量多的引導用戶授權(quán)。

推送的Java代碼如下

可以看到,我們這里需要定義用戶的openid,模板id,跳轉(zhuǎn)路徑,模板消息內(nèi)容。。。

這些都定義好以后,我們就可以提供一個服務給到Java的其他代碼調(diào)用,或者提供一個接口供外界傳入openid,然后給對應的用戶推送消息了。

我們在瀏覽器里調(diào)用上面接口,可以看到下圖所示,這樣就代表我們消息推送成功了。


這里要注意,我們要把openid和一些參數(shù)動態(tài)的獲取到,然后封裝到模板里。

所以接下來繼續(xù)改造我們的推送代碼

我們既然要獲取一些用戶的信息,比如openid,桌號,排隊開始時間等,我們一個個傳進來就有些太麻煩了,所以最簡單的方式,就是把排號表里對應的id拿過來。所以我們只需要知道用戶當前排號的id,就可以拿到所有需要的信息。
改造后的發(fā)送訂閱消息的方法如下:


這個時候,如果我們直接調(diào)用發(fā)送,會報下面這個錯誤。


仔細看下錯誤,就可以知道,我們的模板id不正確,所以,我們要配置我們自己的模板id。我們可以去小程序后臺獲取到我們自己的模板id。

填入我們的模板id后,還會報下面的錯誤。


上面的這個錯誤,就是因為我們在小程序端沒有做授權(quán)。所以授權(quán)這一步也必不可少的。而這個授權(quán)應該在用戶點擊取號的時候,就應該彈出來詢問用戶授權(quán)的。

下面我把小程序端的代碼和注意事項也和大家說下

我們在用戶取號時,不僅要請求取號接口,還要獲取用戶授權(quán)。


這個模板id為了方便管理,我寫在了app.js里了,方便全局使用。


其實小程序端只需要做這些就可以了,無非在取號時,我們要把模板id傳給后臺,存到數(shù)據(jù)庫,方便后臺Java后臺調(diào)用消息發(fā)送時使用。

最后,我再把Java的完整代碼貼出來給到大家

調(diào)用訂閱消息推送

package com.qcl.push;import com.google.gson.Gson;import com.google.gson.JsonArray;import com.google.gson.JsonElement;import com.google.gson.JsonObject;import com.qcl.bean.Paihao;import com.qcl.global.GlobalConst;import com.qcl.repository.PaihaoRepository;import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.http.ResponseEntity;import org.springframework.stereotype.Service;import org.springframework.web.bind.annotation.GetMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;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ā)送小程序訂閱消息 */@Service @Slf4j public class SendWxMessage { ? ?@Autowired ? ?private PaihaoRepository repository; ? ?//發(fā)送訂閱消息 ? ?public String pushOneUser(Integer id) { ? ? ? ?Paihao paihao = repository.findById(id).orElse(null); ? ? ? ?RestTemplate restTemplate = new RestTemplate(); ? ? ? ?//這里簡單起見我們每次都獲取最新的access_token(時間開發(fā)中,應該在access_token快過期時再重新獲?。?/span> ? ? ? ?String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" + getAccessToken(); ? ? ? ?//拼接推送的模版 ? ? ? ?WxMssVo wxMssVo = new WxMssVo(); ? ? ? ?wxMssVo.setTouser(paihao.getOpenid());//用戶的openid(要發(fā)送給那個用戶,通常這里應該動態(tài)傳進來的) ? ? ? ?wxMssVo.setTemplate_id(paihao.getTemplateid());//訂閱消息模板id ? ? ? ?wxMssVo.setPage("pages/index/index"); ? ? ? ?//封裝模板消息內(nèi)容。必須和你申請的小程序模板格式一模一樣。 ? ? ? ?Map<String, TemplateData> m = new HashMap<>(2); ? ? ? ?//A小桌,B大桌 ? ? ? ?String num = (paihao.getType() == 1 ? "B" : "A") + paihao.getNum(); ? ? ? ?m.put("phrase1", new TemplateData("您可入座啦")); ? ? ? ?m.put("character_string5", new TemplateData(num)); ? ? ? ?wxMssVo.setData(m); ? ? ? ?ResponseEntity<String> responseEntity = ? ? ? ? ? ? ? ?restTemplate.postForEntity(url, wxMssVo, String.class); ? ? ? ?log.info("推送返回的信息 ={}", responseEntity.getBody()); ? ? ? ?return responseEntity.getBody(); ? ?} ? ?//獲取AccessToken ? ?public String getAccessToken() { ? ? ? ?RestTemplate restTemplate = new RestTemplate(); ? ? ? ?Map<String, String> params = new HashMap<>(); ? ? ? ?params.put("APPID", GlobalConst.APPID); ?//這里替換成你的appid ? ? ? ?params.put("APPSECRET", GlobalConst.APPSECRET); ?//這里替換成你的appsecret ? ? ? ?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(); ? ? ? ?AccessToken object = new Gson().fromJson(body, AccessToken.class); ? ? ? ?log.info("返回的AccessToken={}", object); ? ? ? ?String Access_Token = object.getAccess_token(); ? ? ? ?return Access_Token; ? ?} }

WxMssVo類

package com.qcl.push;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類

package com.qcl.push;import lombok.Data;/* * 編程小石頭 * 用來封裝訂閱消息內(nèi)容 * */@Data public class TemplateData { ? ?private String value;// ? ?public TemplateData(String value) { ? ? ? ?this.value = value; ? ?} }

AccessToken類

package com.qcl.push;import lombok.Data;/** * 作者:編程小石頭 * 微信返回的Access_Token對應的bean */@Data public class AccessToken { ? ?private String access_token; ? ?private String expires_in; }

到這里就完整的講解完,排號等位時微信消息推送功能了。后面我也會錄制視頻出來《點餐系統(tǒng),java后臺+點餐小程序》


Java點餐系統(tǒng)和點餐小程序新加微信消息推送功能的評論 (共 條)

分享到微博請遵守國家法律
邯郸市| 内丘县| 威海市| 长泰县| 将乐县| 内黄县| 贺兰县| 都昌县| 焦作市| 阿勒泰市| 独山县| 灵璧县| 阿拉善右旗| 盐源县| 靖宇县| 三穗县| 铁力市| 乌海市| 海晏县| 汽车| 体育| 资讯 | 咸宁市| 云梦县| 高平市| 沾化县| 天等县| 和硕县| 读书| 通江县| 江陵县| 同德县| 晋江市| 泉州市| 巨野县| 渝中区| 甘洛县| 林州市| 平顶山市| 新乡县| 迭部县|