C#微信公眾號(hào)開(kāi)發(fā)之自定義菜單
前言:
回顧之前的微信公眾號(hào)配置和消息處理的內(nèi)容,我們已經(jīng)掌握了如何配置服務(wù)器與微信公眾號(hào)建立連接,也掌握了通過(guò)消息管理的方式,對(duì)用戶(hù)的信息進(jìn)行處理,完成公眾號(hào)消息回復(fù)功能,實(shí)現(xiàn)公眾號(hào)與用戶(hù)之間的完整對(duì)話。而在本文將針對(duì)自定義菜單做簡(jiǎn)單的開(kāi)發(fā)應(yīng)用,微信公眾平臺(tái)具有自定義菜單的功能。開(kāi)發(fā)者可利用該功能為公眾賬號(hào)的會(huì)話界面底部增加自定義菜單,用戶(hù)點(diǎn)擊菜單中的選項(xiàng),可以調(diào)出相應(yīng)的回復(fù)信息或網(wǎng)頁(yè)鏈接。自定義菜單接口將為公眾賬號(hào)的信息展示空間提供更多可能性。
說(shuō)明:
- 1、自定義菜單最多包括3個(gè)一級(jí)菜單,每個(gè)一級(jí)菜單最多包含5個(gè)二級(jí)菜單。
- 2、一級(jí)菜單最多4個(gè)漢字,二級(jí)菜單最多7個(gè)漢字,多出來(lái)的部分將會(huì)以“...”代替。
- 3、創(chuàng)建自定義菜單后,菜單的刷新策略是,在用戶(hù)進(jìn)入公眾號(hào)會(huì)話頁(yè)或公眾號(hào)profile頁(yè)時(shí),如果發(fā)現(xiàn)上一次拉取菜單的請(qǐng)求在5分鐘以前,就會(huì)拉取一下菜單,如果菜單有更新,就會(huì)刷新客戶(hù)端的菜單。測(cè)試時(shí)可以嘗試取消關(guān)注公眾賬號(hào)后再次關(guān)注,則可以看到創(chuàng)建后的效果。
類(lèi)型:
自定義菜單接口可實(shí)現(xiàn)多種類(lèi)型按鈕,如下:
- 1、click:點(diǎn)擊推事件用戶(hù)點(diǎn)擊click類(lèi)型按鈕后,微信服務(wù)器會(huì)通過(guò)消息接口推送消息類(lèi)型為event的結(jié)構(gòu)給開(kāi)發(fā)者(參考消息接口指南),并且?guī)习粹o中開(kāi)發(fā)者填寫(xiě)的key值,開(kāi)發(fā)者可以通過(guò)自定義的key值與用戶(hù)進(jìn)行交互;
- 2、view:跳轉(zhuǎn)URL用戶(hù)點(diǎn)擊view類(lèi)型按鈕后,微信客戶(hù)端將會(huì)打開(kāi)開(kāi)發(fā)者在按鈕中填寫(xiě)的網(wǎng)頁(yè)URL,可與網(wǎng)頁(yè)授權(quán)獲取用戶(hù)基本信息接口結(jié)合,獲得用戶(hù)基本信息。
- 3、scancode_push:掃碼推事件用戶(hù)點(diǎn)擊按鈕后,微信客戶(hù)端將調(diào)起掃一掃工具,完成掃碼操作后顯示掃描結(jié)果(如果是URL,將進(jìn)入U(xiǎn)RL),且會(huì)將掃碼的結(jié)果傳給開(kāi)發(fā)者,開(kāi)發(fā)者可以下發(fā)消息。
- 4、scancode_waitmsg:掃碼推事件且彈出“消息接收中”提示框用戶(hù)點(diǎn)擊按鈕后,微信客戶(hù)端將調(diào)起掃一掃工具,完成掃碼操作后,將掃碼的結(jié)果傳給開(kāi)發(fā)者,同時(shí)收起掃一掃工具,然后彈出“消息接收中”提示框,隨后可能會(huì)收到開(kāi)發(fā)者下發(fā)的消息。
- 5、pic_sysphoto:彈出系統(tǒng)拍照發(fā)圖用戶(hù)點(diǎn)擊按鈕后,微信客戶(hù)端將調(diào)起系統(tǒng)相機(jī),完成拍照操作后,會(huì)將拍攝的相片發(fā)送給開(kāi)發(fā)者,并推送事件給開(kāi)發(fā)者,同時(shí)收起系統(tǒng)相機(jī),隨后可能會(huì)收到開(kāi)發(fā)者下發(fā)的消息。
- 6、pic_photo_or_album:彈出拍照或者相冊(cè)發(fā)圖用戶(hù)點(diǎn)擊按鈕后,微信客戶(hù)端將彈出選擇器供用戶(hù)選擇“拍照”或者“從手機(jī)相冊(cè)選擇”。用戶(hù)選擇后即走其他兩種流程。
- 7、pic_weixin:彈出微信相冊(cè)發(fā)圖器用戶(hù)點(diǎn)擊按鈕后,微信客戶(hù)端將調(diào)起微信相冊(cè),完成選擇操作后,將選擇的相片發(fā)送給開(kāi)發(fā)者的服務(wù)器,并推送事件給開(kāi)發(fā)者,同時(shí)收起相冊(cè),隨后可能會(huì)收到開(kāi)發(fā)者下發(fā)的消息。
- 8、location_select:彈出地理位置選擇器用戶(hù)點(diǎn)擊按鈕后,微信客戶(hù)端將調(diào)起地理位置選擇工具,完成選擇操作后,將選擇的地理位置發(fā)送給開(kāi)發(fā)者的服務(wù)器,同時(shí)收起位置選擇工具,隨后可能會(huì)收到開(kāi)發(fā)者下發(fā)的消息。
- 9、media_id:下發(fā)消息(除文本消息)用戶(hù)點(diǎn)擊media_id類(lèi)型按鈕后,微信服務(wù)器會(huì)將開(kāi)發(fā)者填寫(xiě)的永久素材id對(duì)應(yīng)的素材下發(fā)給用戶(hù),永久素材類(lèi)型可以是圖片、音頻、視頻、圖文消息。請(qǐng)注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳后獲得的合法id。
- 10、view_limited:跳轉(zhuǎn)圖文消息URL用戶(hù)點(diǎn)擊view_limited類(lèi)型按鈕后,微信客戶(hù)端將打開(kāi)開(kāi)發(fā)者在按鈕中填寫(xiě)的永久素材id對(duì)應(yīng)的圖文消息URL,永久素材類(lèi)型只支持圖文消息。請(qǐng)注意:永久素材id必須是在“素材管理/新增永久素材”接口上傳后獲得的合法id。
資源:
- 1、借助Senparc.Weixin SDK
- 2、只需要前端和控制器,不需要數(shù)據(jù)庫(kù)
開(kāi)始:
控制器:
新建一個(gè)UserMessageHandler.cs,實(shí)現(xiàn)編輯菜單,獲取菜單,刪除菜單
1、編輯(新增)菜單
/// <summary> /// 編輯新增菜單 /// </summary> /// <param name="resultFull">獲取菜單的完整結(jié)果</param> /// <param name="MenuMatchRule">個(gè)性化菜單規(guī)則</param> /// <returns></returns> [HttpPost] public ActionResult CreateMenu(GetMenuResultFull resultFull, MenuMatchRule MenuMatchRule) { // 使用appid 和appsecret 向微信憑證獲取接口請(qǐng)求access_token string AccessToken = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(AppId, AppSecret).access_token; //獲取AccessToken值 var IsAddCondidional = MenuMatchRule != null && !MenuMatchRule.CheckAllNull(); var apiName = string.Format("使用接口:{0}。", (IsAddCondidional ? "個(gè)性化菜單接口" : "普通自定義菜單接口")); try { //重新整理按鈕信息 WxJsonResult result = null; IButtonGroupBase buttonGroup = null; if (IsAddCondidional) { //個(gè)性化接口 //微信公眾平臺(tái)新增了個(gè)性化菜單接口,開(kāi)發(fā)者可以通過(guò)該接口,讓公眾號(hào)的不同用戶(hù)群體看到不一樣的自定義菜單 buttonGroup = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetMenuFromJsonResult(resultFull, new ConditionalButtonGroup()).menu; var ConditionalButtonGroup = buttonGroup as ConditionalButtonGroup; ConditionalButtonGroup.matchrule = MenuMatchRule; result = Senparc.Weixin.MP.CommonAPIs.CommonApi.CreateMenuConditional(AccessToken, ConditionalButtonGroup); apiName += string.Format("menuid:{0}。", (result as CreateMenuConditionalResult).menuid); } else { //普通接口 buttonGroup = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetMenuFromJsonResult(resultFull, new ButtonGroup()).menu; result = Senparc.Weixin.MP.CommonAPIs.CommonApi.CreateMenu(AccessToken, buttonGroup); } var json = new { Success = result.errmsg == "ok", Message = "菜單更新成功。" + apiName }; return Json(json); } catch (Exception ex) { var json = new { Success = false, Message = string.Format("更新失?。簕0}。{1}", ex.Message, apiName) }; return Json(json); } }
2、獲取菜單
/// <summary> /// 獲取菜單 /// </summary> /// <returns></returns> public ActionResult GetMenu() { string AccessToken = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(AppId, AppSecret).access_token; //獲取AccessToken值 var result = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetMenu(AccessToken); if (result == null) { return Json(new { error = "菜單不存在或驗(yàn)證失敗!" }, JsonRequestBehavior.AllowGet); } return Json(result, JsonRequestBehavior.AllowGet); }
3、刪除菜單
/// <summary> /// 刪除菜單 /// </summary> /// <returns></returns> public ActionResult DeleteMenu() { try { string AccessToken = Senparc.Weixin.MP.CommonAPIs.CommonApi.GetToken(AppId, AppSecret).access_token; //獲取AccessToken值 var result = Senparc.Weixin.MP.CommonAPIs.CommonApi.DeleteMenu(AccessToken); var json = new { Success = result.errmsg == "ok", Message = result.errmsg }; return Json(json, JsonRequestBehavior.AllowGet); } catch (Exception ex) { var json = new { Success = false, Message = ex.Message }; return Json(json, JsonRequestBehavior.AllowGet); } }
借助Senparc.Weixin SDK,快速的完成了對(duì)普通菜單和個(gè)性化菜單的實(shí)現(xiàn)。
前端界面:
在前端頁(yè)面中,我們可以將頁(yè)面設(shè)計(jì)為這種布局的樣式
請(qǐng)求示例:
{ "button": [ { "name": "灌籃高手", "sub_button": [ { "type": "view", "url": "https://www.cnblogs.com/i3yuan/", "name": "陵南高中" }, { "type": "view", "url": "https://www.cnblogs.com/i3yuan/", "name": "海南高中" }, { "type": "view", "url": "https://www.cnblogs.com/i3yuan/", "name": "湘北高中" } ] }, { "name": "漫畫(huà)集", "sub_button": [ { "type": "view", "url": "https://www.cnblogs.com/i3yuan/", "name": "趣味漫畫(huà)" } ] }, { "type": "view", "url": "", "name": "個(gè)人中心" } ] }
效果:
總結(jié):
1.公眾號(hào)菜單分為個(gè)性化菜單和普通菜單,普通菜單是關(guān)注之后就可以查看的,而個(gè)性化菜單是根據(jù)條件才能看到的(條件:用戶(hù)標(biāo)簽、性別、手機(jī)操作系統(tǒng)、地區(qū)、語(yǔ)言),個(gè)性化菜單更好實(shí)現(xiàn)靈活的業(yè)務(wù)運(yùn)營(yíng)
2.通過(guò)開(kāi)源項(xiàng)目中的Senparc.Weixin SDK,快速的完成菜單的編輯、獲取、刪除,只需將前端生成的菜單內(nèi)容轉(zhuǎn)換為對(duì)應(yīng)的json格式,后臺(tái)獲取內(nèi)容,實(shí)現(xiàn)菜單功能
到此這篇關(guān)于C#微信公眾號(hào)開(kāi)發(fā)之自定義菜單的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- C#微信公眾號(hào)開(kāi)發(fā)之使用MessageHandler簡(jiǎn)化消息處理流程
- C#微信公眾號(hào)開(kāi)發(fā)之用戶(hù)上下文WeixinContext和MessageContext
- C#微信公眾號(hào)開(kāi)發(fā)之消息處理
- C#微信公眾號(hào)開(kāi)發(fā)之服務(wù)器配置
- C#微信公眾號(hào)開(kāi)發(fā) 微信事件交互
- C#微信公眾號(hào)與訂閱號(hào)接口開(kāi)發(fā)示例代碼
- C#微信開(kāi)發(fā)之微信公眾號(hào)標(biāo)簽管理功能
- C#開(kāi)發(fā)微信公眾號(hào)接口開(kāi)發(fā)
- C#微信公眾號(hào)開(kāi)發(fā)之接收事件推送與消息排重的方法
- C#微信公眾號(hào)開(kāi)發(fā)之用戶(hù)管理
相關(guān)文章
C#計(jì)時(shí)器的三種實(shí)現(xiàn)方法
這篇文章主要介紹了C#計(jì)時(shí)器的三種實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10C# 通過(guò) oledb 操作Excel實(shí)例代碼
本篇文章主要介紹了C# 通過(guò) oledb 操作Excel實(shí)例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-06-06c#讀取excel數(shù)據(jù)的兩種方法實(shí)現(xiàn)
這篇文章主要介紹了c#讀取excel數(shù)據(jù)的兩種方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12C# 對(duì)Outlook2010進(jìn)行二次開(kāi)發(fā)的圖文教程
下面小編就為大家分享一篇C# 對(duì)Outlook2010進(jìn)行二次開(kāi)發(fā)的圖文教程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12分享WCF聊天程序--WCFChat實(shí)現(xiàn)代碼
無(wú)意中在一個(gè)國(guó)外的站點(diǎn)下到了一個(gè)利用WCF實(shí)現(xiàn)聊天的程序,作者是:Nikola Paljetak。研究了一下,自己做了測(cè)試和部分修改,感覺(jué)還不錯(cuò),分享給大家2015-11-11C#利用deskew算法實(shí)現(xiàn)圖像文本傾斜校正
這篇文章主要為大家詳細(xì)介紹了C#如何利用deskew算法實(shí)現(xiàn)圖像文本傾斜校正,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2024-01-01C#抓取網(wǎng)頁(yè)數(shù)據(jù) 解析標(biāo)題描述圖片等信息 去除HTML標(biāo)簽
本文主要一步一步介紹利用C#抓取頁(yè)面數(shù)據(jù)的過(guò)程,抓取HTML,獲取標(biāo)題、描述、圖片等信息,并去除HTML,希望對(duì)大家有所幫助。2016-04-04