基於上一篇文件「.NET Core 小程序開發零基礎系列(1)——開發者啓用並校驗牽手成功」的反映,我的以爲效果很不錯,你們對公衆號開發仍是有很大需求的,同時也收到了不少同窗的問題,後面我也會經過實戰性文章慢慢的表現出來 ,讓你們更容易吃得透一些。在這裏特別感謝盛派Senparc做者的支持,也感謝各社區大佬的支持,同時也要感謝個人6位小夥伴大力支持,咱們將有問必答,資源共享。html
爲何說盛派Senparc開源框架開發賊快呢,由於他們通過多年的打磨,反反覆覆的修改升級,基本上全部公衆號的功能都支持,但發現仍是有不少的同窗不明白原理與底層框架的設計,在這裏咱們將經過真實的實戰項目來一點點吃掉。前端
廢話很少說了,開始咱們的實戰第二篇,玩得好 模板消息可突破限制哦,袖子擼起來,幹 ^_^redis
瞭解一下模板消息小程序
基於微信的通知渠道,咱們爲開發者提供了能夠高效觸達用戶的模板消息能力,以便實現服務的閉環並提供更佳的體驗。後端
模板推送位置:服務通知數組
模板下發條件:用戶本人在微信體系內與頁面有交互行爲後觸發,詳見 下發條件說明 微信
模板跳轉能力:點擊查看詳情僅能跳轉下發模板的該賬號的各個頁面框架
效果如圖:ide
更多的規則請查看官方文檔工具
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html
附加經驗說明:
若是你公司有運營人員,必定會很是的喜歡服務通知,它能很快的引流到服務號,小程序中來,激活當前的用戶。藉助微信的服務通知,必能觸達到關注過,受權過服務號,小程序的人,是否是很棒。
場景:好比說用戶使用某個小程序發佈了一個百人報名活動。若是能實現有一我的報名,就向活動發起者發送一條報名通知,那就大大提升了工具的使用效率,不用發起人每次都打開小程序去看有多少人蔘與了報名。顯然,當前的消息發送機制沒法知足這個需求。
模板有不少種咯,每一個行業的模板也不同,好比咱們電商系統須要的模板「訂單支付成功通知」、「訂單支付失敗通知」、「預定成功通知」、「訂單發貨通知」、「用戶認證通知」等等模板。
建立你想要的模板/設置模板
登陸小程序後臺,點擊左側「模板消息」,如圖:
默認「個人模板庫」是沒有模板的,須要進入到「模板庫」中進行建立, 模板庫中的模板很是多,建議搜索你想要的模板,如圖:
選擇對應的模板,點擊選用,如圖:
注意:這裏添加的「關鍵詞」順序要嚴格按照咱們後臺列出來的順序去選擇排列,不然會出現數據錯亂的問題。
以上基本是瞭解模板,配置模板,下面咱們真正來發送模板啦!
收集formId(突破模板消息的推送限制?)
這裏爲何要收集formId呢,由於小程序發送模板必需要對應人的formId來發送,否則你是發送不成功的。
formId收集方法,咱們直接講複雜的收集,突破模板消息的推送限制。
流程
結合小程序前端界面實現批量收集formId==》上報後臺==》存儲formId==》發送模板,最終作到7日內推送模板消息、觸及用戶激活用戶。
實現步驟
一、小程序構建formId 池,每次將用戶提交的表單都蒐集起來存入formId池,當用戶操做前端某個位置或者離開掛起小程序時,發送formIds到後端存儲起來。
二、將小程序用戶有可能點擊的區域覆蓋一層不可見的button,並將整個頁面用於傳輸formId的button包裹在一form標籤內,一旦用戶有點擊按鈕的操做,就將獲取到的formId存入formId 池。
上小程序部分代碼
一、先定義一個formId數組
二、小程序頁面定義事件
三、提交事件
四、提交到後臺,批量收集formId
以上基本是收集formId的流程,有不懂原理與實現步驟的能夠聯繫我。
發送模板消息(服務通知)
仍是上一篇那個項目,如圖:
引用盛派Senparc組件:
Senparc.Weixin.MP.MVC
Senparc.Weixin.WxOpen
批量發送模板主要代碼:
HashEntry[] hashes = redisManager2.HashValueAll(videoKey); if (hashes.Length > 0) { Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播間{videoKey},準備推送人數{hashes.Length},videoKey={videoKey},videoKeywords={videoKeywords}"); foreach (var item in hashes) { //{"WorkQueueNo":"wxccf5524125d67d16","TemplateID":"KgI11LMjGCUmvrfOPG5xHdfW2j70tJKNurfrtAFn9sk","Keywords":"2019-08-25 21:54:00|安|fffd|快來個人直播間,約起!","Url":"pages/live/liveRoom/liveRoom?id=1164536425702625280","ToOpenID":"o5D-a5QpNoC_0QYF5C-zFbmkgr4Q","ToMemberID":1053} WorkQueueParam valueItem = DMS.Common.Extensions.SerializerExtensions.DeserializeObject<WorkQueueParam>(item.Value); if (valueItem != null) { //查找小程序的fromid string key = $"{valueItem.ToMemberID}_{valueItem.WorkQueueNo}"; string fromid = redisManager3.ListLeftPop<string>(key); if (!string.IsNullOrEmpty(fromid)) { string[] keywords = videoKeywords.Split("|"); var data = new { keyword1 = new TemplateDataItem(keywords[0]), keyword2 = new TemplateDataItem(keywords[1]), keyword3 = keywords.Length > 2 ? new TemplateDataItem(keywords[2]) : null, keyword4 = keywords.Length > 3 ? new TemplateDataItem(keywords[3]) : null, }; var tempResult = Senparc.Weixin.WxOpen.AdvancedAPIs.Template.TemplateApi.SendTemplateMessage(valueItem.WorkQueueNo, valueItem.ToOpenID, valueItem.TemplateID, data, fromid, videoUrl); if (tempResult.errcode == ReturnCode.請求成功) { Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播間{videoKey},發送成功,{valueItem.ToMemberID}"); } else { Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播間{videoKey},發送失敗,{tempResult.errmsg}"); } } else { Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播間{videoKey},獲取FromID爲空,{valueItem.ToMemberID}"); } } else { Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播間{videoKey},模板內容序列哈異常"); } } } else { Console.WriteLine($"{QUEUE_ROOMVISIRECORD},直播間{videoKey},未找到直播間數據"); }
這裏的場景是這樣的:好比一個主播她建立了一個房間,設定開播的時間爲某一天,爲了給本身引流,他在微信羣分享了小程序,這時只要有人點擊了小程序連接點擊預定就會記錄與主播的關聯,等到主播開播時,會羣發下面預定的用戶。是否是有點像羣發功能,哈哈,你們有空可能嘗試一下。
注:這裏利用了redis來存儲fromid,大家也能夠用其它的方式來存儲,隨便你來玩。
總結
人個以爲代碼實現需求的過程並不複雜,主要是理解了原理與實現的過程後,就事半功倍。整個方案流程涉及到的關鍵詞有表單、按鈕、formId、模板消息、Redis等,主要須要先後端相關技術組合來實現整個方案。
做者:Dylan
公衆號:dotNET名人堂(sharecore)
微信:tangguo_9669
QQ:.NET Core 技術交流(18362376)
出處:https://www.cnblogs.com/hailang8/