C# 微信access_token缓存和过期刷新
摘自:http://blog.csdn.net/hechurui/article/details/22398849
首先建立一个Access_token类
- /// <summary>
- ///Access_token 的摘要说明
- /// </summary>
- public class Access_token
- {
- public Access_token()
- {
- //
- //TODO: 在此处添加构造函数逻辑
- //
- }
- string _access_token;
- string _expires_in;
- /// <summary>
- /// 获取到的凭证
- /// </summary>
- public string access_token
- {
- get { return _access_token; }
- set { _access_token = value; }
- }
- /// <summary>
- /// 凭证有效时间,单位:秒
- /// </summary>
- public string expires_in
- {
- get { return _expires_in; }
- set { _expires_in = value; }
- }
- }
用下面的XML文件来存放access_token,建立一个XMLFile.xml,把Access_YouXRQ标签的内容写成一个已经过去的时间,这样我们好在一开始调用的时候,发现已经过期,然后获取新的access_token。
- <?xml version="1.0" encoding="utf-8"?>
- <xml>
- <Access_Token>初始值可以随便写</Access_Token>
- <Access_YouXRQ>1980/12/12 16:06:38</Access_YouXRQ>
- </xml>
改造一下之前获得Access_token的方法,让他给Access_token实例赋值
- public static Access_token GetAccess_token()
- {
- string appid = 你的appid ;
- string secret = 你的secret;
- string strUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
- Access_token mode = new Access_token();
- HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl);
- req.Method = "GET";
- using (WebResponse wr = req.GetResponse())
- {
- HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();
- StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
- string content = reader.ReadToEnd();
- //Response.Write(content);
- //在这里对Access_token 赋值
- Access_token token = new Access_token();
- token = JsonHelper.ParseFromJson<Access_token>(content);
- mode.access_token = token.access_token;
- mode.expires_in = token.expires_in;
- }
- return mode;
- }
以上的方法用到了Json对象的处理,所以我把JsonHelper的代码一贴出来供大家参考,一下就是JsonHelper.cs的代码:
- using System;
- using System.IO;
- using System.Text;
- using System.Runtime.Serialization.Json;
- public class JsonHelper
- {
- /// <summary>
- /// 生成Json格式
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="obj"></param>
- /// <returns></returns>
- public static string GetJson<T>(T obj)
- {
- DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
- using (MemoryStream stream = new MemoryStream())
- {
- json.WriteObject(stream, obj);
- string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;
- }
- }
- /// <summary>
- /// 获取Json的Model
- /// </summary>
- /// <typeparam name="T"></typeparam>
- /// <param name="szJson"></param>
- /// <returns></returns>
- public static T ParseFromJson<T>(string szJson)
- {
- T obj = Activator.CreateInstance<T>();
- using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
- {
- DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
- return (T)serializer.ReadObject(ms);
- }
- }
- }
我们还需要些一个判断access_token是否过期如果过期更新XML文件的方法。
- /// <summary>
- /// 根据当前日期 判断Access_Token 是否超期 如果超期返回新的Access_Token 否则返回之前的Access_Token
- /// </summary>
- /// <param name="datetime"></param>
- /// <returns></returns>
- public static string IsExistAccess_Token()
- {
- string Token = string.Empty;
- DateTime YouXRQ;
- // 读取XML文件中的数据,并显示出来 ,注意文件路径
- string filepath = Server.MapPath("XMLFile.xml");
- StreamReader str = new StreamReader(filepath, System.Text.Encoding.UTF8);
- XmlDocument xml = new XmlDocument();
- xml.Load(str);
- str.Close();
- str.Dispose();
- Token = xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText;
- YouXRQ = Convert.ToDateTime(xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText);
- if (DateTime.Now > YouXRQ)
- {
- DateTime _youxrq = DateTime.Now;
- Access_token mode = GetAccess_token();
- xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText = mode.access_token;
- _youxrq = _youxrq.AddSeconds(int.Parse(mode.expires_in));
- xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText = _youxrq.ToString();
- xml.Save(filepath);
- Token = mode.access_token;
- }
- return Token;
- }
好了,完成了上面的工作,我只需要在使用到access_token的时如下调用就OK了,“客户再也不用担心token的过期”。
string _access_token = IsExistAccess_Token();
C# 微信access_token缓存和过期刷新的更多相关文章
- 微信access_token缓存与更新
由于Access Token有效期只有7200秒,而每天调用获取的次数只有2000次,所以需要将Access Token进行缓存来保证不触发超过最大调用次数.另外在微信公众平台中,绝大多数高级接口都需 ...
- 微信access_token设计的原理解析
1.access_token是加密的字符串,其目的是为了接口安全考虑,不然随便就能调用微信服务器的接口会有很大风险. 2.用户在公众号中填写的Token就相当于本项目中的xiaoming,是签名验证中 ...
- angular页面缓存与页面刷新
angularJS学习笔记:页面缓存与页面刷新 遇到的问题 现在存在这样一个问题,登录前与登录成功后是同一个页面,只不过通过ngIf来控制哪部分显示,图像信息如下: 所以,整体工作不是很难,无非就 ...
- 获取微信access_token
/** * 获取微信access_token * @return mixed */function get_access_token() { $appId = C('APPID'); $secret ...
- python之获取微信access_token
# -*- coding: cp936 -*- #python 27 #xiaodeng #获取微信access_token #办法一:将该url直接填写到浏览器地址中可以获得access_token ...
- 利用gulp解决微信浏览器缓存问题
做了好多项目,这次终于要解决微信浏览器缓存这个令人头疼的问题了.每次上传新的文件,在微信浏览器中访问时,总要先清除微信的缓存,实在麻烦,在网上搜罗了很多解决办法,终于找到了方法:利用gulp解决缓存问 ...
- 微信小程序之下拉刷新,上拉更多列表实现
代码地址如下:http://www.demodashi.com/demo/11110.html 一.准备工作 首先需要下载小程序开发工具 官方下载地址: https://mp.weixin.qq.co ...
- 解决微信浏览器缓存站点入口文件(IIS部署Vue项目)
最近开发的微信公众号项目中(项目采用Vue + Vux 构建,站点部署在IIS8.5上),遇到个非常奇葩的问题,发布站点内容后,通过微信打开网址发现是空白页面(后来验证是微信浏览器缓存了入口文件-in ...
- 微信access_token全局缓存,处理过期
//PHP创建access_token.json文件,将access_token 和 生成时间expires 保存在其中, //{"access_token":"xxxx ...
随机推荐
- [LeetCode]剑指 Offer 52. 两个链表的第一个公共节点
题解 nodeA走一个链表A(A独有+公共),再走B独有的长度, nodeB走一个链表B(B独有+公共),再走A独有的长度. 结果:两者相遇点即为交点:若没有交点,两者都走到null,会返回null. ...
- js学习笔记之作用域链和闭包
在学习闭包之前我们很有必要先了解什么是作用域链 一.作用域链 作用域链是保证对执行环境有权访问的所有变量和函数的有序访问. 这句话其实还是蛮抽象的,但是通过下面一个例子,我们就能清楚的了解到作用域链了 ...
- Js获取某个节点的类名
1. document.querySelectorAll(".style-color")[0].getAttribute("class") 2. $('.s ...
- 我的Python自学之路-003 字符串的知识
'''字符串是以引号或者单引号括起来的任意文本,例如"123","asdfjk",'adfa'引号或者单引号,只是一种表示方法,并不是字符串的一部分如果字符串本 ...
- u深度win10pe装机版制作教程
一款功能强大的u盘启动盘要怎么制作是非常重要的,对于大多数用户来说其中操作步骤并不熟悉.这里小编带来时下最新的u深度win10pe装机版制作教程,教你如何快速的进行u深度U盘的制作,下面就跟小编一起进 ...
- docker之windows安装¢OS安装
按这个安装 没什么毛病 https://blog.csdn.net/vitaair/article/details/80894890 https://www.runoob.com/docker/ce ...
- jekins的搭建和踩过的坑
https://www.cnblogs.com/jwrwst/p/6520114.html 主要按照上面的来装的 中间遇到过一些问题 https://wiki.jenkins.io/display/J ...
- MyBatis学习(二)代码实战
一.项目依赖 本项目是基于mybatis3.4.6版本实现的,用到的jar包如下 二.项目结构解析 三.配置文件解析 四.mapper文件解析 <?xml version="1.0&q ...
- C++解析XML的通用库
工作中,经常和XML打交道,最近抽空实现了一个通用解析XML的库,已归档在GitHub,详情点击:ComXmlLib.如果您无法访问GitHub,点击此处下载(链接是初版,无法和GitHub同步,如需 ...
- 谷歌发布Flutter Alpha:支持Windows
老孟导读:Windows来了,Mac.Linux.Web还远吗? 本文翻译自https://medium.com/flutter/announcing-flutter-windows-alpha-33 ...