千家信息网

C#开发微信之微信门户菜单管理操作的示例分析

发表于:2025-01-16 作者:千家信息网编辑
千家信息网最后更新 2025年01月16日,这篇文章给大家分享的是有关C#开发微信之微信门户菜单管理操作的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1、菜单的基础信息微信门户的菜单,一般服务号和订阅号都可
千家信息网最后更新 2025年01月16日C#开发微信之微信门户菜单管理操作的示例分析

这篇文章给大家分享的是有关C#开发微信之微信门户菜单管理操作的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

1、菜单的基础信息

微信门户的菜单,一般服务号和订阅号都可以拥有这个模块的开发,但是订阅号好像需要认证后才能拥有,而服务号则不需要认证就可以拥有了。这个菜单可以有编辑模式和开发模式,编辑模式主要就是在微信门户的平台上,对菜单进行编辑;而开发模式,就是用户可以通过调用微信的API对菜单进行定制开发,通过POST数据到微信服务器,从而生成对应的菜单内容。本文主要介绍基于开发模式的菜单管理操作。

自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以"..."代替。目前自定义菜单接口可实现两种类型按钮,如下:

click:用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event    的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;view:用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值    (即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。

菜单提交的数据,本身是一个Json的数据字符串,它的官方例子数据如下所示。

 {     "button":[     {              "type":"click",          "name":"今日歌曲",          "key":"V1001_TODAY_MUSIC"      },      {           "type":"click",           "name":"歌手简介",           "key":"V1001_TODAY_SINGER"      },      {           "name":"菜单",           "sub_button":[           {                   "type":"view",               "name":"搜索",               "url":"http://www.soso.com/"            },            {               "type":"view",               "name":"视频",               "url":"http://v.qq.com/"            },            {               "type":"click",               "name":"赞一下我们",               "key":"V1001_GOOD"            }]       }] }

从上面我们可以看到,菜单不同的type类型,有不同的字段内容,如type为view的有url属性,而type为click的,则有key属性。而菜单可以有子菜单sub_button属性,总得来说,为了构造好对应的菜单实体类信息,不是一下就能分析的出来。

2、菜单的实体类定义

我看过一些微信接口的开发代码,把菜单的分为了好多个实体类,指定了继承关系,然后分别对他们进行属性的配置,大概的关系如下所示。

这种多层关系的继承方式能解决问题,不过我觉得并不是优雅的解决方案。其实结合Json.NET自身的Attribute属性配置,可以指定那些为空的内容在序列号为Json字符串的时候,不显示出来的。

[JsonProperty( NullValueHandling = NullValueHandling.Ignore)]

有了这个属性,我们就可以统一定义菜单的实体类信息更多的属性了,可以把View类型和Click类型的菜单属性的url和key合并在一起。

    ///     /// 菜单基本信息    ///     public class MenuInfo    {        ///         /// 按钮描述,既按钮名字,不超过16个字节,子菜单不超过40个字节        ///         public string name { get; set; }        ///         /// 按钮类型(click或view)        ///         [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]        public string type { get; set; }        ///         /// 按钮KEY值,用于消息接口(event类型)推送,不超过128字节        ///         [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]        public string key { get; set; }        ///         /// 网页链接,用户点击按钮可打开链接,不超过256字节        ///         [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]        public string url { get; set; }        ///         /// 子按钮数组,按钮个数应为2~5个        ///         [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]        public List sub_button { get; set; }.......

但是,这么多信息,不同的类型我需要指定不同的属性类型,那不是挺麻烦,万一我在View类型的菜单里面,把key属性设置了,那怎么办?

解决方法就是我们定义几个构造函数,分别用来构造不同的菜单信息,如下所示是对菜单不同的类型,赋值给不同的属性的构造函数。

        ///         /// 参数化构造函数        ///         /// 按钮名称        /// 菜单按钮类型        /// 按钮的键值(Click),或者连接URL(View)        public MenuInfo(string name, ButtonType buttonType, string value)        {            this.name = name;            this.type = buttonType.ToString();            if (buttonType == ButtonType.click)            {                this.key = value;            }            else if(buttonType == ButtonType.view)            {                this.url = value;            }        }

好了,还有另外一个问题,子菜单也就是属性sub_button是可有可无的东西,有的话,需要指定Name属性,并添加它的sub_button集合对象就可以了,那么我们在增加一个构造子菜单的对象信息的构造函数。

        ///         /// 参数化构造函数,用于构造子菜单        ///         /// 按钮名称        /// 子菜单集合        public MenuInfo(string name, IEnumerable sub_button)        {            this.name = name;            this.sub_button = new List();            this.sub_button.AddRange(sub_button);        }

由于只指定Name和sub_button的属性内容,其他内容为null的话,自然构造出来的Json就没有包含它们,非常完美!

为了获取菜单的信息,我们还需要定义两个实体对象,如下所示。

    ///     /// 菜单的Json字符串对象    ///     public class MenuJson    {        public List button { get; set; }        public MenuJson()        {            button = new List();        }    }    ///     /// 菜单列表的Json对象    ///     public class MenuListJson    {        public MenuJson menu { get; set; }    }

3、菜单管理操作的接口实现

我们从微信的定义里面,可以看到,我们通过API可以获取菜单信息、创建菜单、删除菜单,那么我们来定义它们的接口如下。

    ///     /// 菜单的相关操作    ///     public interface IMenuApi    {                      ///         /// 获取菜单数据        ///         /// 调用接口凭证        ///         MenuJson GetMenu(string accessToken);                               ///         /// 创建菜单        ///         /// 调用接口凭证        /// 菜单对象        ///         CommonResult CreateMenu(string accessToken, MenuJson menuJson);                               ///         /// 删除菜单        ///         /// 调用接口凭证        ///         CommonResult DeleteMenu(string accessToken);    }

具体的获取菜单信息的实现如下。

        ///         /// 获取菜单数据        ///         /// 调用接口凭证        ///         public MenuJson GetMenu(string accessToken)        {            MenuJson menu = null;            var url = string.Format("http://www.php.cn/{0}", accessToken);            MenuListJson list = JsonHelper.ConvertJson(url);            if (list != null)            {                menu = list.menu;            }            return menu;        }

这里就是把返回的Json数据,统一转换为我们需要的实体信息了,一步到位。

调用代码如下所示。

        private void btnGetMenuJson_Click(object sender, EventArgs e)        {            IMenuApi menuBLL = new MenuApi();            MenuJson menu = menuBLL.GetMenu(token);            if (menu != null)            {                Console.WriteLine(menu.ToJson());            }        }

创建和删除菜单对象的操作实现如下所示。

        ///         /// 创建菜单        ///         /// 调用接口凭证        /// 菜单对象        ///         public CommonResult CreateMenu(string accessToken, MenuJson menuJson)        {            var url = string.Format("http://www.php.cn/{0}", accessToken);            string postData = menuJson.ToJson();            return Helper.GetExecuteResult(url, postData);        }                        ///         /// 删除菜单        ///         /// 调用接口凭证        ///         public CommonResult DeleteMenu(string accessToken)        {            var url = string.Format("http://www.php.cn/{0}", accessToken);            return Helper.GetExecuteResult(url);        }

看到这里,有些人可能会问,实体类你简化了,那么创建菜单是不是挺麻烦的,特别是构造对应的信息应该如何操作呢?前面不是介绍了不同的构造函数了吗,通过他们简单就搞定了,不用记下太多的实体类及它们的继承关系来处理菜单信息。

        private void btnCreateMenu_Click(object sender, EventArgs e)        {                                   MenuInfo productInfo = new MenuInfo("软件产品", new MenuInfo[] {                 new MenuInfo("病人资料管理系统", ButtonType.click, "patient"),                 new MenuInfo("客户关系管理系统", ButtonType.click, "crm"),                 new MenuInfo("酒店管理系统", ButtonType.click, "hotel"),                 new MenuInfo("送水管理系统", ButtonType.click, "water")            });                                                MenuInfo frameworkInfo = new MenuInfo("框架产品", new MenuInfo[] {                 new MenuInfo("Win开发框架", ButtonType.click, "win"),                new MenuInfo("WCF开发框架", ButtonType.click, "wcf"),                new MenuInfo("混合式框架", ButtonType.click, "mix"),                 new MenuInfo("Web开发框架", ButtonType.click, "web"),                new MenuInfo("代码生成工具", ButtonType.click, "database2sharp")            });            MenuInfo relatedInfo = new MenuInfo("相关链接", new MenuInfo[] {                 new MenuInfo("公司介绍", ButtonType.click, "Event_Company"),                new MenuInfo("官方网站", ButtonType.view, "http://www.php.cn/"),                new MenuInfo("提点建议", ButtonType.click, "Event_Suggestion"),                new MenuInfo("联系客服", ButtonType.click, "Event_Contact"),                new MenuInfo("发邮件", ButtonType.view, "http://www.php.cn/")            });            MenuJson menuJson = new MenuJson();            menuJson.button.AddRange(new MenuInfo[] { productInfo, frameworkInfo, relatedInfo });            //Console.WriteLine(menuJson.ToJson());            if (MessageUtil.ShowYesNoAndWarning("您确认要创建菜单吗") == System.Windows.Forms.DialogResult.Yes)            {                IMenuApi menuBLL = new MenuApi();                CommonResult result = menuBLL.CreateMenu(token, menuJson);                Console.WriteLine("创建菜单:" + (result.Success ? "成功" : "失败:" + result.ErrorMessage));            }        }

感谢各位的阅读!关于"C#开发微信之微信门户菜单管理操作的示例分析"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

菜单 按钮 属性 接口 类型 信息 开发 不同 实体 对象 用户 管理 内容 数据 凭证 函数 框架 模式 门户 字节 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 云免流服务器配置要求 宇信科技中国互联网排名 软件开发企业保密承诺书签订 江阴个体执照代办网络技术工作室 做网站没服务器 数据库装在u盘里 云南互联网养老软件开发 oracle数据库修改地址 云南智能服务器虚拟主机 云南省公安厅网络安全总队吴 北京联想服务器维修维保哪家好 数据库技术公开课教案 perl 生物数据库 基础设施包括网络安全 云南ai边缘计算服务器云主机 汉南好的软件开发方案 北京互联网科技有限公司名录 大数据软件开发学校在哪里 58软件开发培训后就业 网络安全线上课堂心得体会 实用数据库技术习题册 腾讯地图省份数据库 网络技术和安全哪一块工资高 北京联想服务器维修维保哪家好 浪潮服务器指示灯闪绿色开不了机 数据库中多值函数依赖 天津数据软件开发设施品质保障 医院社会评价数据库管理职责 全国青少年网络安全守则 数据库中特殊的集合运算有
0