你知道如何在小程序中推送模板消息?

2021-02-21 FleyX學習筆記

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

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

下面具體來講講前後臺的實現,前臺使用 mpvue,後臺使用 java

前臺獲取 formId

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

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

獲取一個模板

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

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

2.選擇顯示參數

選擇要顯示在消息中的參數,這裡選擇如下兩個參數:

這樣就有了一個模板可以用來發消息了,在我的模板中可以看到模板 id,和欄位 id

獲取 formId

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

template 部分如下:

<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 中設置 form-type 和 click 屬性,這樣既不影響 formId 的屬性,也對原有邏輯不產生任何影響。之所以將 click 放在 button 上是因為 button 內部的組件沒法獲取到點擊事件。

formSubmit 代碼如下:

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

該函數是在表單提交時觸發,用於獲取 formId,將 formId 和這個 formId 的過期時間一起存到 globalData 全局數據中。然後找一個時機將這些 formId 發送給伺服器保存起來就行了。

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

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

var Fly = require("flyio/dist/npm/wx");var fly = new Fly();fly.interceptors.request.use(request => {request.headers["jwt-token"] = wxUtil.getGlobalData("jwt-token");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;});

下面將後臺的實現,基於 Spring Boot.

後臺處理搜集 formId

首先需要把 formId 收集起來存到資料庫,那麼就需要檢查每個請求,看 header 中有沒有攜帶 formId,如果有就存到資料庫中,注意要和用戶對應起來,某個用戶點擊產生的 formId 只能用於給這個用戶推送消息。

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

