日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

微信小程序模板消息限制,实现无限制主动推送

發布時間:2024/3/24 编程问答 66 豆豆
生活随笔 收集整理的這篇文章主要介紹了 微信小程序模板消息限制,实现无限制主动推送 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

需求背景

基于微信的通知渠道,微信小程序為開發者提供了可以高效觸達用戶的模板消息能力,在用戶本人與小程序頁面有交互行為后觸發,通過微信聊天列表中的服務通知可快捷進入查看消息,點擊查看詳情還能跳轉到下發消息的小程序的指定頁面。

微信小程序允許下發模板消息的條件分為兩類:支付或者提交表單。通過提交表單來下發模板消息的限制為“允許開發者向用戶在7天內推送有限條數的模板消息(1次提交表單可下發1條,多次提交下條數獨立,相互不影響)”。

然而,用戶1次觸發7天內推送1條通知是明顯不夠用的。比如,簽到功能利用模板消息的推送來提醒用戶每天簽到,只能在用戶前一天簽到的情況下,獲取一次推送模板消息的機會,然后用于第二天向該用戶發送簽到提醒。但是很多情況下,用戶在某一天忘記簽到,系統便失去了提醒用戶的權限,導致和用戶斷開了聯系;再比如,系統想主動告知用戶即將做某活動,然而由于微信小程序被動觸發通知的限制,系統將無法主動推送消息。

?

如何突破模板消息的推送限制?

突破口:“1次提交表單可下發1條,多次提交下發條數獨立,相互不影響”

為了突破模板消息的推送限制,實現7天內任性推送,只需收集到足夠的推送碼,即每次提交表單時獲取到的formId。一個formId代表著開發者有向當前用戶推送模板消息的一次權限。

?

客戶端

?

收集推送碼

當表單組件中的屬性report-submit=true時表示發送模板消息,提交表單便可以獲取formId。接下來只要對原先的頁面進行改造,將用戶原先綁定了點擊事件的界面用表單組件中的button按鈕組件來代替,即把用戶的交互點擊的bindtap事件由表單bindsubmit來代替,從而捕獲用戶的點擊事件來生成更多的推送碼。

// 收集推送碼 Page({formSubmit: funcition(e) { let formId = e.detail.formId; this.collectFormIds(formId); //保存推送碼 let type = e.detail.target.dataset.type; // 根據type執行點擊事件 },collectFormIds: function(formId) { let formIds = app.globalData.globalFormIds; // 獲取全局推送碼數組 if (!formIds)formIds = []; let data = {formId: formId,expire: new Data().getTime() + 60480000 // 7天后的過期時間戳 }formIds.push(data);app.globalData.globalFormIds = formIds; }, })

?

?

上報推送碼

等待用戶下一次發起網絡請求時,將globalFormIds發送給服務器。

// 上報推送碼 Page({onLoad: funcition(e) { this.uploadFormIds(); //上傳推送碼 },collectFormIds: function(formId) { var formIds = app.globalData.globalFormIds; // 獲取全局推送碼 if (formIds.length) {formIds = JSON.stringify(formIds); // 轉換成JSON字符串app.globalData.gloabalFomIds = ''; // 清空當前全局推送碼 }wx.request({ // 發送到服務器url: 'http://xxx',method: 'POST',data: {openId: 'openId',formIds: formIds },success: function(res) { } }); }, })

?

服務端

存儲推送碼

高頻IO,采用Redis來存儲推送碼。

/** * 收集用戶推送碼 * * @param openId 用戶的openid * @param formTemplates 用戶的表單模板 */ public void collect(String openId, List<FormTemplateVO> formTemplates) {redisTemplate.opsForList().rightPushAll("mina:openid:" + openId, formTemplates); }

?

推送模板消息

下面實現了群發的功能,針對特定用戶類似。

/** * 推送消息 * * @param templateId 模板消息id * @param page 跳轉頁面 * @param keyWords 模板內容 */ public void push(String templateId, String page, String keyWords) { String logPrefix = "推送消息";// 獲取access token String accessToken = this.getAccessToken();// 創建消息通用模板 MsgTemplateVO msgTemplateVO = MsgTemplateVO.builder().template_id(templateId).build(); // 跳轉頁面msgTemplateVO.setPage(StringUtils.isNotBlank(page) ? page : ""); // 模板內容 if (StringUtils.isNotBlank(keyWords)) { String[] keyWordArr = keyWords.split(BaseConsts.COMMA_STR); Map<String, MsgTemplateVO.KeyWord> keyWordMap = new HashMap<>(8); for (int i = 0; i < keyWordArr.length; i++) { MsgTemplateVO.KeyWord keyWord = msgTemplateVO.new KeyWord(keyWordArr[i]);keyWordMap.put(MsgTemplateVO.KEYWORD + (i + 1), keyWord); }msgTemplateVO.setData(keyWordMap); } else {msgTemplateVO.setData(Collections.emptyMap()); }// 獲取所有用戶 List<String> openIdList = minaRedisDao.getAllOpenIds();for (String openId : openIdList) { // 獲取有效推送碼 String formId = minaRedisDao.getValidFormId(openId); if (StringUtils.isBlank(formId)) {LOGGER.error("{}>>>openId={}>>>已無有效推送碼[失敗]", logPrefix, openId); continue; }// 指派消息 MsgTemplateVO assignMsgTemplateVO = msgTemplateVO.assign(openId, formId);// 發送消息 Map<String, Object> resultMap; try { String jsonBody = JsonUtils.getObjectMapper().writeValueAsString(assignMsgTemplateVO);String resultBody = OkHttpUtils.getInstance().postAsString(messageUrl + accessToken, jsonBody);resultMap = JsonUtils.getObjectMapper().readValue(resultBody, Map.class); } catch (IOException e) {LOGGER.error("{}>>>openId={}>>>{}[失敗]", logPrefix, openId, e.getMessage(), e); continue; }if ((int) resultMap.get(ResponseConsts.Mina.CODE) != 0) {LOGGER.error("{}>>>openId={}>>>{}[失敗]", logPrefix, openId, resultMap.get(ResponseConsts.Mina.MSG)); continue; }LOGGER.info("{}>>>openId={}>>>[成功]", logPrefix, openId); } }/** * 根據用戶獲取有效的推送碼 * * @param openId 用戶的openid * @return 推送碼 */ public String getValidFormId(String openId) { List<FormTemplateVO> formTemplates = redisTemplate.opsForList().range("mina:openid:" + openId, 0, -1);String validFormId = ""; int trimStart = 0;int size; for (int i = 0; i < (size = formTemplates.size()); i++) { if (formTemplates.get(i).getExpire() > System.currentTimeMillis()) {validFormId = formTemplates.get(i).getFormId();trimStart = i + 1; break; } }// 移除本次使用的和已過期的redisTemplate.opsForList().trim(KEY_MINA_PUSH + openId, trimStart == 0 ? size : trimStart, -1);return validFormId; }

以上方案可以實現在用戶最后一次使用小程序后的7天內,對用戶發送多條模板消息喚回用戶。

總結

以上是生活随笔為你收集整理的微信小程序模板消息限制,实现无限制主动推送的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。