.NET微信公众号开发之查询自定义菜单
一.前言
前面我们已经创建好了我们的自定义菜单。那么我们现在要如何查询我们自定义的菜单。
原理都是一样的,而且都是相当简单,只是接口地址文档换掉了。
二、开始编码
同样我们首先创建好我的查询页面,在这里我们使用aspx页面 selectMenu.aspx
protected void Page_Load(object sender, EventArgs e)
{
var str = GetPage("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=wxd811f56f3&secret=76eb33f661296");
JObject jo = JObject.Parse(str);
access_token = jo["access_token"].ToString();
GetPage("https://api.weixin.qq.com/cgi-bin/menu/get?access_token=" + access_token + "");
//GetPage("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=access_token");
}
看代码是不是相当的简单。相信这对于聪明的你根本不是什么问题。同样删除我们的自定义菜单也很简单,只不过是接口地址换了而已,GetPage方法的代码前面的文章已经有了,在这里就不重复的说明了。
三、令牌优化.
前面我们已经知道了,怎么获取我们的access_token,我们知道它的有效时间是7200s,在这里难道我们每次请求都需要去重新获取一次,岂不是很麻烦,而且也不利于性能的优化,在这里我们对这个获取令牌的方法做一些优化,更有利于我们的代码.
在这里我们首先创建一个AccessToken类来存储我们的一些信息。代码如下
/// <summary> /// 微信许可令牌 /// </summary> public class AccessToken { /// <summary> /// 保存已获取到的许可令牌,键为公众号,值为公众号最后一次获取到的令牌 /// </summary> private static ConcurrentDictionary<string, Tuple<AccessToken, DateTime>> accessTokens = new ConcurrentDictionary<string, Tuple<AccessToken, DateTime>>(); /// <summary> /// 获取access token的地址 /// </summary> private const string urlForGettingAccessToken = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}"; /// <summary> /// 获取access token的http方法 /// </summary> private const string httpMethodForGettingAccessToken = WebRequestMethods.Http.Get; /// <summary> /// 保存access token的最长时间(单位:秒),超过时间之后,需要重新获取 /// </summary> private const int accessTokenSavingSeconds = 7000; /// <summary> /// access token /// </summary> public string access_token { get; set; } /// <summary> /// 有效时间,单位:秒 /// </summary> public int expires_in { get; set; } /// <summary> /// 构造函数 /// </summary> /// <param name="_access_token">access token</param> /// <param name="_expires_in">有效时间</param> internal AccessToken(string _access_token, int _expires_in) { access_token = _access_token; expires_in = _expires_in; } /// <summary> /// 返回AccessToken字符串 /// </summary> /// <returns></returns> public override string ToString() { return string.Format("AccessToken:{0}\r\n有效时间:{1}秒", access_token, expires_in); } /// <summary> /// 从JSON字符串解析AccessToken /// </summary> /// <param name="json">JSON字符串</param> /// <returns>返回AccessToken</returns> internal static AccessToken ParseFromJson(string json) { var at = JsonConvert.DeserializeAnonymousType(json, new { access_token = "", expires_in = 1 }); return new AccessToken(at.access_token, at.expires_in); } /// <summary> /// 尝试从JSON字符串解析AccessToken /// </summary> /// <param name="json">JSON字符串</param> /// <param name="msg">如果解析成功,返回AccessToken;否则,返回null。</param> /// <returns>返回是否解析成功</returns> internal static bool TryParseFromJson(string json, out AccessToken token) { bool success = false; token = null; try { token = ParseFromJson(json); success = true; } catch { } return success; } /// <summary> /// 得到access token /// </summary> /// <param name="userName">公众号</param> /// <returns>返回access token</returns> public static AccessToken Get(string userName) { Tuple<AccessToken, DateTime> lastToken = accessTokens.ContainsKey(userName) ? accessTokens[userName] : null; AccessToken token = lastToken == null ? null : lastToken.Item1; DateTime refreshTime = lastToken == null ? DateTime.MinValue : lastToken.Item2; double ms = (DateTime.Now - refreshTime).TotalSeconds; if (ms > accessTokenSavingSeconds || token == null) { //尝试从微信服务器获取2次 ErrorMessage msg; AccessToken newToken = GetFromWeixinServer(userName, out msg); if (newToken == null) newToken = GetFromWeixinServer(userName, out msg); if (newToken != null) { lastToken = new Tuple<AccessToken, DateTime>(newToken, DateTime.Now); accessTokens[userName] = lastToken; token = newToken; } } return token; } /// <summary> /// 从微信服务器获取access token /// </summary> /// <param name="userName">公众号</param> /// <param name="msg">从服务器返回的错误信息。</param> /// <returns>返回许可令牌;如果获取失败,返回null。</returns> private static AccessToken GetFromWeixinServer(string userName, out ErrorMessage msg) { AccessToken token = null; msg = new ErrorMessage(ErrorMessage.ExceptionCode, ""); string url = string.Format(urlForGettingAccessToken, WxPayConfig.APPID, WxPayConfig.APPSECRET); string result; if(!HttpHelper.Request(url, out result, httpMethodForGettingAccessToken, string.Empty)) { msg.errmsg = "从微信服务器获取响应失败。"; return token; } if (ErrorMessage.IsErrorMessage(result)) msg = ErrorMessage.Parse(result); else { try { token = AccessToken.ParseFromJson(result); } catch (Exception e) { msg = new ErrorMessage(e); } } return token; } }
从这个类中的代码我们看到,每次获取access_token的时候都会判断一些时间是不是超过了7000,我们的token过期时间是7200s,这样就不需要每次请求的时候都是重新获取token。
这个时候我们的查询代码可以优化下.
protected void Page_Load(object sender, EventArgs e)
{
string username = System.Configuration.ConfigurationManager.AppSettings["weixinid"].ToString();
AccessToken token = AccessToken.Get(username);
GetPage("https://api.weixin.qq.com/cgi-bin/menu/get?access_token=" + access_token + "");
//GetPage("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=access_token");
}
以上所述就是本文的全部内容了,希望大家能够喜欢。
相关文章
- 这篇文章主要为大家详细介绍了ASP.NET购物车的实现过程,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-22
- 这篇文章主要介绍了.NET Core下使用Kafka的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
- 在开发过程中,使用Visual Studio的断点调试功能可以很方便帮我们调试发现程序存在的错误,同样Visual Studio也支持对SQL Server里面的存储过程进行调试,下面就让我们看看具体的调试方法。...2021-09-22
- 这篇文章主要介绍了Win10 IIS 安装及.net 4.5及Win10安装IIS并配置ASP.NET 4.0的方法,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22
- 这篇文章主要介绍了详解.NET Core 3.0 里新的JSON API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
- 这篇文章主要介绍了vscode搭建STM32开发环境的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-05-02
- 这篇文章主要介绍了.net数据库操作框架SqlSugar的简单入门,帮助大家更好的理解和学习使用.net技术,感兴趣的朋友可以了解下...2021-09-22
ASP.NET Core根据环境变量支持多个 appsettings.json配置文件
这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22- 这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
- 下面我们一起来看一篇关于 安卓开发之Intent传递Object与List的例子,希望这个例子能够为各位同学带来帮助。 Intent 不仅可以传单个的值,也可以传对象与数据集合...2016-09-20
- 这篇文章主要为大家详细介绍了php微信公众账号开发之五个坑,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2016-10-02
- 在微信公众号平台开发者那里,在“账号管理”那里,有一项功能是“生成带参数的二维码”,通过这儿生成的二维码,只要通过微信扫一扫之后,会把事件自动推送到微...2016-05-19
- 在日常开发中,总会接触到各种接口,前后端数据传输接口,第三方业务平台接口,下面这篇文章主要给大家介绍了关于如何设计一个安全的API接口的相关资料,需要的朋友可以参考下...2021-08-12
- ZXing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库,它包含了联系到其他语言的端口。这篇文章主要给大家介绍了.NET C#利用ZXing生成、识别二维码/条形码的方法,文中给出了详细的示例代码,有需要的朋友们可以参考借鉴。...2020-06-25
详解ASP.NET Core 中基于工厂的中间件激活的实现方法
这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22- 这篇文章主要介绍了C#使用Ado.Net更新和添加数据到Excel表格的方法,较为详细的分析了OLEDB的原理与使用技巧,可实现较为方便的操作Excel数据,需要的朋友可以参考下...2020-06-25
asp.net通过消息队列处理高并发请求(以抢小米手机为例)
这篇文章主要介绍了asp.net通过消息队列处理高并发请求(以抢小米手机为例),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22ASP.NET 2.0中的数据操作:使用两个DropDownList过滤的主/从报表
在前面的指南中我们研究了如何显示一个简单的主/从报表, 该报表使用DropDownList和GridView控件, DropDownList填充类别,GridView显示选定类别的产品. 这类报表用于显示具有...2016-05-19ASP.NET单选按钮控件RadioButton常用属性和方法介绍
RadioButton又称单选按钮,其在工具箱中的图标为 ,单选按钮通常成组出现,用于提供两个或多个互斥选项,即在一组单选钮中只能选择一个...2021-09-22详解.NET Core 使用HttpClient SSL请求出错的解决办法
这篇文章主要介绍了.NET Core 使用HttpClient SSL请求出错的解决办法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22