自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以“...”代替。
自定义菜单的介绍,可以看官方开发文档http://mp.weixin.qq.com/wiki/home/index.html
下面是我自己写的一个实现自定义菜单的小Dome
一、先定义了一个Json字符串,格式要按照微信提供的Json格式
        //创建微信菜单JSON字符串
private string GetWXMenuStr()
{
string weixin1 = "";
weixin1 += "{\n";
weixin1 += "\"button\":[\n";
weixin1 += "{\n";
// weixin1 += "\"type\":\"click\",\n";
//第一个菜单
weixin1 += "\"name\":\"公共信息\",\n";
weixin1 += "\"sub_button\":[\n"; weixin1 += "{\n";
weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"通知公告\",\n";
weixin1 += "\"key\":\"11\"\n";
weixin1 += "},\n"; weixin1 += "{\n";
weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"工作动态\",\n";
weixin1 += "\"key\":\"12\"\n";
weixin1 += "},\n"; weixin1 += "{\n";
weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"政策法规\",\n";
weixin1 += "\"key\":\"13\"\n";
weixin1 += "},\n"; weixin1 += "{\n";
weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"经济视野\",\n";
weixin1 += "\"key\":\"14\"\n";
weixin1 += "},\n"; weixin1 += "{\n";
weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"专题报道\",\n";
weixin1 += "\"key\":\"15\"\n";
weixin1 += "}]\n";
weixin1 += "},\n";
//第二个菜单
weixin1 += "{\n";
//weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"公共服务\",\n";
weixin1 += "\"sub_button\":[\n";
weixin1 += "{\n";
weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"企业之窗\",\n";
weixin1 += "\"key\":\"21\"\n";
weixin1 += "},\n"; weixin1 += "{\n";
weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"金融服务\",\n";
weixin1 += "\"key\":\"22\"\n";
weixin1 += "},\n"; weixin1 += "{\n";
weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"创业指导\",\n";
weixin1 += "\"key\":\"23\"\n";
weixin1 += "},\n"; weixin1 += "{\n";
weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"管理服务\",\n";
weixin1 += "\"key\":\"24\"\n";
weixin1 += "},\n"; weixin1 += "{\n";
weixin1 += "\"type\":\"click\",\n";
weixin1 += "\"name\":\"法律服务\",\n";
weixin1 += "\"key\":\"25\"\n";
weixin1 += "}]\n";
weixin1 += "},\n";
//第三个菜单(view类型的)
weixin1 += "{\n";
weixin1 += "\"name\":\"互动交流\",\n";
weixin1 += "\"sub_button\":[\n";
weixin1 += "{\n";
weixin1 += "\"type\":\"view\",\n";
weixin1 += "\"name\":\"注册\",\n";
weixin1 += "\"url\":\"http://1532618rl0.iok.la/Register.aspx\"\n";
weixin1 += "},\n"; weixin1 += "{\n";
weixin1 += "\"type\":\"view\",\n";
weixin1 += "\"name\":\"登录\",\n";
weixin1 += "\"url\":\"http://1532618rl0.iok.la\"\n";
weixin1 += "}]\n";
weixin1 += "}\n";
weixin1 += "}]\n"; weixin1 += "}\n";
return weixin1;
}

二、定义执行菜单请求方法

        /// <summary>
        /// 执行菜单请求
        /// </summary>
        /// <param name="url">微信提供的自定义菜单接口地址</param>
        /// <param name="postData">实现自定义菜单的Json字符串</param>
        public void PostMenuData(string url, string postData)
        {
            Stream outstream = null;
            Stream instream = null;
            StreamReader sr = null;
            HttpWebResponse response = null;
            HttpWebRequest request = null;
            Encoding encoding = Encoding.UTF8;
            byte[] data = encoding.GetBytes(postData);
            // 准备请求...
            try
            {
                // 设置参数
                request = WebRequest.Create(url) as HttpWebRequest;
                CookieContainer cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method = "POST";
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = data.Length;
                outstream = request.GetRequestStream();
                outstream.Write(data, 0, data.Length);
                outstream.Close();
                //发送请求并获取相应回应数据
                response = request.GetResponse() as HttpWebResponse;
                //直到request.GetResponse()程序才开始向目标网页发送Post请求
                instream = response.GetResponseStream();
                sr = new StreamReader(instream, encoding);
                //返回结果网页(html)代码
                string content = sr.ReadToEnd();
                string err = string.Empty;
            }
            catch (Exception ex)
            {
                string err = ex.Message;
            }
        }

三、实现自定义菜单

       private string postUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=";
//创建自定义菜单
public void CreateWxMenu()
{
string weixin1 = GetWXMenuStr();//获取菜单Json字符串
string AccessToken = Helper.IsExistAccess_Token();//获取AccessToken
PostMenuData(postUrl + AccessToken, weixin1);//通过接口实现自定义菜单
}

四、在程序运行的起始页调用CreateWxMenu()方法即可。

其中获取AccessToken的方法是调用前面写的文章封装的一个Helper方法实现的,地址http://www.cnblogs.com/zhangjd/p/5694737.html

C#微信公众号——自定义菜单的更多相关文章

  1. 微信公众号自定义菜单中添加emoji表情

    做微信公众号开发,可能会遇到如何加入emoji表情的问题.今天在“海南旅游小管家”公众号的菜单中加入了emoji表情,特此记录备忘. 1.登录微信公众号,在左侧找到[开发者工具]菜单,点击进入,找到[ ...

  2. vue 仿写微信公众号自定义菜单

    先看效果图 代码参考 <template> <div> <!-- 公众号设置 --> <el-col :span="24" style=& ...

  3. .net mvc 微信公众号 自定义菜单

    官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141013&token=&lang=zh_CN ...

  4. 通过微信公众号API复制公众号自定义菜单同时增加子菜单方法

    主要的原因是再不破坏公众号以前的菜单的基础上增加自定义菜单,主要步骤如下: 1.通过微信提供的微信公众平台接口调试工具获取公众号的所有自定义菜单 网址:https://mp.weixin.qq.com ...

  5. 微信公众平台自定义菜单新增扫一扫、发图片、发位置 LBS运作更便捷

    今天微信公众平台发布更新,自定义菜单新增扫一扫.发图片.发送位置等功能,这对于有意挖掘微信LBS服务的运营者来说更便捷了,订阅号不用返回微信界面就能扫图.发送图片.调用地理位置,用户体验更友好,自然也 ...

  6. 微信公众平台自定义菜单PHP开发

    微信公众平台自定义菜单PHP开发,微信公众平台自定义菜单是如何实现的呢?其实很简单,首先在微信公众平台升级为服务号,获取appid和appsecret,然后根据这2个参数获取access_token, ...

  7. 微信公众平台自定义菜单及高级接口PHP SDK(转)

    本文介绍介绍微信公众平台自定义菜单及高级接口的PHP SDK及使用方法. 作者 方倍工作室 修正记录: 2014.05.03 v1.0 方倍工作室 http://www.cnblogs.com/txw ...

  8. 微信公众平台自定义菜单及高级接口PHP SDK

    本文介绍介绍微信公众平台自定义菜单及高级接口的PHP SDK及使用方法. 作者 方倍工作室 修正记录: 2014.05.03 v1.0 方倍工作室 http://www.cnblogs.com/txw ...

  9. java版微信公众平台自定义菜单创建代码实现

    微信公众平台自定义菜单创建代码实现—java版 搞了两天的自定义菜单,终于搞定了,现在分享下心得,以便后来者少走弯路...... 好了,先看先微信官方的API 官方写的很详细,但是我看完后很茫然,不知 ...

随机推荐

  1. jQuery对于动态生成的元素绑定无效的问题~~

    问题:很多时候发现,对动态生成的元素绑定click事件是无效的- 原因:直接绑定到动态生成的元素是无效的,是因为Jquery扫描文档找出所有的$(‘’)元素,并把函数绑定到每个元素的click事件上, ...

  2. 值得 .NET 开发者了解的15个特性

    本文列举了 15 个值得了解的 C# 特性,旨在让 .NET 开发人员更好的使用 C# 语言进行开发工作. 1. ObsoleteAttribute ObsoleteAttribute 适用于除组件. ...

  3. xlsx导入成--json

    这两天遇到大难题了,就是这个   xlsx   导入问题,之前用的xlsx.full.min.js,写的导入,结果不兼容ie浏览器,研究这个也好长时间,网上居然还没有搜到合适的,自己写从xlsx官网上 ...

  4. 微信公众号开发,weUi组件,问题总结

    1.实现上拉分页,Google兼容问题,weui框架提供的模板是这样的($(document.body).infinite()),在body定一个div通过这个div,实现上拉 $('#wrapper ...

  5. Spring Boot Druid数据源配置

    package com.hgvip.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.su ...

  6. 关于html表单的disabled属性的设置问题

    首先,我的看法是无论disable的值是否有值,只要设置了disabled属性的表单,无论是否有值,无论值为什么,都会被禁用.   来看下面例子: 在一个群里有人说因为直接写在表单属性上是字符串,因为 ...

  7. zip详解

    http://www.360doc.com/content/06/0915/14/10610_208147.shtml

  8. java之内存分布图

    前言 不关我们是创建基本数据类型的变量还是引用数据类型的变量,jvm都会通过内存分布去编译和运行程序. 内存一般分为栈区.堆区.方法区(方法区里面包含常量池) 栈区一般存放变量(局部变量).方法的参数 ...

  9. HIVE使用mysql作为外置数据库配置详情

    Hive安装配置(mysql) 安装mysql hadoop$:sudo apt-get update hadoop$:sudo apt-get install mysql-server 启动mysq ...

  10. 从0开始的LeetCode生活—9. Palindrome Number(回文数)

    题目大意: 判断输入的数字是不是回文数.所谓回文数就是正反读都一样的数字,比如说11,121,1221这样子的数字.负数不会是回文数. 解题思路: 思路一:如果这个数是负数,则返回false,否则用一 ...