小程式怎麼給使用者推送訊息
往小程式能傳送訊息嗎?答案肯定是能的。
開通訊息傳送功能
進入微信公眾平臺,設定,開通小程式訊息傳送許可權
配置訊息傳送模板
微信公眾平臺有三種訊息推送方式
1、 開發者伺服器接收訊息推送
2、 雲函式接收訊息推送
3、微信雲託管服務接收訊息推送。
現在我們要看的是第一種。開發者伺服器接收訊息推送
開發者伺服器接收訊息推送
訊息能力是小程式重要組成部分,我們為開發者提供了訂閱訊息的能力,以便實現服務的閉環和更優的體驗。
訂閱訊息推送位置: 服務通知
訂閱訊息下發條件: 使用者自主訂閱
訂閱訊息卡片跳轉能力: 點選檢視詳情或可跳轉到小程式的頁面
1、 先定義一個訊息模板。
如下圖,在微信公眾平臺訂閱一個訊息模板,用來定義訊息的格式。我已經訂閱成功了一個,具體步驟,可自行百度。
圖1
2、獲取小程式使用者的openId
過程略,可百度
3、獲取access_token.
access_token 是小程式全域性唯一的後臺介面呼叫憑據,呼叫大多數後臺介面時都需使用。開發者可以通過getAccessToken介面獲取並進行妥善儲存。
為了access_token的安全性,後端API不能直接在小程式內通過wx.request呼叫,即api.weixin.qq.com不能被配置為伺服器域名。開發者應在後端伺服器使用getAccessToken獲取access_token.
過程略
上邊條件具備之後,開始整理髮送訊息到小程式上的內容
傳送訊息到小程式
下面就要呼叫小程式官方提供的傳送訊息的介面了。先看一下官方文件
圖2
第一步,要引導使用者授權,能夠允許接收訊息, 如圖1.
下邊是彈出授權訊息的小程式程式碼
confirmMsg: function(e){ wx.getSetting({ withSubscriptions: true, // 這裡設定為true,下面才會返回mainSwitch success: function(res){ let tmplIds = 'UblTSmgV_clnIbj5JT6tkbkFDCDSWHtX-dGazbtf9DE' // 調起授權介面彈窗 if (res.subscriptionsSetting.mainSwitch) { // 使用者開啟了訂閱訊息總開關 if (res.subscriptionsSetting.itemSettings != null) { // 使用者同意總是保持是否推送訊息的選擇, 這裡表示以後不會再拉起推送訊息的授權 let moIdState = res.subscriptionsSetting.itemSettings[tmplIds]; // 使用者同意的訊息模板id if(moIdState === 'accept'){ console.log('接受了訊息推送'); }else if(moIdState === 'reject'){ console.log("拒絕訊息推送"); }else if(moIdState === 'ban'){ console.log("已被後臺封禁"); } }else { // 當使用者沒有點選 ’總是保持以上選擇,不再詢問‘ 按鈕。那每次執到這都會拉起授權彈窗 wx.showModal({ title: '提示', content:'請授權開通服務通知', showCancel: true, success: function (ress) { if (ress.confirm) { wx.requestSubscribeMessage({ // 調起訊息訂閱介面 tmplIds: [tmplIds], success (res) { wx.request({ url: 'http://localhost:9090/pro_api/test/sendOneUser/{openId}', method: 'post', data: { } }) }, fail (er){ console.log("訂閱訊息 失敗 "); console.log(er); } }) } } }) } }else { console.log('訂閱訊息未開啟') } }, fail: function(error){ console.log(error); }, }) },
第二步, 使用者授權允許後,呼叫後臺java介面,生成訊息內容,傳送到微信平臺,並通知小程式使用者。
RestTemplate restTemplate = new RestTemplate(); String url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" getAccesToken(); WxMssVo msgVo = new WxMssVo(); msgVo.setTouser(openId); msgVo.setTemplate_id(template_id); msgVo.setPage("pages/index/index"); Mapm = new HashMap<>(); m.put("thing1", new TemplateData("title content")); m.put("name4", new TemplateData("杭州")); m.put("date3", new TemplateData("2022年11月22日")); m.put("thing2", new TemplateData("content1")); m.put("thing8", new TemplateData("content2")); msgVo.setData(m); log.debug("msg content: {}", msgVo); ResponseEntityresponseEntity = restTemplate.postForEntity(url, msgVo, String.class); String resMsg = responseEntity.getBody(); log.info("get Message Result: {}", resMsg); return resMsg;
只要小程式端允許獲取訊息,並呼叫上邊介面,根據微信使用者的openId,傳送到小程式使用者,即可成功。
第三步,展示效果
圖3
大功告成,往小程式上傳送訊息成功。
注意的問題
訊息模板定義,除非你是學校等公立的機構主體,才能訂購長期訂閱的模板,其他只能訂購一次性模板。
圖4
第二個問題,在往微信平臺傳送訊息內容時,需注意傳送的內容有限制,否則會被校驗出來,提示各種invalide date, invalide name等,無法傳送,需按照下邊注意一下即可。
圖5
好了,基本就這些。