新澳门萄京娱乐场官网

当前位置:新萄京娱乐场手机版 > 新澳门萄京娱乐场官网 > 微信小程序允许下发模板消息的条件分为两类

微信小程序允许下发模板消息的条件分为两类

来源:http://www.chrisproduction.com 作者:新萄京娱乐场手机版 时间:2019-10-10 01:01

须要背景

基于微信的布告渠道,微信小程序为开采者提供了足以便捷触达客商的模板音信本领,在顾客本身与小程序页面有相互行为后触发,通过微信聊天列表中的服务通告可飞快步入查看新闻,点击查阅详细情形还能够跳转到下发信息的小程序的钦点页面。

微信小程序同意下发模板音讯的法规分为两类:支付大概提交表单。通过提交表单来发出模板音讯的限制为“允许开辟者向客商在7天内推送有限条数的模版消息(1次提交表单可发出1条,数十次交给下条数独立,相互不影响)”。

然而,客户1次触发7天内推送1条通告是显著远远不够用的。举例,签到功效利用模板新闻的推送来提示客商每一天签到,只好在客商前一天报到的情景下,获取一回推送模板音信的机会,然后用于第二天向该客商发送签到晋升。但是过多情景下,客商在某一天忘记登陆,系统便失去了提示客户的权力,导致和顾客断开了沟通;再例如,系统想再接再砺告知客户就要做某活动,不过由于微信小程序颓丧触及公告的限量,系统将不能主动推送新闻。

怎样突破模板新闻的推送限制?

突破口:“1次提交表单可发出1条,数十次交由下发条数独立,相互不影响”

为了突破模板音讯的推送限制,达成7天内放肆推送,只需搜集到丰裕的推送码,即每回提交表单时收获到的formId。二个formId代表着开拓者有向脚下客户推送模板音讯的贰回权限

收集推送码

当表单组件中的属性report-submit=true时表示发送模板音信,提交表单便可以赢得formId。接下来只要对本来的页面进行改换,将顾客原来绑定了点击事件的分界面用表单组件中的button开关组件来顶替,即把顾客的交互点击的bindtap事件由表单bindsubmit来替代,进而捕获客户的点击事件来变化越来越多的推送码。

// 收集推送码Page({ formSubmit: funcition { let formId = e.detail.formId; this.collectFormIds; //保存推送码 let type = e.detail.target.dataset.type; // 根据type执行点击事件 }, collectFormIds: function { let formIds = app.globalData.globalFormIds; // 获取全局推送码数组 if  formIds = []; let data = { formId: formId, expire: new Data().getTime() + 60480000 // 7天后的过期时间戳 } formIds.push; app.globalData.globalFormIds = formIds; },})
反馈推送码

等候顾客下一遍发起互连网需要时,将globalFormIds发送给服务器。

// 上报推送码Page({ onLoad: funcition { this.uploadFormIds(); //上传推送码 }, collectFormIds: function { var formIds = app.globalData.globalFormIds; // 获取全局推送码 if (formIds.length) { formIds = JSON.stringify; // 转换成JSON字符串 app.globalData.gloabalFomIds = ''; // 清空当前全局推送码 } wx.request({ // 发送到服务器 url: 'http://xxx', method: 'POST', data: { openId: 'openId', formIds: formIds }, success: function { } }); },})
储存推送码

数次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 : ""); // 模板内容 if (StringUtils.isNotBlank) { String[] keyWordArr = keyWords.split(BaseConsts.COMMA_STR); Map<String, MsgTemplateVO.KeyWord> keyWordMap = new HashMap<>; for (int i = 0; i < keyWordArr.length; i++) { MsgTemplateVO.KeyWord keyWord = msgTemplateVO.new KeyWord(keyWordArr[i]); keyWordMap.put(MsgTemplateVO.KEYWORD + , keyWord); } msgTemplateVO.setData(keyWordMap); } else { msgTemplateVO.setData(Collections.emptyMap; } // 获取所有用户 List<String> openIdList = minaRedisDao.getAllOpenIds(); for (String openId : openIdList) { // 获取有效推送码 String formId = minaRedisDao.getValidFormId; if (StringUtils.isBlank { 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; continue; } if  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 { if (formTemplates.get.getExpire() > System.currentTimeMillis { validFormId = formTemplates.get.getFormId(); trimStart = i + 1; break; } } // 移除本次使用的和已过期的 redisTemplate.opsForList().trim(KEY_MINA_PUSH + openId, trimStart == 0 ? size : trimStart, -1); return validFormId;}

以上方案得以兑将来客户最后二遍使用小程序后的7天内,对客商发送多条模板音信唤回客商。

本文由新萄京娱乐场手机版发布于新澳门萄京娱乐场官网,转载请注明出处:微信小程序允许下发模板消息的条件分为两类

关键词: