亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

微信小程序模板消息限制實現無限制主動推送的示例代碼

2019-11-19 10:57:22
字體:
來源:轉載
供稿:網友

需求背景

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

微信小程序允許下發模板消息的條件分為兩類:支付或者提交表單。通過提交表單來下發模板消息的限制為“允許開發者向用戶在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 tokenString 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天內,對用戶發送多條模板消息喚回用戶。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩av在线免费播放| 国产精品久久一| 一区二区日韩精品| 一个人看的www久久| 91视频国产一区| 国产欧美日韩中文字幕在线| 亚洲成人久久久久| 一区二区亚洲欧洲国产日韩| 精品性高朝久久久久久久| 久久久www成人免费精品| 久久免费高清视频| 欧美日韩ab片| 国产一区欧美二区三区| 一本色道久久综合狠狠躁篇怎么玩| 亚洲欧美日韩精品久久奇米色影视| 精品亚洲国产视频| 日韩精品一区二区视频| 日本一欧美一欧美一亚洲视频| 国产精品久久精品| 久久福利视频导航| 欧美激情第一页xxx| 91免费看片网站| 亚洲精品99久久久久| 欧美性猛交xxxx久久久| 久久综合伊人77777尤物| 在线精品高清中文字幕| 久久99精品久久久久久噜噜| 欧美xxxx做受欧美| 日韩精品视频在线免费观看| 久久久在线免费观看| 国产精品久久久久久中文字| 一区二区在线免费视频| 亚洲欧美一区二区三区四区| 欧美视频免费在线观看| 亚洲日本成人女熟在线观看| 亚洲精品视频播放| 97视频在线观看成人| 国产精品久久9| 日韩激情视频在线播放| 日韩在线观看免费| 久久久久久成人| 国产精品免费电影| 亚洲日韩中文字幕在线播放| 日韩亚洲精品视频| 国产伦精品免费视频| 欧美激情一区二区三区成人| 欧美精品在线免费播放| 91亚洲精品一区二区| 国产精品久久二区| 91免费精品国偷自产在线| 日日狠狠久久偷偷四色综合免费| 亚洲高清久久久久久| 日韩免费av片在线观看| 亚洲天堂av电影| 欧美电影在线观看| 成人国产亚洲精品a区天堂华泰| 91在线免费观看网站| 亚洲天堂开心观看| 综合激情国产一区| 欧美在线影院在线视频| 国产一区二区三区在线看| 欧美激情手机在线视频| 国产精自产拍久久久久久蜜| 日韩精品极品在线观看播放免费视频| 国产精品日韩一区| 性欧美激情精品| 成人福利视频网| 欧美日韩国产激情| 亚洲欧美国产高清va在线播| 在线成人免费网站| 欧美一级大片在线免费观看| 成人精品在线视频| 欧美成人激情视频免费观看| 精品一区二区亚洲| 日韩免费观看视频| 欧美日韩亚洲精品内裤| 日韩欧美极品在线观看| 欧美成人第一页| 国产福利视频一区二区| 在线精品高清中文字幕| 国产精品美女在线观看| 亚洲一区二区免费在线| 91精品国产自产在线老师啪| 狠狠躁天天躁日日躁欧美| 国产精品网站视频| 日韩精品一区二区三区第95| 国产亚洲人成a一在线v站| 一本一本久久a久久精品牛牛影视| 国产日韩欧美在线| 欧美视频中文在线看| 国产91色在线免费| 中日韩美女免费视频网址在线观看| 国产精品99免视看9| 另类图片亚洲另类| 中文国产成人精品| 日韩欧美亚洲成人| 美日韩精品免费观看视频| 成人午夜两性视频| 亚洲成人网av| 亚洲一区二区久久久久久| 欧美性xxxx极品高清hd直播| 欧美日韩中文字幕综合视频| 久久不射热爱视频精品| 91深夜福利视频| 成年无码av片在线| 国产精品视频自拍| 中文字幕欧美精品在线| 亚洲国产福利在线| 国产精品久久久久aaaa九色| 欧美精品videos另类日本| 亚洲自拍av在线| 国产女人18毛片水18精品| 久久免费国产精品1| 久久久久久尹人网香蕉| 亚洲毛片一区二区| 国产日本欧美一区二区三区| 色婷婷久久一区二区| 日韩国产在线看| 欧美日韩国产综合新一区| 九九精品在线观看| 精品亚洲夜色av98在线观看| 黑人巨大精品欧美一区二区三区| 久久这里有精品| 欧美一级成年大片在线观看| 色综合久综合久久综合久鬼88| 久久精品国产久精国产思思| 在线观看欧美成人| 美日韩精品视频免费看| 欧美日韩成人在线观看| 日韩福利伦理影院免费| 午夜精品www| 国产精品久久久久久久午夜| 欧美成人黄色小视频| 中文字幕久热精品在线视频| 97国产真实伦对白精彩视频8| 亚洲精品小视频在线观看| 日韩av在线网页| 欧美人与性动交a欧美精品| 北条麻妃一区二区三区中文字幕| 欧美大片欧美激情性色a∨久久| 国产欧美va欧美va香蕉在| 精品国偷自产在线| 日韩美女免费线视频| 8050国产精品久久久久久| 日本高清视频一区| 91精品啪aⅴ在线观看国产| 亚洲第一网中文字幕| 亚洲另类图片色| 国产视频一区在线| 久久人人爽亚洲精品天堂| 亚洲一区二区三区香蕉| 欧美日韩xxxxx| 亚洲精品久久久久中文字幕欢迎你| 亚洲欧美中文在线视频| 国产女精品视频网站免费| 欧美老女人性生活| 欧美第一淫aaasss性| 美日韩精品免费视频| 国产99视频精品免视看7| 亚洲男人7777| 亚洲字幕在线观看| 亚洲国产欧美一区二区三区同亚洲| 亚洲一区二区三区乱码aⅴ| 久久天天躁狠狠躁夜夜爽蜜月|