久久久久在线观看_又色又爽又黄的免费视频播放_一区中文字幕_日韩电影在线播放

今日頭條 焦點資訊 營銷之道 企業報道 淘寶運營 網站建設 軟件開發 400電話
  當前位置: 首頁 » 資訊 » 軟件開發 » 正文

實現微信小程序模板消息不受限制、無限主動推送

放大字體  縮小字體 發布日期:2018-03-01  來源:企業800網  作者:新格網  瀏覽次數:444  【去百度看看】
核心提示:我們在微信小程序的開發中難免會遇到模板消息受限制,無法無限主動推送等問題,可能令人很頭疼,今天我們就來詳細的講一下如何實現微信小程序模板消息不受限制、實現無限主動推送,感興趣的一起來看看吧!

需求背景

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

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

public void collect(String openId, List<FormTemplateVO> formTemplates) {
   redisTemplate.opsForList().rightPushAll("mina:openid:" + openId, formTemplates);
}

推送模板消息

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

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);
}
}


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天內,對用戶發送多條模板消息喚回用戶。

這就是實現微信小程序模板消息不受限制、無限主動推送的方法詳細的所有內容。

相關文章:

微信小程序消息推送php服務器驗證

以上就是實現微信小程序模板消息不受限制、無限主動推送的詳細內容,更多請關注php中文網其它相關文章!

 
 
[ 資訊搜索 ]  [ 加入收藏 ]  [ 告訴好友 ]  [ 打印本文 ]  [ 違規舉報 ]  [ 關閉窗口 ]

 
0條 [查看全部]  相關評論

 
網站首頁 | 關于我們 | 聯系方式 | 使用協議 | 版權隱私 | 網站地圖 | 排名推廣 | 廣告服務 | 積分換禮 | 網站留言 | RSS訂閱 | 吉ICP備11001726號-6
企業800網 · 提供技術支持