1. 程式人生 > >.NET Core 小程式開發零基礎系列(2)——小程式服務通知(模板訊息)

.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

本文文章版權歸作者和部落格園共有,未經作者同意不得隨意轉載,且在文章頁面明顯位置給出原文連線,否則保留追究法律責任的權利。如有問題或建議,請與我聯絡。