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

时间: 2025-01-05 06:08:19

C#-MVC开发微信应用(8)--菜单管理的实现的相关文章

C#开发微信门户及应用(20)-微信企业号的菜单管理

C#开发微信门户及应用(20)-微信企业号的菜单管理 前面几篇陆续介绍了很多微信企业号的相关操作,企业号和公众号一样都可以自定义菜单,因此他们也可以通过API进行菜单的创建.获取列表.删除的操作,因此本篇继续探讨这个主体,介绍企业号的菜单管理操作. 菜单在很多情况下,能够给我们提供一个快速入口,也可以用来获取用户信息的主要入口,通过OAuth2验证接口,以及自定义的重定向菜单,我们就可以获取对应的用户ID,然后进一步获取到用户的相关数据,可以显示给客户. 1.菜单的总体介绍 菜单的事件处理如下所

C#-MVC开发微信应用(7)--在管理系统中同步微信用户分组信息

在前面几篇文章中,逐步从原有微信的API封装的基础上过渡到微信应用平台管理系统里面,逐步介绍管理系统中的微信数据的界面设计,以及相关的处理操作过程的逻辑和代码.希望从一个更高的层次介绍微信的开发. 在<C#-MVC开发微信应用(6)--用户分组信息管理>具体介绍了微信用户分组接口的实现方法,本篇将介绍,如何在我的平台软件上进行管理我们微信上的用户分组. 其实微信能够风风火火的原因,主要就是因为有用户信息,所以同步并管理好微信账号的关注用户数据是非常重要的.有了微信用户的数据,你可以和你任何应用

C#-MVC开发微信应用(2)--开始使用微信接口

微信应用使用场景和商机很多,所以这也是一个技术的方向,因此,有空研究下.学习下微信的相关开发,也就成为SNF完善的必要条件了.本系列文章希望从一个循序渐进的角度上,全面介绍微信的相关开发过程和相关经验总结,希望给大家了解一下相关的开发历程.本篇随笔主要基于上一篇<C#-MVC开发微信应用(1)--开始使用微信接口>的基础上进行深入的介绍,介绍微信消息的处理和应答的过程. 1.微信的消息应答交互 我们知道,微信的服务器架起了客户手机和开发者服务器的一个桥梁,通过消息的传递和响应,实现了与用户的交

C#-MVC开发微信应用(3)--文本消息和图文消息的应答

最近咨询微信的人很多,感觉这块也是一块商机,也为了演示SNF快速开发平台的优势,就用SNF快速开发平台开发出一套微信应用程序.使用<SNF.CodeGenerator>代码生成工具可以节省大量时间. 在前面两篇两篇随笔<C#-MVC开发微信应用(1)--开始使用微信接口>和<C#-MVC开发微信应用(2)--开始使用微信接口>里面,大致介绍了我微信应用的框架构建,本随笔继续介绍这一主题,介绍消息应答里面的文本应答和图文应答的过程. 我们知道,给手机用户发送响应消息,它可

C#-MVC开发微信应用(4)--微信门户菜单的管理操作

最近对微信接口进行深入的研究,通过把底层接口一步步进行封装后,逐步升级到自动化配置.自动化应答,以及后台处理界面的优化和完善上,力求搭建一个较为完善.适用的微信门户应用管理系统. 在微信门户系统里面,实现下面这些功能操作: 1)实现菜单的动态配置及更新到服务器上: 2)动态定义事件和响应消息,实现对不同行业,不同需求的菜单动作响应: 3)动态的应答指令配置处理,实现整套应答链的消息处理: 4)获取订阅用户和用户分组信息,并可以实现用户分组信息的维护等操作: 5)管理并更新多媒体文件.图文消息等内

ASP.NET MVC开发微信(一)

public string index(string echostr) { return echostr; }

ASP.NET MVC开发微信(二)

C#开发微信门户及应用(27)-公众号模板消息管理

通过模板消息接口,公众号能向关注其账号的用户发送预设模板的消息.模板消息仅用于公众号向用户发送重要的服务通知,只能用于符合其要求的服务场景中,如信用卡刷卡通知,商品购买成功通知等.不支持广告等营销类消息以及其它所有可能对用户造成骚扰的消息.本文主要介绍基于C#开发实现公众号模板消息的管理功能. “模板消息功能的推出,将极大地增强服务号的服务通知能力”,在一些一直期待微信模板消息功能开放的公众号运营者看来,微信一对一沟通的社交属性,让信息推送的触达率更加精准,这也让企业在成本.服务效率.性能上有了

C#开发微信门户及应用(25)-微信企业号的客户端管理功能

我们知道,微信公众号和企业号都提供了一个官方的Web后台,方便我们对微信账号的配置,以及相关数据的管理功能,对于微信企业号来说,有通讯录中的组织架构管理.标签管理.人员管理.以及消息的发送等功能,其中微信企业号的组织架构和标签可以添加相应的人员,消息发送可以包含文本.图片.语音.视频.图文.文件等内容.对于企业号来说,官方的接口几乎可以无限的发送消息,因此构建一个管理后台,管理企业号的人员,以及用来给企业成员发送消息就是一个很好的功能亮点,有时候可以提高我们企业内部的消息通讯效率和日常工作管理效