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

  • 2019 年 10 月 3 日
  • 筆記

基於上一篇文件“.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://www.cnblogs.com/hailang8/

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

 
我的部落格即將同步至騰訊雲+社區,邀請大家一同入駐:https://cloud.tencent.com/developer/support-plan?invite_code=3jpr0nagboo48