/** * Description: 從請求頭中獲取formIdList,並插入資料庫 * * @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);int userId = UserContextHolder.get().getUser().getUserId();formKeyList.forEach(item -> item.setUserId(userId));this.formKeyDao.insertMany(formKeyList);}

發送微信提醒

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

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

2 調用微信發送服務通知的接口.這個接口文檔在:點擊跳轉

最終發送的 http 請求是這樣的:

url: https:method: post請求體格式為:application/json; charset=utf-8body:{"touser": "用戶的openId","template_id": "模板id","page": "點擊跳轉的小程序url路徑","form_id": "收集到的formId","data": {"keyword1": {"value": "您有一個信息的提示消息"},"keyword2": {"value": "這是消息內容"}},"emphasis_keyword": "keyword1.DATA"}

data 中的數據的按照順序 keyword1,keyword2 對應於模板中欄位的順序。

結束

點擊閱讀原文獲取項目源碼。

PS
這就是那個小程序,歡迎批評指正。

本文原創發布於:https://www.tapme.top/blog/detail/20190507

相關焦點

  • 模版消息變訂閱消息,小程序現在該怎麼玩?
    訂閱消息走來了!10月12日微信團隊發出小程序模版消息能力調整通知,微信小程序「模版消息」即將變成「訂閱消息」,並在消息中號稱「模版消息」將在2020年1月份全部下線。 有人拍手稱快,「你是不知道以前的發送模板消息是多噁心,只訪問過一次小程序就天天給我發模板消息,現在我可以選擇不接收模板消息或接收我需要的模版消息,真是一次大快人心的改動」。
  • 微信服務號模板消息即將下線,一箭射中教育企業的膝蓋
    2021年 4 月 30 日 24:00 下線,新的替代方案將和小程序統一:一次性訂閱通知&長期訂閱通知」在各位的春節假日即將到來之際,微信團隊在開放社區悄然發布了一則公告,文中重申了微信服務號模板消息能力的設計初衷,並對該能力可能會對用戶造成困擾的問題做出了調整。
  • 免費直播課預告:搭建小程序訂閱消息系統
    本次直播課將會演示如何使用雲開發快速為小程序加入訂閱消息能力,在實戰環節會帶領大家搭建一個具備訂閱消息管理能力的開課提醒小程序。可以支持在用戶自主訂閱後,推送消息到用戶端(服務通知),用戶點擊查看詳情可跳轉至小程序的頁面,實現服務的閉環,提高活躍度和用戶粘性 1  準備小程序帳號和開發工具溫馨提示:本次的實戰的案例裡用到了「訂閱課程開課提醒」這個訂閱消息模板,需要小程序服務類目裡包含 「教育 > 在線教育」,可以在服務類目中加入此類目
  • 微信小程序自帶模板嗎?如何做一個小程序購物商城?
    附近的小程序可為商店帶來天然的免費流量,通過微信用戶的社交分享,還可帶來更多的社交流量,這種裂變方式也為商家帶來了免費的推廣方式。既然電商小程序這麼有用,普通人該怎麼生成呢?都要注意哪些問題?下面就跟大家科普一下關於商城類小程序的常見問題,以及到底該如何製作。1.微信自帶小程序模板嗎如果你是個不懂技術的小白,那麼比較划算的方式是使用小程序模板來製作。
  • 怎麼增加微信公眾號服務號每月推送消息的次數
    當下,公眾平臺規定公眾號服務號每月只能推送4次消息,如果想要增加推送消息次數,可以通過推送模板消息實現,在公眾平臺可以添加模板消息功能,但不能在線推送模板消息
  • 你還在猶豫是小程序定製開發還是小程序模板開發嗎
    最近,一些客戶在委託我們開發小程序的過程中,大多數都不清楚小程序定製
  • 細說 iOS 消息推送
    上圖可以分為三步:第一步:AVOS Cloud推送服務程序把要發送的消息、目的設備的唯一標識打包,發給APNs。第二步:APNs在自身的已註冊Push服務的應用列表中,查找有相應標識的設備,並把消息發送到設備。
  • 微信服務號訂閱通知灰度測試:模板消息之變
    近幾年,隨著微信訂閱號的改版、小程序模板消息功能的調整,大部分需要實時將消息觸達用戶的公司,都選擇了依託微信服務號模板消息來開展業務。雖然此功能還未明確將替代模板消息,但仍值得思考一下:此舉對微信、開發者、運營者、用戶,分別意味著什麼?
  • 揭秘:不會寫代碼如何製作小程序,助你抓住小程序紅利
    小推薦上周的文章《首家小程序企業獲得千萬融資,小程序第一波紅利已經開始釋放》指出小程序第一波紅利已經開始釋放,並且這一波紅利是屬於小程序第三方平臺。推薦君今天就給你盤點下小程序第三方平臺的套路。這裡說的小程序第三方平臺專指能夠幫助不懂編程和設計的用戶,標準化生成一個屬於自己小程序。
  • 微信小程序內嵌網頁的一些(最佳)實踐
    我們在開發對應小程序時也算收穫了不少經驗(踩了不少坑),分享給有小程序需求的朋友們~最大的坑:不支持服務通知是的,web-view 不支持推送服務通知(或稱模板消息)。如圖所示,類似訂閱號在對話列表的模式為什麼能稱為最大的坑?我們先了解一下服務通知,以下引用全部來自微信官方小程序文檔。
  • 你知道微信小程序是怎麼設計的嗎?
    任務欄 微信在去年12月底對小程序進行了一次全面升級,在最新版6.6.1的主界面中,增加了小程序任務欄。騰訊視頻小程序界面在小程序的設計中,不止騰訊視頻,很多產品都做了減法,以產品的角度來思考,小程序本身就是為了實現功能而誕生,如果在設計中加入太多元素,就會讓它變的很沉重,如果它是一個獨立的APP,這份沉重是可以接受的
  • 模板消息來了,教你玩轉微信服務號!
    確認所屬行業,挑選行業模板已開通模板消息的服務號在公眾平臺「功能」菜單欄裡可直接看到「模板消息」選項,點擊後即可進入模板消息界面。公眾號運營者首先需要選擇帳號服務所處的兩個行業,進而點擊「+從模板庫中添加」按鈕即可從模板庫中選擇這兩個行業的模板進行服務通知。
  • 一帖讓你了解,什麼是微信「小程序」!
    當你發現一個好玩的或者實用的小程序,可以將這個小程序,或者它的某一個頁面轉發給好友或群聊。但是注意,小程序無法在朋友圈中發布分享。(點擊圖片放大後觀看)知道了這麼多可以抵達小程序的方式,還!不!夠!(點擊圖片放大後觀看)二、消息通知你可以收到小程序的模板消息
  • 如何選擇靠譜的小程序外包商?一般人不會告訴你...
    小程序上線以後,基於SaaS模式,由於開發門檻低,從而衍生了大量的小程序模板商。小程序開發變成一個具有市場價值的大蛋糕。在小程序開發市場中,據業內人士估計,目前15%的小程序由企業自主研發,「外包定製+使用小程序模版」的企業佔了85%的比例。
  • 微信小程序來了!
    小程序可以藉助微信聯合登錄,和開發者已有的 App 後臺的用戶數據進行打通,但不會支持小程序和 App 直接的跳轉。上圖中張小龍對小程序的詮釋足夠簡單,這是對於 C 端普通用戶的第一感觀,從這段話中可以知道小程序一定是基於 Html5+微信原生能力 的產品形態。
  • 怎麼開啟微信小程序功能?一分鐘教你輕鬆掌握小程序
    小程序切換:「小程序」支持掛起狀態,即「多窗口概念」,用戶可以把小程序先掛起,通過切換手機應用的方式切換至其他應用,重新切換回該小程序時,也能回到用戶之前的使用狀態。消息通知:的相關商戶可以發送模板消息給曾接受過服務的用戶,用戶可以在「小程序」內聯繫客服,支持文字和圖片,解決用戶與「小程序」的溝通問題。
  • 如何打造一款優秀的小程序
    如何觸手可及?如何讓應用無處不在?如今,小程序已經成為微信生態重要的組成部分,我們也在小程序發布之後一年,上線了自己的小程序「極客時間」,回頭再看,感覺有了更多思考和感受。小程序一步步實現了龍哥吹過的牛。H5 的入口是什麼,是一個連結,一個地址,拿到連結地址,就找到了頁面的入口。小程序不是連結。
  • 基於socket.io的實時消息推送
    這種模式是不適合某些應用場景的,比如在社交網絡用戶需要近乎實時地知道其他用戶最新的信息。對於普通站點來說, 請求-響應模式可以滿足絕大多數的功能需求,但總有某些功能我們希望能夠為用戶提供實時消息的體驗。
  • 利用 socket.io 實現消息實時推送
    項目的流程中存在著這樣的幾個對象:用 Java 實現的後端伺服器用 Node.js 實現的消息推送伺服器用戶進行操作的客戶端事件處理的流程如下:用戶進行點讚操作時,後端伺服器會進行處理,並向 Node.js 消息推送伺服器發送一條消息Node.js 消息推送伺服器接收到後端發送的消息後,處理數據,並確定向哪個用戶進行推送
  • 微信開發之服務號:授權登錄和消息模板使用示例
    4.2 模板消息推送解讀打開官方開發文檔,第4章 消息管理 中,第7節即為 模板消息接口 的參考文檔。(海外帳號沒有跳轉能力)miniprogram否跳小程序所需數據,不需跳小程序可不用傳該數據。當連結和小程序都存在時,優先跳轉小程序。appid是所需跳轉到的小程序appid(該小程序appid必須與發模板消息的公眾號是綁定關聯關係,暫不支持小遊戲)pagepath否所需跳轉到小程序的具體頁面路徑,支持帶參數,(示例pages/index?foo=bar),要求該小程序已發布,暫不支持小遊戲data是模板數據。這裡的數據個數,需要與消息模板中的參數對應,如下圖所示。