.NET Core 小程序開發零基礎系列(2)——小程序服務通知(模板消息)

基於上一篇文件“.NET Core 小程序開發零基礎系列(1)——開發者啓用並校驗牽手成功”的反映,個人覺得效果很不錯,大家對公衆號開發還是有很大需求的,同時也收到了很多同學的問題,後面我也會通過實戰性文章慢慢的表現出來 ,讓大家更容易吃得透一些。在這裏特別感謝盛派Senparc作者的支持,也感謝各社區大佬的支持,同時也要感謝我的6位小夥伴大力支持,我們將有問必答,資源共享。

 

爲什麼說盛派Senparc開源框架開發賊快呢,因爲他們經過多年的打磨,反反覆覆的修改升級,基本上所有公衆號的功能都支持,但發現還是有很多的同學不明白原理與底層框架的設計,在這裏我們將通過真實的實戰項目來一點點吃掉。

 

廢話不多說了,開始我們的實戰第二篇,玩得好 模板消息可突破限制哦,袖子擼起來,幹 ^_^

 

瞭解一下模板消息


 基於微信的通知渠道,我們爲開發者提供了可以高效觸達用戶的模板消息能力,以便實現服務的閉環並提供更佳的體驗。

 

模板推送位置:服務通知

模板下發條件:用戶本人在微信體系內與頁面有交互行爲後觸發,詳見 下發條件說明 

模板跳轉能力:點擊查看詳情僅能跳轉下發模板的該帳號的各個頁面

 

效果如圖:

 

更多的規則請查看官方文檔

https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/template-message.html

 

附加經驗說明:

如果你公司有運營人員,一定會非常的喜歡服務通知,它能很快的引流到服務號,小程序中來,激活當前的用戶。藉助微信的服務通知,必能觸達到關注過,授權過服務號,小程序的人,是不是很棒。

 

場景:比如說用戶使用某個小程序發佈了一個百人報名活動。如果能實現有一個人報名,就向活動發起者發送一條報名通知,那就大大提高了工具的使用效率,不用發起人每次都打開小程序去看有多少人蔘與了報名。顯然,當前的消息發送機制無法滿足這個需求。

 

模板有很多種咯,每個行業的模板也不一樣,比如我們電商系統需要的模板“訂單支付成功通知”、“訂單支付失敗通知”、“預約成功通知”、“訂單發貨通知”、“用戶認證通知”等等模板。

 

創建你想要的模板/設置模板


 登錄小程序後臺,點擊左側“模板消息”,如圖:

 

默認“我的模板庫”是沒有模板的,需要進入到“模板庫”中進行創建, 模板庫中的模板非常多,建議搜索你想要的模板,如圖:

 

選擇對應的模板,點擊選用,如圖:

注意:這裏添加的“關鍵詞”順序要嚴格按照我們後臺列出來的順序去選擇排列,否則會出現數據錯亂的問題。

以上基本是瞭解模板,配置模板,下面我們真正來發送模板啦!

 

收集formId(突破模板消息的推送限制?)


 

這裏爲什麼要收集formId呢,因爲小程序發送模板必須要對應人的formId來發送,不然你是發送不成功的。

 

formId收集方法,我們直接講複雜的收集,突破模板消息的推送限制。

 

流程

結合小程序前端界面實現批量收集formId==》上報後臺==》存儲formId==》發送模板,最終做到7日內推送模板消息、觸及用戶激活用戶。

 

實現步驟

1、小程序構建formId 池,每次將用戶提交的表單都蒐集起來存入formId池,當用戶操作前端某個位置或者離開掛起小程序時,發送formIds到後端存儲起來。

 

2、將小程序用戶有可能點擊的區域覆蓋一層不可見的button,並將整個頁面用於傳輸formId的button包裹在一form標籤內,一旦用戶有點擊按鈕的操作,就將獲取到的formId存入formId 池。

 

上小程序部分代碼

1、先定義一個formId數組

 

2、小程序頁面定義事件

 

3、提交事件

 

4、提交到後臺,批量收集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://blog.csdn.net/hailang2ll

本文文章版權歸作者和博客園共有,未經作者同意不得隨意轉載,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。如有問題或建議,請與我聯繫。
 
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章