C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器

微信公众号(包括服务号和订阅号)都可以对菜单进行自定义设置,我们为了方便管理,一般先把菜单数据在本地管理维护,需要更新的时候,把它们更新到微信服务器上就可以了。本文基于这个方式,介绍我的微信门户平台管理系统中菜单提交到微信服务器上的操作。微信门户应用管理系统,采用基于MVC+EasyUI的路线,由于多数域名服务器上都只能支持.NET4.0,所以以MVC3,C#4.0作为开发基础,基本上能够部署在任何.NET服务器上。

1、微信菜单的要求及相关界面设计

微信公众号的菜单我们可以通过网站进行本地的管理,维护好它们之间的层级关系,由于微信对自定义的菜单要求比较严格,以下是微信对自定义菜单的要求:

目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。

因此我们自己根据约定,不要越界即可,否则提交菜单到服务器,可能会返回一些错误,这些细节,我们在创建本地菜单管理的时候,注意一下就可以了。我在早期的一篇文章也介绍了自定义菜单的一些内容,需要可以进行回顾一下《C#开发微信门户及应用(6)--微信门户菜单的管理操作》,本篇主要是介绍在我的平台管理系统里面,调用前面介绍的菜单接口API,实现菜单提交到服务器的操作。

根据微信的自定义菜单要求,我在管理系统里面,对微信的菜单几个基础性的界面设计如下。

主菜单管理界面如下所示。

添加菜单的界面设计如下所示

微信菜单的修改界面如下所示

微信菜单定义是存储在数据库里面,如果需要提交到微信服务器上并生效,则需要调用微信API接口进行处理,我在页面的Controller控制器里增加一个提交到服务器的处理方法。

2、提交菜单到微信服务器的操作

上面几个界面,主要就是根据微信菜单的属性,对菜单进行维护管理,我们最终的目的是把它们放到服务器上去,供我们处理客户的相关事件操作的。

提交菜单的操作,我们在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)--开始使用微信接口

本文转自博客园伍华聪的博客,原文链接:C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器,如需转载请自行联系原博主。

时间: 2024-09-21 17:36:08

C#开发微信门户及应用(9)-微信门户菜单管理及提交到微信服务器的相关文章

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

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

推荐 关于html5游戏开发(最好是直接待有游戏引擎)放在腾讯微信开发平台上的书籍

问题描述 推荐 关于html5游戏开发(最好是直接待有游戏引擎)放在腾讯微信开发平台上的书籍 推荐 关于html5游戏开发(最好是直接待有游戏引擎)放在腾讯微信开发平台上的书籍,资料,或者自学的途径.求大神们给指点,小弟感激不禁!

微信公众平台-微信开发,编辑模式下创建的自定义菜单,微信会推送数据包给开发者么?求大神解答,急

问题描述 微信开发,编辑模式下创建的自定义菜单,微信会推送数据包给开发者么?求大神解答,急 微信开发,编辑模式下创建的自定义菜单,微信会推送数据包给开发者么?求大神解答,急 解决方案 编辑模式?开发模式吧..开发模式下发布的新信息也会推送给客户 解决方案二: 编辑模式?开发模式吧..开发模式下发布的新信息也会推送给客户

微信小程序引起热议,但谁还记得企业微信呢?

这几天,微信小程序再次刷爆了朋友圈并收获众多好评,很多人期待着微信小程序将带来一场革命,有人说有了小程序手机上很多APP都能卸载了.难以否认的是,腾讯确实非常擅长产品,张小龙也是顶级的产品经理,但是产品的成功必然是站在战略正确之上的,而微信小程序就是一款战略产品. 但是,我认为目前来看,微信小程序并没有发挥微信的优势,有可能是雷声大雨点小.目前的乐观只是对腾讯产品能力的信任,而可能只是一时新鲜,就像之前也引起热议的企业微信一样. 微信想成为什么样的工具?技术工具 很明显,按照张小龙的说法:"微信

第三方平台也能为未微信认证的订阅号调用自定义菜单接口和素材管理接口

3月20号已认证微信公众号可通过第三方平台管理微信公众平台素材,现在自定义菜单接口和素材管理接口向第三方平台旗下未认证订阅号开放,未认证订阅号也可以授权给第三方平台,让第三方平台开发者帮助实现自定义菜单和素材管理业务.但请注意,为了避免接口安全风险,公众号自身仍旧没有上述接口权限,无法调用这些接口. 未认证订阅号的自定义菜单接口能力,与公众平台官网内能力是相同的,具体如下: 1. 点击菜单后,公众号回复一条消息,支持图文消息.图片.语音.视频类型,不支持文本消息: 2. 点击菜单后,跳转到公众号

微信公众平台将会全面开放“自定义菜单”

摘要: 自面向开发者和第三方平台开放微信内网页开发工具包(JS-SDK),允许接入微信小店.微信支付等多达 11 类的接口集,并且向认证的服务号和订阅号开放公众平台的客服功能,以及帮助 自面向开发者和第三方平台开放微信内网页开发工具包(JS-SDK),允许接入微信小店.微信支付等多达 11 类的接口集,并且向认证的服务号和订阅号开放公众平台的客服功能,以及帮助公众号把客服系统搬到微信上后,微信公众平台进一步放开基础能力,将对所有公众号开放"自定义菜单"功能.平台管理者在后台点击&quo

《微信营销与运营一册通》一一1.2 微信营销无可替代的优势

1.2 微信营销无可替代的优势 微信营销与运营一册通 不少的企业和个人都从微信营销中尝到了不少甜头,微信营销发展前景也非常值得期待,那么相对于一些传统的营销,微信营销又有着哪些优势呢?1.2.1 营销方式多元 微信是一款非常方便的沟通工具,它实现了真正的对话.一对一.一对多.文字.图片和视频的沟通,在手指尖就可以轻松完成.相比传统营销方式,微信营销则更加多元化,尤其是能够使用语音和视频,可以拉近和订阅用户的距离,使营销活动变得更生动.更有趣.更利于营销活动的开展.图1-13所示为齐鲁证券采用的多

微信营销:内容运营的八种风格 时刻关注使用微信的人

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 最近网上有很多关于微信营销的文章,有唱盛的,有唱衰的,我还是那句话,你没听说的没看到过的,并不代表没有发生过,不管别人如何说,我还是会继续把大鸟说微信营销系列文章写完. 另外微信营销是个技术活,不是能一蹴而就的,想要立杆见影效果的,还是去做好你的各种推广手段吧.前面2篇说了入门篇和微信门面篇,对于想做微信营销和刚入门的,建议去看看前2篇文章,

Win32开发入门(6):创建右键菜单

快捷菜单,说得容易理解一点,就是右键菜单,当我们在某个区域内单击鼠标右键,会弹出一些菜 单项.这种类型的菜单,是随处可见的,我们在桌面上右击一下,也会弹出一个菜单. 右键菜 单的好处就是方便,它经常和我们正在操作的某个UI元素联系起来,比如我们正在使用文本框输入文本 ,我们在文本框中右击,就会看到可能有[复制][清空][全选]之类的选项,所以,右键菜单也称 为"上下文菜单(Context Menu)". 一般来说,创建并使用快捷菜单,可以按照以下步骤进 行: 1.用资源编辑器创建菜单.