最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

在小程序中推送模板消息的實現(xiàn)方法

 更新時間:2019年07月22日 10:24:05   作者:煩囂的人  
這篇文章主要介紹了在小程序中推送模板消息的實現(xiàn)方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下

前段時間剁手了 PS4,在瀏覽商店時,發(fā)現(xiàn)官方商店真的不好用,主要是網(wǎng)絡(luò)原因,次要是頁面設(shè)計。所以就想自己做一個游戲查詢的小程序,可以關(guān)注某個游戲,然后在這個游戲打折的時候發(fā)送通知給用戶。最后發(fā)現(xiàn)有個很大的問題是:小程序沒法直接給用戶推送消息(當時還不知道模板消息),服務(wù)號才能。然后就用郵箱實現(xiàn)了通知功能,但是郵箱的局限實在是太大了(各大免費郵箱每天的發(fā)件數(shù)都很小,自己搭建的郵件服務(wù)器雖然沒有發(fā)件限制,但是大概率會被放到垃圾箱)。

然后某天在微信小程序的管理后臺發(fā)現(xiàn)了模板消息這個東西,查了會資料發(fā)現(xiàn)可以通過這個來實現(xiàn)消息推送。要給用戶發(fā)送模板消息需要 formId/prepay_id 這樣一個東西,這個東西是怎么來的呢?

  • formId:這個可以通過表單的提交來獲取,需要在組件中設(shè)置屬性 report-submit="true" ,這樣每次對這個表單的提交一次就會產(chǎn)生一個 formId.
  • prepay_id:這個是支付動作產(chǎn)生的,具體的我也不太清楚,畢竟個人小程序并不能支付.

下面具體來講講前后臺的實現(xiàn),前臺使用 mpvue,后臺使用 java

前臺獲取 formId

既然可以通過 form 的 submit 操作來獲取到 formId,那我們稍微拓展一下,將我們的小程序頁面中所有用戶能點擊的部分都用 form,button 來包裹一下,這樣用戶感知不到有表單提交操作,我們也能獲取大量的 formId。

注意不能用疊加的方式來一次點擊獲取多個 formId,這樣方法已經(jīng)不行了,獲取到的都會是一樣的。

獲取一個模板

要發(fā)送模板消息,首先要在小程序的管理后臺上添加模板,步驟如下:

1.在模板庫中選擇一個模板

2.選擇顯示參數(shù)

選擇要顯示在消息中的參數(shù),這里選擇如下兩個參數(shù):

這樣就有了一個模板可以用來發(fā)消息了,在我的模板中可以看到模板 id,和字段 id

獲取 formId

formId 是通過表單提交來獲取到了,為了獲取足夠多的 formId,可以將能夠點擊的組件(比如按鈕,列表單元..)包裹在 form 中,這樣用戶在日常使用中就能夠收集到足夠多的 formId。下面以包裹一個有贊的按鈕為例。因為小程序的限制,設(shè)置 form-type 屬性的按鈕必須為 form 組件的直接子節(jié)點,所以并不能夠在 form 中使用自定義組件,并將 form-type='submit' 設(shè)置到自定義組件中。

template 部分如下:

<!-- 要獲取formId,需要給form設(shè)置report-submit="true"的屬性,然后在form-type="submit"的按鈕上產(chǎn)生點擊動作,才會觸發(fā)表單提交的事件--formSubmit,進而獲取到formId -->
<form @submit="formSubmit" report-submit="true" class="bottom">
 <button style="border:0;display:inline-block" plain="true" form-type="submit" @click="back">
  <van-button round type="primary" size="small" @click="back">返回</van-button>
 </button>
 <button style="border:0;display:inline-block" plain="true" form-type="submit" @click="watchGame">
  <van-button round type="danger" size="small">{{watchText}}</van-button>
 </button>
 <button style="border:0;display:inline-block" plain="true" form-type="submit" open-type="share">
  <van-button round type="info" size="small">分享</van-button>
 </button>
</form>

