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 ...
随机推荐
- Unix/Linux环境C编程入门教程(5) Red Hat Enterprise Linux(RHEL)环境搭建
Unix/Linux版本众多,我们推荐Unix/Linux初学者选用几款典型的Unix/Linux操作系统进行学习. 通过./a.out ./Y.out执行出结果,证明C++程序编译成功,也就说明li ...
- C语言入门(3)——对Hello World程序的解释
上篇我们写了一个最简单的程序.这个简单的程序包含了很多重要的内容.本篇我们通过这个最简单的Hello World程序逐一讲解C语言程序的一些特点. 打开Visual Studio 2013 通过菜单- ...
- poj1617---columnar encryption
题意:给出keyword,如BATBOY,A的ascii值最小,所以第二列最先输出,B有两个,左边的先输出,也就是说,接下来输出第一列和第4列, 所以每一个字母都带有一个ascii值和一个序号,用结构 ...
- #include <map>
//tuple多元数组,必须是静态数组,类似结构体 //配合array,vector使用 //std::tuple<数组元素类型>数组变量名(数组元素变量名); #include < ...
- nodejs中使用递归案例
var http = require('http'); //1.正常逻辑第一步正常请求,动作进行一次的方法: function seqRequest(i,limit){ var req = http. ...
- 魔兽世界---屠夫(Just a Hook)
Just a Hook Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Tota ...
- 通过 CsvListWriter 读写.csv文件辅助类
package cn.gov.cnis.db; import java.io.File; import java.io.FileReader; import java.io.FileWriter; i ...
- if和switch
在 JavaScript 中,我们可使用以下条件语句:if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码if...else 语句 - ...
- Knuth-Morris-Pratt Algorithm
Today , 第一次学习KMP Algorithm,其中好多地方还是不能理解的透彻,本文将进一步对 KMP Algorithm 进行学习,搞清楚其中的思想…… First , KMP Algorit ...
- BZOJ 1559: [JSOI2009]密码( AC自动机 + 状压dp )
建AC自动机后, dp(x, y, s)表示当前长度为x, 在结点y, 包括的串的状态为s的方案数, 转移就在自动机上走就行了. 对于输出方案, 必定是由给出的串组成(因为<=42), 所以直接 ...