通過模板消息接口,公眾號能向關注其賬號的用戶發送預設模板的消息。模板消息僅用於公眾號向用戶發送重要的服務通知,只能用於符合其要求的服務場景中,如信用卡刷卡通知,商品購買成功通知等。不支持廣告等營銷類消息以及其它所有可能對用戶造成騷擾的消息。本文主要介紹基於C#開發實現公眾號模板消息的管理功能。
“模板消息功能的推出,將極大地增強服務號的服務通知能力”,在一些一直期待微信模板消息功能開放的公眾號運營者看來,微信一對一溝通的社交屬性,讓信息推送的觸達率更加精准,這也讓企業在成本、服務效率、性能上有了不少優勢,不僅豐富了企業的服務形式,增強用戶的互動和粘性,還能為用戶帶來更多元、豐富、及時的服務體驗。
模版信息依行業進行劃分,並根據使用場景不同設計了不同的模版,如軟件行業下就有報名成功通知、看房提醒、訂單提醒、會員充值、會員消費通知等各種場景下可能使用到的模版。
如果我們公眾號需要使用模板,那麼我們需要從模板庫裡面添加所需的模板(目前數量上限為15個)。模板添加到我的模板後,每個模板就生成了一個隨機值,也就是【模板ID】,我們發送信息,就是依照這個模板ID進行發送的。
每個模板裡面有詳細的參數說明,以及示例效果。
微信團隊相關負責人表示:模板消息的開放主要是為了幫助公眾號完成閉環服務,現有的公眾號,主動發消息能力有限(每月可群發四條消息),這讓許多企業無法向用戶推送服務結果等消息的主動通知。模板消息開放後,企業可以借助微信平台,運用模板消息,在外部服務和內部管理過程中,讓信息的觸達更為迅捷,為用戶提供更加周到的服務。
微信一直在不斷優化用戶體驗,模板消息的開放,為企業提供了更多的基礎能力,比如更豐富的雙向互動,更精准的信息提醒等,這些都提升了企業精品化、個性化服務的深度和廣度,這也是為什麼金融、民航、政務等多領域的機構、企業都期待微信開放模板消息功能的原因。未來,隨著模板消息功能的進一步完善,或許企業員工工資明細、住戶每月用電量、電費等用電詳單,甚至是駕駛證到期需更換等,都能通過企業、部門機構微信公眾帳號的模板消息即時傳遞給相應用戶。
前面介紹了模板的相關信息以及單個模板的介紹,我們如果需要在後台程序中集成模板消息發送的話,那麼我們需要了解模板消息的API有那些?如何利用模板消息的API進行消息發送?
我們先來看看模板消息使用的說明:
1、所有服務號都可以在功能->添加功能插件處看到申請模板消息功能的入口,但只有認證後的服務號才可以申請模板消息的使用權限並獲得該權限; 2、需要選擇公眾賬號服務所處的2個行業,每月可更改1次所選行業; 3、在所選擇行業的模板庫中選用已有的模板進行調用; 4、每個賬號可以同時使用15個模板。 5、當前每個模板的日調用上限為10萬次【2014年11月18日將接口調用頻率從默認的日1萬次提升為日10萬次,可在MP登錄後的開發者中心查看】。
模板消息的管理功能有:
1 設置所屬行業
2 獲得模板ID
3 發送模板消息
4 事件推送
設置行業可在MP中完成,每月可修改行業1次,賬號僅可使用所屬行業中相關的模板,為方便第三方開發者,提供通過接口調用的方式來修改賬號所屬行業,具體如下:
接口調用請求說明
http請求方式: POST https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token=ACCESS_TOKEN
POST數據說明
POST數據示例如下:
{ "industry_id1":"1", "industry_id2":"4" }
根據說明,我們可以定義一個接口類ITemplateMessageApi,然後定義設置所屬行業的接口函數如下所示:
/// <summary> /// 設置所屬行業 /// </summary> /// <param name="accessToken"></param> /// <param name="industry_id1">公眾號模板消息所屬行業編號(主營行業)</param> /// <param name="industry_id2">公眾號模板消息所屬行業編號(副營行業)</param> /// <returns></returns> CommonResult SetIndustry(string accessToken, IndustryCode industry_id1, IndustryCode industry_id2);
而為了方便,我們定義IndustryCode為一個枚舉對象,裡面列出了系統支持的所有行業代碼,如下所示。
而實現代碼和之前的函數處理類似,都是POST數據到一個連接即可,並解析返回的結果就可以了,具體實現代碼如下所示。
/// <summary> /// 設置所屬行業 /// </summary> /// <param name="accessToken">訪問憑證</param> /// <param name="industry_id1">公眾號模板消息所屬行業編號(主營行業)</param> /// <param name="industry_id2">公眾號模板消息所屬行業編號(副營行業)</param> /// <returns></returns> public CommonResult SetIndustry(string accessToken, IndustryCode industry_id1, IndustryCode industry_id2) { var url = string.Format("https://api.weixin.qq.com/cgi-bin/template/api_set_industry?access_token={0}", accessToken); var data = new { industry_id1 = (int)industry_id1, industry_id2 = (int)industry_id2 }; string postData = data.ToJson(); return Helper.GetExecuteResult(url, postData); }
獲得模板ID,也就是從模板庫裡面添加對應的模板消息到我的模板裡面。
從行業模板庫選擇模板到賬號後台,獲得模板ID的過程可在MP中完成。為方便第三方開發者,提供通過接口調用的方式來修改賬號所屬行業,具體如下:
接口調用請求說明
http請求方式: POST https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=ACCESS_TOKEN
POST數據說明
POST數據示例如下:
{ "template_id_short":"TM00015" }
C#函數實現代碼如下所示:
/// <summary> /// 獲得模板ID. /// 從行業模板庫選擇模板到賬號後台,獲得模板ID的過程可在MP中完成。 /// </summary> /// <param name="accessToken">訪問憑證</param> /// <param name="template_id_short">模板庫中模板的編號,有“TM**”和“OPENTMTM**”等形式</param> /// <returns></returns> public AddTemplateResult AddTemplate(string accessToken, string template_id_short) { var url = string.Format("https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token={0}", accessToken); var data = new { template_id_short = template_id_short }; string postData = data.ToJson(); return JsonHelper<AddTemplateResult>.ConvertJson(url, postData); }
根據上面小節處理,添加到我的模板裡面的操作得到的模板ID,我們就可以調用發送模板消息的API進行模板消息發送了。
接口調用請求說明
http請求方式: POST https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=ACCESS_TOKEN
POST數據說明
POST數據示例如下:
{ "touser":"OPENID", "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY", "url":"http://weixin.qq.com/download", "topcolor":"#FF0000", "data":{ "first": { "value":"恭喜你購買成功!", "color":"#173177" }, "keynote1":{ "value":"巧克力", "color":"#173177" }, "keynote2": { "value":"39.8元", "color":"#173177" }, "keynote3": { "value":"2014年9月16日", "color":"#173177" }, "remark":{ "value":"歡迎再次購買!", "color":"#173177" } } }
根據上面的JSON參數,我們可以看到,有部分是模板消息公共的部分,有部分則是模板消息的具體參數,這些參數需要根據不同的模板進行不同的賦值。
如這部分是共同的:
touser":"OPENID", "template_id":"ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY", "url":"http://weixin.qq.com/download", "topcolor":"#FF0000",
根據這個特點,我們定義發送模板消息的接口如下所示:
/// <summary> /// 模板消息僅用於公眾號向用戶發送重要的服務通知,只能用於符合其要求的服務場景中,如信用卡刷卡通知,商品購買成功通知等。 /// 不支持廣告等營銷類消息以及其它所有可能對用戶造成騷擾的消息。 /// </summary> /// <param name="accessToken">訪問憑證</param> /// <param name="openId">賬號的openID</param> /// <param name="templateId">在公眾平台線上模板庫中選用模板獲得ID</param> /// <param name="data">模板的變化參數數據</param> /// <param name="url">,URL置空,則在發送後,點擊模板消息會進入一個空白頁面(ios),或無法點擊(android)。</param> /// <param name="topcolor">頂部顏色,默認為#173177</param> /// <returns></returns> SendMassMessageResult SendTemplateMessage(string accessToken, string openId, string templateId, object data, string url, string topcolor = "#173177");
我們用object data來定義模板的變化參數數據。
具體的實現還是和前面的方法提交數據處理差不多,代碼如下所示。
/// <summary> /// 模板消息僅用於公眾號向用戶發送重要的服務通知,只能用於符合其要求的服務場景中,如信用卡刷卡通知,商品購買成功通知等。 /// 不支持廣告等營銷類消息以及其它所有可能對用戶造成騷擾的消息。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="accessToken">訪問憑證</param> /// <param name="openId"></param> /// <param name="templateId">在公眾平台線上模板庫中選用模板獲得ID</param> /// <param name="data"></param> /// <param name="url">,URL置空,則在發送後,點擊模板消息會進入一個空白頁面(ios),或無法點擊(android)。</param> /// <param name="topcolor"></param> /// <returns></returns> public SendMassMessageResult SendTemplateMessage(string accessToken, string openId, string templateId, object data, string url, string topcolor = "#173177") { var postUrl = string.Format("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token={0}", accessToken); var msgData = new TemplateData() { touser = openId, template_id = templateId, topcolor = topcolor, url = url, data = data }; string postData = msgData.ToJson(); SendMassMessageResult result = JsonHelper<SendMassMessageResult>.ConvertJson(postUrl, postData); return result; }
發送模板的消息相對其他兩個接口的使用復雜一些,例如我以一個會員通知的模板消息為例,模板的詳細情況如下:
具體的測試代碼如下所示。
#region 發送模板消息 var data = new { //使用TemplateDataItem簡單創建數據。 first = new TemplateDataItem("您好,您已成為微信【廣州愛奇迪】會員。"), type = new TemplateDataItem("18620292076"), address = new TemplateDataItem("廣州市白雲區廣州大道北"), VIPName = new { //使用new 方式,構建數據,包括value, color兩個固定屬性。 value = "伍華聰", color = "#173177" }, VIPPhone = new TemplateDataItem("18620292076"), expDate = new TemplateDataItem("2016年4月18日"), remark = new TemplateDataItem("如有疑問,請咨詢18620292076。", "#173177"), }; #endregion string url = "http://www.iqidi.com"; string topColor = "#173177"; string templateId = "-5LbClAa9KUlEmr5bCSS0rxU_I2iT16iYBDxCVU1iJg"; SendMassMessageResult sendResult = api.SendTemplateMessage(token, openId, templateId, data, url, topColor); if(sendResult != null) { Console.WriteLine(sendResult.msg_id); }
那麼我們得到的提示效果如下所示。
微信模板消息,能夠讓我們與客戶之間溝通不受每月幾條數量的限制,同時也能夠利用微信模板庫豐富的內容,實現強大的應用場景。
如果對這個《C#開發微信門戶及應用》系列感興趣,可以關注我的其他文章,系列隨筆如下所示:
C#開發微信門戶及應用(26)-公眾號微信素材管理
C#開發微信門戶及應用(25)-微信企業號的客戶端管理功能
C#開發微信門戶及應用(24)-微信小店貨架信息管理
C#開發微信門戶及應用(23)-微信小店商品管理接口的封裝和測試
C#開發微信門戶及應用(22)-微信小店的開發和使用
C#開發微信門戶及應用(21)-微信企業號的消息和事件的接收處理及解密
C#開發微信門戶及應用(20)-微信企業號的菜單管理
C#開發微信門戶及應用(19)-微信企業號的消息發送(文本、圖片、文件、語音、視頻、圖文消息等)
C#開發微信門戶及應用(18)-微信企業號的通訊錄管理開發之成員管理
C#開發微信門戶及應用(17)-微信企業號的通訊錄管理開發之部門管理
C#開發微信門戶及應用(16)-微信企業號的配置和使用
C#開發微信門戶及應用(15)-微信菜單增加掃一掃、發圖片、發地理位置功能
C#開發微信門戶及應用(14)-在微信菜單中采用重定向獲取用戶數據
C#開發微信門戶及應用(13)-使用地理位置擴展相關應用
C#開發微信門戶及應用(12)-使用語音處理
C#開發微信門戶及應用(11)--微信菜單的多種表現方式介紹
C#開發微信門戶及應用(10)--在管理系統中同步微信用戶分組信息
C#開發微信門戶及應用(9)-微信門戶菜單管理及提交到微信服務器
C#開發微信門戶及應用(8)-微信門戶應用管理系統功能介紹
C#開發微信門戶及應用(7)-微信多客服功能及開發集成
C#開發微信門戶及應用(6)--微信門戶菜單的管理操作
C#開發微信門戶及應用(5)--用戶分組信息管理
C#開發微信門戶及應用(4)--關注用戶列表及詳細信息管理
C#開發微信門戶及應用(3)--文本消息和圖文消息的應答
C#開發微信門戶及應用(2)--微信消息的處理和應答
C#開發微信門戶及應用(1)--開始使用微信接口