C#開發微信門戶及應用(9)-微信門戶菜單管理及提交到微信服務器

微信公衆號(包括服務號和訂閱號)均可以對菜單進行自定義設置,咱們爲了方便管理,通常先把菜單數據在本地管理維護,須要更新的時候,把它們更新到微信服務器上就能夠了。本文基於這個方式,介紹個人微信門戶平臺管理系統中菜單提交到微信服務器上的操做。微信門戶應用管理系統,採用基於MVC+EasyUI的路線,因爲多數域名服務器上都只能支持.NET4.0,因此以MVC3,C#4.0做爲開發基礎,基本上可以部署在任何.NET服務器上。html

一、微信菜單的要求及相關界面設計

微信公衆號的菜單咱們能夠經過網站進行本地的管理,維護好它們之間的層級關係,因爲微信對自定義的菜單要求比較嚴格,如下是微信對自定義菜單的要求:ajax

目前自定義菜單最多包括3個一級菜單,每一個一級菜單最多包含5個二級菜單。一級菜單最多4個漢字,二級菜單最多7個漢字,多出來的部分將會以「...」代替。數據庫

所以咱們本身根據約定,不要越界便可,不然提交菜單到服務器,可能會返回一些錯誤,這些細節,咱們在建立本地菜單管理的時候,注意一下就能夠了。我在早期的一篇文章也介紹了自定義菜單的一些內容,須要能夠進行回顧一下《C#開發微信門戶及應用(6)--微信門戶菜單的管理操做》,本篇主要是介紹在個人平臺管理系統裏面,調用前面介紹的菜單接口API,實現菜單提交到服務器的操做。json

根據微信的自定義菜單要求,我在管理系統裏面,對微信的菜單幾個基礎性的界面設計以下。緩存

主菜單管理界面以下所示。服務器

添加菜單的界面設計以下所示微信

微信菜單的修改界面以下所示函數

微信菜單定義是存儲在數據庫裏面,若是須要提交到微信服務器上並生效,則須要調用微信API接口進行處理,我在頁面的Controller控制器裏增長一個提交到服務器的處理方法。post

 

二、提交菜單到微信服務器的操做

上面幾個界面,主要就是根據微信菜單的屬性,對菜單進行維護管理,咱們最終的目的是把它們放到服務器上去,供咱們處理客戶的相關事件操做的。測試

提交菜單的操做,咱們在MVC的View頁面裏面,使用JQuery的Ajax提交便可(前提是咱們在控制器裏面添加相應的處理,後面介紹),界面腳本代碼以下所示。

        //綁定提交按鈕的的點擊事件
        function BindSubmitEvent() {
            $("#btnSubmit").click(function () {
                $.messager.confirm("提交菜單確認", "您確認須要提交菜單到微信服務器嗎?", function (action) {
                    if (action) {
                        //提交數據
                        $.ajax({
                            url: '/Menu/UpdateWeixinMenu',
                            type: 'post',
                            dataType: 'json',
                            success: function (data) {
                                if (data.Success) {
                                    $.messager.alert("提示", "提交微信菜單成功");
                                }
                                else {
                                    $.messager.alert("提示", "提交微信菜單失敗:" + data.ErrorMessage);
                                }
                            },
                            data: ''
                        });
                    }
                });
            });
        }

上面紅色的代碼,就是咱們在MVC的控制器裏面定義的方法,咱們只須要經過POST方法,對控制器方法調用,就能實現菜單提交到微信服務器上,至於具體裏面的細節,咱們能夠把它挪到控制器或者更底層進行處理就是了,頁面不須要涉及太多的邏輯就是了。

上面那個Menu控制器的UpdateWeixinMenu的方法代碼以下所示(主要就是根據我前面介紹過的開發模型進行處理就是了)。

        /// <summary>
        ///更新微信菜單
        /// </summary>
        /// <returns></returns>
        public ActionResult UpdateWeixinMenu()
        {
            string token = base.GetAccessToken();
            MenuListJson menuJson = GetWeixinMenu();

            IMenuApi menuApi = new MenuApi();
            CommonResult result = menuApi.CreateMenu(token, menuJson);
            return ToJsonContent(result);
        }

上面的幾個方法這裏逐一介紹一下。GetAccessToken主要就是得到當前操做的訪問令牌,這裏的操做能夠用緩存進行緩存,不然頻繁的獲取AccessToken,達到天天指定的次數後,當天就不能再用了。

GetWeixinMenu方法,主要就是爲了方便,對獲取構造微信的自定義菜單數據進行了一個函數封裝,具體代碼以下所示。

       /// <summary>
        /// 生成微信菜單的Json數據
        /// </summary>
        /// <returns></returns>
        private MenuListJson GetWeixinMenu()
        {
            MenuListJson menuJson = new MenuListJson();

            List<MenuNodeInfo> menuList = BLLFactory<Menu>.Instance.GetTree();
            foreach (MenuNodeInfo info in menuList)
            {
                ButtonType type = (info.Type == "click") ? ButtonType.click : ButtonType.view;
                string value = (type == ButtonType.click) ? info.Key : info.Url;

                MenuJson weiInfo = new MenuJson(info.Name, type, value);
                AddSubMenuButton(weiInfo, info.Children);

                menuJson.button.Add(weiInfo);
            }
            return menuJson;
        }

 

        private void AddSubMenuButton(MenuJson menu, List<MenuNodeInfo> menuList)
        {
            if (menuList.Count > 0)
            {
                menu.sub_button = new List<MenuJson>();
            }
            foreach (MenuNodeInfo info in menuList)
            {
                ButtonType type = (info.Type == "click") ? ButtonType.click : ButtonType.view;
                string value = (type == ButtonType.click) ? info.Key : info.Url;

                MenuJson weiInfo = new MenuJson(info.Name, type, value);
                menu.sub_button.Add(weiInfo);

                AddSubMenuButton(weiInfo, info.Children);
            }
        }

 

上面的代碼,就是把本地存儲的MenuNodeInfo數據,經過遞歸遍歷的方式,轉換爲微信的自定義菜單實體MenuJson,這樣咱們調用API就很是方便了,這個函數主要負責構造對應的實體信息就是了。至於調用微信API提交菜單的事情,仍是讓API本身親自處理爲好,他們的代碼以下所示(也就是上面函數的部分代碼)。

        IMenuApi menuApi = new MenuApi();
        CommonResult result = menuApi.CreateMenu(token, menuJson);
        return ToJsonContent(result);

最終的結果是返回一個通用的結果CommonResult,這個結果對象,很是方便腳本的處理,若是有錯誤,則提示錯誤,不然也方便判斷布爾值,也就是上面的頁面代碼腳本。

success: function (data) {
        if (data.Success) {
                  $.messager.alert("提示", "提交微信菜單成功");
           }
          else {
                    $.messager.alert("提示", "提交微信菜單失敗:" + data.ErrorMessage);
            }
       },

經過以上幾部分的代碼,咱們就能夠實現前臺MVC的視圖界面,調用後臺封裝好的微信API,實現菜單的提交處理了。

若是感興趣或者體驗相關的客服應答功能,能夠關注個人微信瞭解下。具體效果能夠關注個人微信門戶:廣州愛奇迪,也能夠掃描下面二維碼進行關注瞭解。

 

若是對這個系列感興趣,能夠關注個人其餘文章,系列隨筆以下所示:

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)--開始使用微信接口

相關文章
相關標籤/搜索