style 目的為了去除原生 button 的背景,邊框啥的,把 button 當一個 div 來使用,然后在 button 中設(shè)置 form-type 和 click 屬性,這樣既不影響 formId 的屬性,也對原有邏輯不產(chǎn)生任何影響。之所以將 click 放在 button 上是因為 button 內(nèi)部的組件沒法獲取到點擊事件。

formSubmit 代碼如下:

formSubmit(e) {
 let item = {
  value: e.mp.detail.formId,
  expireTime: Date.now() + 7 * 24 * 60 * 60 * 1000
 };
 this.globalData.formIdList.push(item);
},

該函數(shù)是在表單提交時觸發(fā),用于獲取 formId,將 formId 和這個 formId 的過期時間一起存到 globalData 全局數(shù)據(jù)中。然后找一個時機將這些 formId 發(fā)送給服務(wù)器保存起來就行了。

這里放上我的做法以供參考。

我是在每次發(fā)送 http 請求前檢查是不是有 formId 需要發(fā)送到服務(wù)器,如果有就將這些數(shù)據(jù) JSON 序列化后放到一個自定義 header 中,發(fā)送出去,具體代碼如下(http 請求工具為:flyio):

var Fly = require("flyio/dist/npm/wx");
var fly = new Fly();
//在請求預(yù)處理中
fly.interceptors.request.use(request => {
 request.headers["jwt-token"] = wxUtil.getGlobalData("jwt-token");
 //如果有formId就放到header里送過去
 let formIdList = getApp().globalData.formIdList;
 if (formIdList.length > 0) {
  request.headers["formIdList"] = JSON.stringify(formIdList);
  getApp().globalData.formIdList = [];
 }
 if (request.method == "GET") {
  request.params["_t"] = new Date().getTime();
 }
 return request;
});

下面將后臺的實現(xiàn),基于 Spring Boot.

后臺處理

搜集 formId

首先需要把 formId 收集起來存到數(shù)據(jù)庫,那么就需要檢查每個請求,看 header 中有沒有攜帶 formId,如果有就存到數(shù)據(jù)庫中,注意要和用戶對應(yīng)起來,某個用戶點擊產(chǎn)生的 formId 只能用于給這個用戶推送消息。

因為要將 formId 和用戶綁定起來,因此我是在身份認證過濾器中進行的 formId 處理,身份認證成功后,處理 formId。代碼如下:

/**
 * Description: 從請求頭中獲取formIdList,并插入數(shù)據(jù)庫
 *
 * @param request 請求頭
 * @return void
 * @author fanxb
 * @date 2019/5/6 16:39
 */
private void checkFormId(HttpServletRequest request) {
  String str = request.getHeader(Constant.HEADER_FORM_ID);
  if (StringUtil.isEmpty(str)) {
    return;
  }
  List<FormKey> formKeyList = JSON.parseArray(str, FormKey.class);
  //UserContextHolder用戶將當前線程和用戶綁定起來,方便后面獲取用戶信息
  int userId = UserContextHolder.get().getUser().getUserId();
  formKeyList.forEach(item -> item.setUserId(userId));
  this.formKeyDao.insertMany(formKeyList);
}

發(fā)送微信提醒

通過官方文檔可以知道發(fā)送消息的流程如下:

1 獲取 accessToken,調(diào)用微信的大多數(shù)接口都需要這個東西,這個通過 appId 和 secret 來獲取。詳情參見: https://developers.weixin.qq.com/miniprogram/dev/api-backend/auth.getAccessToken.html

2 調(diào)用微信發(fā)送服務(wù)通知的接口.這個接口文檔在: 點擊跳轉(zhuǎn)

最終發(fā)送的 http 請求是這樣的:

url: https://api.weixin.qq.com/cgi-bin/message/wxopen/template/send?access_token=上面獲取的accessToken
method: post

請求體格式為:application/json; charset=utf-8

body:{
 "touser": "用戶的openId",
 "template_id": "模板id",
 "page": "點擊跳轉(zhuǎn)的小程序url路徑",
 "form_id": "收集到的formId",
 "data": {
  "keyword1": {
   "value": "您有一個信息的提示消息"
  },
  "keyword2": {
   "value": "這是消息內(nèi)容"
  }
 },
 "emphasis_keyword": "keyword1.DATA"
}

