微信公衆號開發:自定義菜單

前言:html

      回顧以前的微信公衆號配置消息處理的內容,咱們已經掌握瞭如何配置服務器與微信公衆號創建鏈接,也掌握了經過消息管理的方式,對用戶的信息進行處理,完成公衆號消息回覆功能,實現公衆號與用戶之間的完整對話。而在本文將針對自定義菜單作簡單的開發應用,微信公衆平臺具備自定義菜單的功能。開發者可利用該功能爲公衆帳號的會話界面底部增長自定義菜單,用戶點擊菜單中的選項,能夠調出相應的回覆信息或網頁連接。自定義菜單接口將爲公衆帳號的信息展現空間提供更多可能性。前端

說明
數據庫

  一、自定義菜單最多包括3個一級菜單,每一個一級菜單最多包含5個二級菜單。
  二、一級菜單最多4個漢字,二級菜單最多7個漢字,多出來的部分將會以「...」代替。
  三、建立自定義菜單後,菜單的刷新策略是,在用戶進入公衆號會話頁或公衆號profile頁時,若是發現上一次拉取菜單的請求在5分鐘之前,就會拉取一下菜單,若是菜單有更新,就會刷新客戶端的菜單。測試時能夠嘗試取消關注公衆帳號後再次關注,則能夠看到建立後的效果。
json

類型:api

      自定義菜單接口可實現多種類型按鈕,以下:服務器

  一、click:點擊推事件用戶點擊click類型按鈕後,微信服務器會經過消息接口推送消息類型爲event的結構給開發者(參考消息接口指南),而且帶上按鈕中開發者填寫的key值,開發者能夠經過自定義的key值與用戶進行交互;
  二、view:跳轉URL用戶點擊view類型按鈕後,微信客戶端將會打開開發者在按鈕中填寫的網頁URL,可與網頁受權獲取用戶基本信息接口結合,得到用戶基本信息。
  三、scancode_push:掃碼推事件用戶點擊按鈕後,微信客戶端將調起掃一掃工具,完成掃碼操做後顯示掃描結果(若是是URL,將進入URL),且會將掃碼的結果傳給開發者,開發者能夠下發消息。
  四、scancode_waitmsg:掃碼推事件且彈出「消息接收中」提示框用戶點擊按鈕後,微信客戶端將調起掃一掃工具,完成掃碼操做後,將掃碼的結果傳給開發者,同時收起掃一掃工具,而後彈出「消息接收中」提示框,隨後可能會收到開發者下發的消息。
  五、pic_sysphoto:彈出系統拍照發圖用戶點擊按鈕後,微信客戶端將調起系統相機,完成拍照操做後,會將拍攝的相片發送給開發者,並推送事件給開發者,同時收起系統相機,隨後可能會收到開發者下發的消息。
  六、pic_photo_or_album:彈出拍照或者相冊發圖用戶點擊按鈕後,微信客戶端將彈出選擇器供用戶選擇「拍照」或者「從手機相冊選擇」。用戶選擇後即走其餘兩種流程。
  七、pic_weixin:彈出微信相冊發圖器用戶點擊按鈕後,微信客戶端將調起微信相冊,完成選擇操做後,將選擇的相片發送給開發者的服務器,並推送事件給開發者,同時收起相冊,隨後可能會收到開發者下發的消息。
  八、location_select:彈出地理位置選擇器用戶點擊按鈕後,微信客戶端將調起地理位置選擇工具,完成選擇操做後,將選擇的地理位置發送給開發者的服務器,同時收起位置選擇工具,隨後可能會收到開發者下發的消息。
  九、media_id:下發消息(除文本消息)用戶點擊media_id類型按鈕後,微信服務器會將開發者填寫的永久素材id對應的素材下發給用戶,永久素材類型能夠是圖片、音頻、視頻、圖文消息。請注意:永久素材id必須是在「素材管理/新增永久素材」接口上傳後得到的合法id。
  十、view_limited:跳轉圖文消息URL用戶點擊view_limited類型按鈕後,微信客戶端將打開開發者在按鈕中填寫的永久素材id對應的圖文消息URL,永久素材類型只支持圖文消息。請注意:永久素材id必須是在「素材管理/新增永久素材」接口上傳後得到的合法id。
微信

 資源app

  一、藉助Senparc.Weixin SDK
微信公衆平臺

  二、只須要前端和控制器,不須要數據庫
工具

開始:

控制器

      新建一個UserMessageHandler.cs,實現編輯菜單,獲取菜單,刪除菜單

一、編輯(新增)菜單

        /// <summary>
        /// 編輯新增菜單
        /// </summary>
        /// <param name="resultFull">獲取菜單的完整結果</param>
        /// <param name="MenuMatchRule">個性化菜單規則</param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult CreateMenu(GetMenuResultFull resultFull, MenuMatchRule MenuMatchRule)
        {
            // 使用appid 和appsecret 向微信憑證獲取接口請求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 ? "個性化菜單接口" : "普通自定義菜單接口"));
            try
            {
                //從新整理按鈕信息
                WxJsonResult result = null;
                IButtonGroupBase buttonGroup = null;
                if (IsAddCondidional)
                {
                    //個性化接口
                    //微信公衆平臺新增了個性化菜單接口,開發者能夠經過該接口,讓公衆號的不一樣用戶羣體看到不同的自定義菜單
                    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);
            }
        }

二、獲取菜單

        /// <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 = "菜單不存在或驗證失敗!" }, JsonRequestBehavior.AllowGet);
            }
            return Json(result, JsonRequestBehavior.AllowGet);
        }

三、刪除菜單

        /// <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,快速的完成了對普通菜單和個性化菜單的實現。

前端界面

在前端頁面中,咱們能夠將頁面設計爲這種佈局的樣式

請求示例:

{
    "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": "漫畫集",
            "sub_button": [
                {
                    "type": "view",
                    "url": "https://www.cnblogs.com/i3yuan/",
                    "name": "趣味漫畫"
                }
            ]
        },
        {
            "type": "view",
            "url": "",
            "name": "我的中心"
        }
    ]
}

 效果

總結

1.公衆號菜單分爲個性化菜單和普通菜單,普通菜單是關注以後就能夠查看的,而個性化菜單是根據條件才能看到的(條件:用戶標籤、性別、手機操做系統、地區、語言),個性化菜單更好實現靈活的業務運營

2.經過開源項目中的Senparc.Weixin SDK,快速的完成菜單的編輯、獲取、刪除,只需將前端生成的菜單內容轉換爲對應的json格式,後臺獲取內容,實現菜單功能

相關文章
相關標籤/搜索