C#-MVC開發微信應用(8)--菜單管理的實現


之前講解了微信后台管理頁面的操作來管理菜單,下面我們在簡單的來看一下,代碼是如何實現的。

我們要實現獲取微信的菜單、創建菜單、刪除菜單等操作。

01.首先定義菜單操作的接口:

 /// <summary>
    /// 菜單的相關操作
    /// </summary>
    public interface IMenuApi
    {
        /// <summary>
        /// 獲取菜單數據
        /// </summary>
        /// <param name="accessToken">調用接口憑證</param>
        /// <returns></returns>
        MenuJson GetMenu(string accessToken);

        /// <summary>
        /// 創建菜單
        /// </summary>
        /// <param name="accessToken">調用接口憑證</param>
        /// <param name="menuJson">菜單對象</param>
        /// <returns></returns>
        CommonResult CreateMenu(string accessToken, MenuJson menuJson);

        /// <summary>
        /// 刪除菜單
        /// </summary>
        /// <param name="accessToken">調用接口憑證</param>
        /// <returns></returns>
        CommonResult DeleteMenu(string accessToken);
    }

02.實現接口如下:

 /// <summary>
    /// 菜單的相關操作
    /// </summary>
    public class MenuApi : IMenuApi
    {
        #region 獲取菜單數據 GetMenu(string accessToken)
        /// <summary>
        /// 獲取菜單數據
        /// </summary>
        /// <param name="accessToken">調用接口憑證</param>
        /// <returns></returns>
        public MenuJson GetMenu(string accessToken)
        {
            string jsonStr = BasicAPI.RequestGetUrl(string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", accessToken));

            MenuListJson listMenu = JsonConvert.DeserializeObject<MenuListJson>(jsonStr);
            if (listMenu != null)
            {
                return listMenu.menu;
            }
             
            return null;
        }
        #endregion

        #region 創建菜單 CreateMenu(string accessToken, MenuJson menuJson)
        /// <summary>
        /// 創建菜單
        /// </summary>
        /// <param name="accessToken">調用接口憑證</param>
        /// <param name="menuJson">菜單對象</param>
        /// <returns></returns>
        public CommonResult CreateMenu(string accessToken, MenuJson menuJson)
        {
            var url = string.Format("https://api.weixin.qq.com/cgi-bin/menu/create?access_token={0}", accessToken);
            string postData = menuJson.ToJson();  
            return BasicAPI.RequestUrlPostDataResult(url, postData);
        }
        #endregion

        #region 刪除菜單 DeleteMenu(string accessToken)
        /// <summary>
        /// 刪除菜單
        /// </summary>
        /// <param name="accessToken">調用接口憑證</param>
        /// <returns></returns>
        public CommonResult DeleteMenu(string accessToken)
        {
            string jsonStr = BasicAPI.RequestGetUrl(string.Format("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}", accessToken));
            return new CommonResult(jsonStr);
        }
        #endregion
    }

03.還需要定義出菜單對應的實體類

 /// <summary>
    /// 菜單基本信息
    /// </summary>
    public class MenuInfo
    {
        /// <summary>
        /// 參數化構造函數,用於構造子菜單
        /// </summary>
        public MenuInfo()
        {
        }
/// <summary>
        /// 參數化構造函數,用於構造子菜單
        /// </summary>
        /// <param name="name">按鈕名稱</param>
        /// <param name="sub_button">子菜單集合</param>
        public MenuInfo(string name, IEnumerable<MenuInfo> sub_button)
        {
            this.name = name;
            this.sub_button = new List<MenuInfo>();
            this.sub_button.AddRange(sub_button);
        }

        /// <summary>
        /// 參數化構造函數,用於構造子菜單
        /// </summary>
        /// <param name="name">按鈕名稱</param>
        public MenuInfo(string name)
        {
            this.name = name;
            this.sub_button = new List<MenuInfo>(); 
        }

        /// <summary>
        /// 按鈕描述,既按鈕名字,不超過16個字節,子菜單不超過40個字節
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string name { get; set; }

        /// <summary>
        /// 按鈕類型(click或view)
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string type { get; set; }

        /// <summary>
        /// 按鈕KEY值,用於消息接口(event類型)推送,不超過128字節
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string key { get; set; }

        /// <summary>
        /// 網頁鏈接,用戶點擊按鈕可打開鏈接,不超過256字節
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string url { get; set; }

        /// <summary>
        /// 子按鈕數組,按鈕個數應為2~5個
        /// </summary>
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public List<MenuInfo> sub_button { get; set; }

    }

04.還會用到,區分是事件類型的枚舉值

public enum ButtonType
    {
        click, //       
        view   // 
    }

05. 那么如果調用呢

//01.創建菜單
            List<MenuInfo> lis = new List<MenuInfo>();
            lis.Add(new MenuInfo("代碼生成工具", ButtonType.click, "CodeGenerator"));
            lis.Add(new MenuInfo("通用審核流", ButtonType.click, "WorkFlow"));
            lis.Add(new MenuInfo("單據編碼生成器", ButtonType.click, "CodeRule"));

            MenuInfo productInfo2 = new MenuInfo("軟件產品", lis);

            MenuInfo productInfo = new MenuInfo("軟件產品", new MenuInfo[] { 
                new MenuInfo("代碼生成工具", ButtonType.click, "CodeGenerator"),
                new MenuInfo("通用審核流", ButtonType.click, "WorkFlow"),
                new MenuInfo("單據編碼生成器", ButtonType.click, "CodeRule")
            });

            MenuInfo frameworkInfo = new MenuInfo("框架產品", new MenuInfo[] { 
                new MenuInfo("Win開發框架", ButtonType.click, "WinForm"),
                new MenuInfo("Web開發框架", ButtonType.click, "MVC"),
                new MenuInfo("微信開發框架", ButtonType.click, "WeiXin"), 
                new MenuInfo("代碼生成工具", ButtonType.click, "CodeGenerator")
            });

            MenuInfo relatedInfo = new MenuInfo("相關鏈接", new MenuInfo[] { 
                new MenuInfo("公司介紹", ButtonType.click, "Event_Company"),
                new MenuInfo("官方網站", ButtonType.view, "http://www.cnblogs.com/spring_wang"),
                //new MenuInfo("提點建議", ButtonType.click, "Event_Suggestion"),
                new MenuInfo("聯系客服", ButtonType.click, "Event_Contact"),
                new MenuInfo("發郵件", ButtonType.view, "http://mail.qq.com/cgi-bin/qm_share?t=qm_mailme&email=cElAQ0ZDSUBGRzABAV4THx0")
            });

            MenuJson menuJson = new MenuJson();
            menuJson.button.AddRange(new MenuInfo[] { productInfo, frameworkInfo, relatedInfo });

            MenuApi mapi = new MenuApi();

            //測試獲取 acessToken
            //string accessToken = string.Empty;
            //WeiXinUserToNoEntity weixinUser = BasicAPI.GetWeiXinUser(this.UserInfo);
            //dynamic accToken = BasicAPI.GetAccessToken(weixinUser.AppID, weixinUser.Appsecret);
            //if (accToken.access_token != null) {
            //    accessToken = accToken.access_token as string;
            //}

            CommonResult result = mapi.CreateMenu(BasicAPI.GetWeiXinAccessToken(this.UserInfo), menuJson);
            Console.WriteLine("創建菜單:" + (result.Success ? "成功" : "失敗:" + result.ErrorMessage));
            result = mapi.DeleteMenu(BasicAPI.GetWeiXinAccessToken(this.UserInfo));
            Console.WriteLine("刪除菜單:" + (result.Success ? "成功" : "失敗:" + result.ErrorMessage));
06.運行效果如下


作者: 王春天 2016-02-29
作者Blog:http://www.cnblogs.com/spring_wang 出處: http://www.cnblogs.com/spring_wang/p/5074847.html

  如果覺得還不錯,歡迎轉載。

本系列文章列表如下:

基於SNF-快速開發平台框架的系列文章:

C#-MVC開發微信應用(8)--菜單管理的實現

C#-MVC開發微信應用(7)--在管理系統中同步微信用戶分組信息

C#-MVC開發微信應用(6)--用戶分組信息管理

C#-MVC開發微信應用(5)--自動應答系統-自動回復機器人

C#-MVC開發微信應用(4)--微信門戶菜單的管理操作

C#-MVC開發微信應用(3)--文本消息和圖文消息的應答

C#-MVC開發微信應用(2)--微信消息的處理和應答 

C#-MVC開發微信應用(1)--開始使用微信接口

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM