C# 微信公众平台开发(2)-- 微信菜单
上一篇了解微信开发者中心 URL的配置验证;
- 验证成功后,就可以对获取的接口权限进行操作
自定义菜单接口可实现多种类型按钮,用的比较多的是
1.click:点击推事件
用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
2、view:跳转URL
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的网页URL,可与网页授权获取用户基本信息接口结合,获得用户基本信息。
自定义菜单接口调用:
http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN
ACCESS_TOKEN 需要通过接口获取
由于ACCESS_TOKEN 一天只能调用 2000,可以将ACCESS_TOKEN 保存起来,有效时间内不需要重新调用接口
- /// <summary>
- /// 获取凭证接口
- /// </summary>
- /// <param name="grant_type">获取access_token填写client_credential</param>
- /// <param name="appid">第三方用户唯一凭证</param>
- /// <param name="secret">第三方用户唯一凭证密钥,既appsecret</param>
- /// <returns></returns>
- public static string GetAccessToken(string appid, string secret)
- {
- string token = OperationXml.GetXMLToken();
- if (token == "")
- {
- string strJson = RequestUrl(string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, secret));
- token = GetJsonValue(strJson, "access_token");
- OperationXml.UpdateXMLToken(token, DateTime.Now);
- }
- return token;
- }
- public static string RequestUrl(string strUrl)
- {
- // 设置参数
- HttpWebRequest request = WebRequest.Create(strUrl) as HttpWebRequest;
- CookieContainer cookieContainer = new CookieContainer();
- request.CookieContainer = cookieContainer;
- request.AllowAutoRedirect = true;
- request.Method = "POST";
- request.ContentType = "text/html";
- request.Headers.Add("charset", "utf-8");
- //发送请求并获取相应回应数据
- HttpWebResponse response = request.GetResponse() as HttpWebResponse;
- //直到request.GetResponse()程序才开始向目标网页发送Post请求
- Stream responseStream = response.GetResponseStream();
- StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
- //返回结果网页(html)代码
- string content = sr.ReadToEnd();
- return content;
- }
- #region 获取Json字符串某节点的值
- /// <summary>
- /// 获取Json字符串某节点的值
- /// </summary>
- public static string GetJsonValue(string jsonStr, string key)
- {
- string result = string.Empty;
- if (!string.IsNullOrEmpty(jsonStr))
- {
- key = "\"" + key.Trim('"') + "\"";
- int index = jsonStr.IndexOf(key) + key.Length + ;
- if (index > key.Length + )
- {
- //先截逗号,若是最后一个,截“}”号,取最小值
- int end = jsonStr.IndexOf(',', index);
- if (end == -)
- {
- end = jsonStr.IndexOf('}', index);
- }
- result = jsonStr.Substring(index, end - index);
- result = result.Trim(new char[] { '"', ' ', '\'' }); //过滤引号或空格
- }
- }
- return result;
- }
- #endregion
- /// <summary>
- /// 获取XML文件路径
- /// </summary>
- public static string xmlName = AppDomain.CurrentDomain.BaseDirectory + @"\AccessToken.xml";
- /// <summary>
- /// 读取XML Token
- /// </summary>
- /// <param name="xmlUrl"></param>
- /// <returns></returns>
- public static string GetXMLToken()
- {
- try
- {
- XmlDocument xmlDoc = new XmlDocument();
- xmlDoc.Load(xmlName);
- XmlNode xn = xmlDoc.SelectSingleNode("ACCESS_TOKEN");
- XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
- string Token = "";
- string CreateTime = "";
- foreach (XmlNode xn1 in xe)//遍历
- {
- XmlElement xe2 = (XmlElement)xn1;//转换类型
- if (xe2.Name == "Token")//如果找到
- {
- Token = xe2.InnerText;//则修改
- }
- if (xe2.Name == "CreateTime")//如果找到
- {
- CreateTime = xe2.InnerText;//则修改
- }
- }
- int seconds = ;
- if (CreateTime.Trim() != "")
- {
- DateTime ct = Convert.ToDateTime(CreateTime);
- TimeSpan ts = (DateTime.Now - ct);
- seconds = ts.Milliseconds;
- }
- LogTextHelper.WriteLogToFile("Token:" + Token);
- if (seconds > || seconds == )
- {
- return "";
- }
- else
- {
- return Token;
- }
- }
- catch (Exception ex)
- {
- LogTextHelper.WriteLogToFile("异常:" + ex.ToString());
- return "";
- }
- }
- /// <summary>
- /// 修改Token
- /// </summary>
- /// <param name="token"></param>
- /// <param name="createTime"></param>
- public static void UpdateXMLToken(string token, DateTime createTime)
- {
- XmlDocument xmlDoc = new XmlDocument();
- xmlDoc.Load(xmlName);
- XmlNode xn = xmlDoc.SelectSingleNode("ACCESS_TOKEN");
- XmlElement xe = (XmlElement)xn;//将子节点类型转换为XmlElement类型
- foreach (XmlNode xn1 in xe)//遍历
- {
- XmlElement xe2 = (XmlElement)xn1;//转换类型
- if (xe2.Name == "Token")//如果找到
- {
- xe2.InnerText = token;//则修改
- }
- if (xe2.Name == "CreateTime")//如果找到
- {
- xe2.InnerText = createTime.ToString();//则修改
- }
- }
- xmlDoc.Save(xmlName);
- }
获取Token
- #region 创建菜单
- public string CreateMenuPage(string posturl, 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(posturl) 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, , 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;
- Response.Write(content);
- return content;
- }
- catch (Exception ex)
- {
- string err = ex.Message;
- return string.Empty;
- }
- }
- #endregion
- #region 删除菜单
- public JsonResult DelMenu()
- {
- string postUrl = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token={0}";
- postUrl = string.Format(postUrl, CommonApi.GetAccessToken(strAppID, strAppSecret));
- string menuInfo = getMenuInfo();
- string result = CommonApi.PostWebRequest(postUrl, menuInfo);
- return Json(result, JsonRequestBehavior.AllowGet);
- }
- #endregion
- #region 获取菜单
- public string GetMenuList(string posturl)
- {
- Stream instream = null;
- StreamReader sr = null;
- HttpWebResponse response = null;
- HttpWebRequest request = null;
- Encoding encoding = Encoding.UTF8;
- // 准备请求...
- try
- {
- // 设置参数
- request = WebRequest.Create(posturl) as HttpWebRequest;
- CookieContainer cookieContainer = new CookieContainer();
- request.CookieContainer = cookieContainer;
- request.AllowAutoRedirect = true;
- request.Method = "GET";
- request.ContentType = "application/x-www-form-urlencoded";
- //发送请求并获取相应回应数据
- 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;
- Response.Write(content);
- return content;
- }
- catch (Exception ex)
- {
- string err = ex.Message;
- return string.Empty;
- }
- }
- #endregion
- private string getMenuInfo()
- {
- {
- "button":[
- {
- "type":"click",
- "name":"今日歌曲",
- "key":"V1001_TODAY_MUSIC"
- },
- {
- "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"
- }]
- }]
- }
- }
菜单操作
-------------------------------------------------------------------------------------
- 如果你觉得有帮助 请关注我的微信公众号,没有帮助你也可以添加哟!o(∩_∩)o 哈哈
C# 微信公众平台开发(2)-- 微信菜单的更多相关文章
- php 微信公众平台开发之微信群发信息
这篇文章主要为大家详细介绍了php微信公众平台开发之微信群发信息,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 1.目的 完成在微信公众号中群发消息.这里只是完成简单的文字发送.也可以发送语音图片 ...
- 微信公众平台开发(99) 自定义菜单获取OpenID
关键字 微信公众平台 自定义菜单 OpenID作者:方倍工作室原文:http://www.cnblogs.com/txw1958/p/weixin-menu-get-openid.html 在这篇微信 ...
- 微信公众平台开发(110) 微信连Wi-Fi
关键字:微信公众平台 微信连Wi-Fi 微信 WiFi 硬件鉴权作者:方倍工作室 原文:http://www.cnblogs.com/txw1958/p/weixin-wifi.html 微信连Wi- ...
- Java微信公众平台开发(十)--微信用户信息的获取
前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关 ...
- Java微信公众平台开发(十)--微信自定义菜单的创建实现
转自:http://www.cuiyongzhi.com/post/48.html 自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自 ...
- Java微信公众平台开发_04_自定义菜单
一.本节要点 1.菜单相关实体类的封装 参考官方文档中的请求包的内容,对菜单相关实体类进行封装. 2.数据传输格式—JSON 自定义菜单中请求包的数据是Json字符串格式的,请参见: Java_数据 ...
- 微信公众平台开发之微信access_token如何有效长期保存
随着微信使用越来越广泛,微信公众平台开放了许多接口以提供更多个性化的服务,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等,开发者在调用这些接口时,都需要传入一个相同的参数ac ...
- Java微信公众平台开发_05_微信网页授权
GitHub源码:https://github.com/shirayner/weixin_gz 一.本节要点 1.网页授权回调域名 登录微信公众平台后台, 开发 - 接口权限 - 网页服务 - 网页帐 ...
- Java微信公众平台开发(十三)--微信JSSDK中Config配置
转自:http://www.cuiyongzhi.com/post/57.html 前端开发工程师和关注前端开发的开发者们在2015年中肯定被腾讯的JSSDk引爆过,搞APP的.搞前端的甚至是是搞后端 ...
- Java微信公众平台开发(六)--微信开发中的token获取
转自:http://www.cuiyongzhi.com/post/44.html (一)token的介绍 引用:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access ...
随机推荐
- The Best Coder and Why? (最牛气的程序员)——精彩!
原文出处我已经找不到了,总之不是原创了,不过,重新看过,挺受震撼的.程序员出身的我们,或许记不住某些算法细节,但记住他们的名字,也许是应该的. MIT BBS上说微软电话面试的一道题就是“Who do ...
- Delphi判断一个文件是不是JPG图片
判断头几个字节: function IsJpegFile(FileName: string): Boolean; const RightBuf : ..] of Byte = ($FF,$D8,$FF ...
- Silverlight Socket 实现收发信息
原文 http://www.cnblogs.com/ZetaChow/archive/2009/05/16/2237347.html 刚接触Silverlight的时候,除了其异步应用WCF.流媒体. ...
- Microsoft Azure 在北美 TechEd 大会上发布令人振奋的更新,帮助客户开始使用云服务
云计算因其速度.规模和成本节省等优势而备受众多企业青睐.但企业需帮助,才能以安全可靠的方式使用云,同时还要利用企业的现有投资, 才能实现这些优势.因此,在TechEd 大会上,我们推出了一些新的服务, ...
- 在Mac上配置Apache+PHP环境
1.启用Apache/Web共享 打开终端,运行启动Apache命令: sudo apachectl start 然后输入系统密码,运行成功. 关闭命令: sudo apachectl stop 重启 ...
- HTML系列(四):编辑图像
一.图像的基本概念 1.矢量图:文件占用空间小,放大后图像不会失真,和分辨率无关.适用于图形设计.文字设计.标志设计.版式设计等. 2.位图:由像素点组成,文件较大,放大和缩小图像会失真. 3.有损压 ...
- Oracle与SQL自治事务
自治事务 自治事务是独立的事务操作,如果考虑到事务回滚,必须单独写成一个触发器来完成, 一个事务A在另一个事务B内被调用,那个事务A是自治事务,自治事务A执行过程中会脱离其session内未执行完毕的 ...
- MQ学习(二)----ActiveMQ简介(转)
1. 什么是ActiveMQ ActiveMQ是一种开源的,实现了JMS1.1规范的,面向消息(MOM)的中间件,为应用程序提供高效的.可扩展的.稳定的和安全的企业级消息通信.ActiveMQ使用A ...
- Java学习之网络编程
转自:http://blog.csdn.net/driverking/article/details/6573992 一.网络编程基本概念 1.OSI与TCP/IP体系模型 2.IP和端口 解决了文章 ...
- Hadoop学习之自定义二次排序
一.概述 MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的.在我们实际的需求当中,往 往有要对reduce输出结果进行二次排 ...