data 中的數(shù)據(jù)的按照順序 keyword1,keyword2 對應(yīng)于模板中字段的順序。

結(jié)束

工程全部源碼在這里:github

總結(jié)

以上所述是小編給大家介紹的在小程序中推送模板消息的實現(xiàn)方法,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
如果你覺得本文對你有幫助,歡迎轉(zhuǎn)載,煩請注明出處,謝謝!

相關(guān)文章

  • JavaScript中深拷貝與淺拷貝詳解

    JavaScript中深拷貝與淺拷貝詳解

    大家好,本篇文章主要講的是JavaScript中深拷貝與淺拷貝詳解,感興趣的同學(xué)趕快來看一看吧,對你有幫助的話記得收藏一下
    2022-02-02
  • javascript window.onerror事件學(xué)習新收獲

    javascript window.onerror事件學(xué)習新收獲

    javascript window.onerror事件學(xué)習新收獲...
    2007-11-11
  • js動態(tài)切換圖片的方法

    js動態(tài)切換圖片的方法

    這篇文章主要介紹了js動態(tài)切換圖片的方法,包含完整的css文件與js文件實現(xiàn)技巧,非常具有實用價值,需要的朋友可以參考下
    2015-01-01
  • ES6中export?default和export之間的區(qū)別詳解

    ES6中export?default和export之間的區(qū)別詳解

    export和export?default都是es6語法中用來導(dǎo)出組件的,可以導(dǎo)出的文檔類型有(?數(shù)據(jù)、常量、函數(shù)、js文件、模塊等),下面這篇文章主要給大家介紹了關(guān)于ES6中export?default和export之間的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2023-04-04
  • Java Varargs 可變參數(shù)用法詳解

    Java Varargs 可變參數(shù)用法詳解

    在本篇文章里小編給大家整理了關(guān)于Java Varargs 可變參數(shù)使用以及相關(guān)知識點,需要的朋友們參考下。
    2020-01-01
  • JS獲取Promise對象里面的值問題

    JS獲取Promise對象里面的值問題

    這篇文章主要介紹了JS如何獲取Promise對象里面的值問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 前端項目npm?install?安裝依賴報錯的解決方案(三種問題解決方案)

    前端項目npm?install?安裝依賴報錯的解決方案(三種問題解決方案)

    本文給大家介紹前端項目npm?install?安裝依賴報錯的解決方案(三種問題解決方案),給大家總結(jié)了前端項目安裝依賴,遇到過的問題,每一種問題給大家完美解決方案,感興趣的朋友一起看看吧
    2023-12-12
  • 史上最為詳細的javascript繼承(推薦)

    史上最為詳細的javascript繼承(推薦)

    這篇文章主要介紹了javascript繼承,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習或者工作具有一定的參考學(xué)習價值,需要的朋友們下面隨著小編來一起學(xué)習學(xué)習吧
    2019-05-05
  • JavaScript多種頁面刷新方法小結(jié)

    JavaScript多種頁面刷新方法小結(jié)

    這篇文章主要介紹了JavaScript多種頁面刷新方法小結(jié),非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • Javascript計算兩個marker之間的距離(Google Map V3)

    Javascript計算兩個marker之間的距離(Google Map V3)

    做地圖開發(fā),最常用到的就是marker一些操作和交互。簡單介紹一下,兩個marker之間的距離計算,感興趣的朋友可以參考下哈,希望對你有所幫助
    2013-04-04

最新評論

克东县| 东丰县| 天门市| 镇平县| 彝良县| 武安市| 昭平县| 绿春县| 江口县| 孙吴县| 威远县| 巩义市| 桂平市| 稷山县| 江油市| 泸溪县| 清徐县| 高唐县| 麻城市| 平度市| 萝北县| 岑溪市| 芜湖县| 庆元县| 大关县| 铜川市| 文山县| 化州市| 安溪县| 明光市| 耒阳市| 宁国市| 永定县| 桃江县| 沭阳县| 城市| 天柱县| 泾源县| 高唐县| 安仁县| 九寨沟县|