之前講解了微信后台管理頁面的操作來管理菜單,下面我們在簡單的來看一下,代碼是如何實現的。
我們要實現獲取微信的菜單、創建菜單、刪除菜單等操作。
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
如果覺得還不錯,歡迎轉載。
C#-MVC開發微信應用(7)--在管理系統中同步微信用戶分組信息
C#-MVC開發微信應用(5)--自動應答系統-自動回復機器人