C#微信公众平台开发—access_token的获取存储与更新
一、什么是access_token?
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。由于获取access_token的api调用次数非常有限,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务。
二、要解决的问题
1、如何获取access_token。
2、由于access_token的有效期为7200秒,即2小时,并且重复获取将导致上次获取的access_token失效,获取access_token的api调用次数非常有限,所以要解决如何全局存储与更新access_token。
三、思路
1、将access_token存储在数据库中。
2、何时更新access_token呢?当access_token失效的时候更新,那么怎么判断access_token有没有失效呢?使用当前的access_token请求微信接口,获取自定义菜单,如果返回的errcode为42001,则说明access_token已经失效,这时再重新获取access_token。
数据库设计(表名SWX_Config):
四、代码:
1、Http请求代码(HttpRequestUtil类):
- #region 请求Url,不发送数据
- /// <summary>
- /// 请求Url,不发送数据
- /// </summary>
- public static string RequestUrl(string url)
- {
- return RequestUrl(url, "POST");
- }
- #endregion
- #region 请求Url,不发送数据
- /// <summary>
- /// 请求Url,不发送数据
- /// </summary>
- public static string RequestUrl(string url, string method)
- {
- // 设置参数
- HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
- CookieContainer cookieContainer = new CookieContainer();
- request.CookieContainer = cookieContainer;
- request.AllowAutoRedirect = true;
- request.Method = method;
- 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;
- }
- #endregion
2、辅助方法(Tools类):
- namespace SWX.Utils
- {
- /// <summary>
- /// 工具类
- /// </summary>
- public class Tools
- {
- #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
- }
- }
3、判断access_token是否过期(WXApi类):
- #region 验证Token是否过期
- /// <summary>
- /// 验证Token是否过期
- /// </summary>
- public static bool TokenExpired(string access_token)
- {
- string jsonStr = HttpRequestUtil.RequestUrl(string.Format("https://api.weixin.qq.com/cgi-bin/menu/get?access_token={0}", access_token));
- if (Tools.GetJsonValue(jsonStr, "errcode") == "")
- {
- return true;
- }
- return false;
- }
- #endregion
4、请求微信接口,获取access_token(WXApi类):
- #region 获取Token
- /// <summary>
- /// 获取Token
- /// </summary>
- public static string GetToken(string appid, string secret)
- {
- string strJson = HttpRequestUtil.RequestUrl(string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appid, secret));
- return Tools.GetJsonValue(strJson, "access_token");
- }
- #endregion
5、全局存储与更新access_token(AdminUtil类):
- #region 获取access_token
- /// <summary>
- /// 获取access_token
- /// </summary>
- public static string GetAccessToken(PageBase page)
- {
- string access_token = string.Empty;
- UserInfo user = GetLoginUser(page);
- if (user != null)
- {
- if (string.IsNullOrWhiteSpace(user.access_token)) //尚未保存过access_token
- {
- access_token = WXApi.GetToken(user.AppID, user.AppSecret);
- }
- else
- {
- if (WXApi.TokenExpired(user.access_token)) //access_token过期
- {
- access_token = WXApi.GetToken(user.AppID, user.AppSecret);
- }
- else
- {
- return user.access_token;
- }
- }
- MSSQLHelper.ExecuteSql(string.Format("update SWX_Config set access_token='{0}' where UserName='{1}'", access_token, user.UserName));
- }
- return access_token;
- }
- #endregion
C#微信公众平台开发—access_token的获取存储与更新的更多相关文章
- 微信公众平台开发-access_token获取及应用(含源码)
微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 很多系统中都有access_token参数,对于微信公众平台的access_to ...
- C#微信公众号开发——access_token的获取
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_toke ...
- C#微信公众平台开发—高级群发接口
涉及access_token的获取请参考<C#微信公众平台开发—access_token的获取存储与更新> 一.为了实现高级群发功能,需要解决的问题 1.通过微信接口上传图文消息素材时,J ...
- Java微信公众平台开发(十二)--微信用户信息的获取
转自:http://www.cuiyongzhi.com/post/56.html 前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信 ...
- Java微信公众平台开发(十)--微信用户信息的获取
前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关 ...
- 微信公众平台开发2-access_token获取及应用(含源码)
微信公众平台开发-access_token获取及应用(含源码) 很多系统中都有access_token参数,对于微信公众平台的access_token参数,微信服务器判断该公众平台所拥有的权限,允许或 ...
- 微信公众平台开发-微信服务器IP接口实例(含源码)
微信公众平台开发-access_token获取及应用(含源码)作者: 孟祥磊-<微信公众平台开发实例教程> 学习了access_token的获取及应用后,正式的使用access_token ...
- 第五篇 :微信公众平台开发实战Java版之如何获取公众号的access_token以及缓存access_token
一.access_token简介 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等, 开 ...
- 第八篇 :微信公众平台开发实战Java版之如何网页授权获取用户基本信息
第一部分:微信授权获取基本信息的介绍 我们首先来看看官方的文档怎么说: 如果用户在微信客户端中访问第三方网页,公众号可以通过微信网页授权机制,来获取用户基本信息,进而实现业务逻辑. 关于网页授权回调域 ...
随机推荐
- 在.net中使用aquiles访问Cassandra(二)
上文中我们已经建立了项目的基本结构,今天实现数据的修改.在NoSQL中,通常添加和修改都认为是对数据的一种Mutation. 1.建立描述修改Row的实体. public class RowMut ...
- [安卓] 16、ListView和GridView结合显示单元实现自定义列表显示效果
List在各种手机应用中都有体现,是安卓UI设计的必修课. 本文将介绍在开发中如何利用ListView和GridView设计自定义列表. 下面分别是用ListView和GridView做的效果: 上面 ...
- Yii CModel中rules验证规则[转]
array( array(‘username’, ‘required’), array(‘username’, ‘length’, ‘min’=>3, ‘max’=>12), array( ...
- querySelector和querySelectorAll
jQuery被开发者如此的青睐和它强大的选择器有很大关系,比起笨重的document.getElementById.document.getElementByName… ,查找元素很方便,其实W3C中 ...
- Spring Trasnaction管理(2)- 事务AOP
问题导读 spring AOP是在如何进行的 spring 用cglib和jdkProxy管理的事务有何区别 Spring AOP管理 Spring主要的两个核心功能IOC与AOP.IOC的代码解析可 ...
- 爱上MVC3系列~监视Action的运行时间,并提供超时记录机制
回到目录 文章出现的原因 很久没写关于MVC的文章了,原因是将关注点移向了MVVM和DDD这边,而这篇文章完全是因为公司项目的需要,因为公司网站总是不定时的502,而这由可能是程序超时所引起的,为了分 ...
- fir.im Weekly - 从零开始创建 Android 新项目
今年的 Google I/O 大会上,人工智能和虚拟现实的产品发布让我们对未来多了几分惊喜.对于开发者部分,Google 发布了 Android N 系统,感受最深的是全新的 Android Stud ...
- jquerymobile仿微信 - 01
jquerymobile仿微信 - 01 jquerymobile的组件感觉不咋地哇 本地调试最好是开一个web server,不然数据访问会有问题 <div data-role="p ...
- java基础,继承类题目:编写一个Java应用程序,该程序包括3个类:Monkey类、People类和主类 E
21.编写一个Java应用程序,该程序包括3个类:Monkey类.People类和主类 E.要求: (1) Monkey类中有个构造方法:Monkey (String s),并且有个public vo ...
- 25.按要求编写一个Java应用程序: (1)编写一个矩形类Rect,包含: 两个属性:矩形的宽width;矩形的高height。 两个构造方法: 1.一个带有两个参数的构造方法,用于将width和height属性初化; 2.一个不带参数的构造方法,将矩形初始化为宽和高都为10。 两个方法: 求矩形面积的方法area() 求矩形周长的方法perimeter() (2)通过继承Rect类编写一个具有
package zhongqiuzuoye; //自己写的方法 public class Rect { public double width; public double height; Rect( ...