微信Access Token 缓存方法
微信Access Token默认缓存是2小时,但是需要特别强调,微信服务号和微信企业号缓存并不相同。
(1)微信公众号号:每次Http请求Access Token 系统会返回不同的Token,并附带超时时间,默认是2小时。
(2)微信企业号:每次请求Access Token,默认有效期为2个小时,在这2个小时内获取的Access Token是一样的。
对于微信公众号,我们通过txt存储每次获取的Access Token。换句话说,当缓存后,再次获取Access时,直接从txt里获取。代码如下:
private static string wxml = HttpContext.Current.Server.MapPath("~/app_data/access_token.txt");
public static string GetAccessToken()
{
string json = "";
DateTime dt = DateTime.Now;
if (!System.IO.File.Exists(wxml))
{
//txt不存在,创建
json = GetTokenFromURL();
}
else
{
json = System.IO.File.ReadAllText(wxml);
}
//获取最后txt写入的时间
dt = System.IO.File.GetLastWriteTime(wxml);
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AccessToken));
var mStream = new MemoryStream(Encoding.Default.GetBytes(json));
AccessToken token = (AccessToken)serializer.ReadObject(mStream);
//_expires_in默认为 7200秒,也就是2小时,也就是access_token2小时即失效。为了保证可靠性,系统让access_tokey 1.5小时失效。
int minRefreshTimeSpan = 1800 - int.Parse(token.expires_in); // -5400秒
if (minRefreshTimeSpan > 0)
{
minRefreshTimeSpan = -1800;
}
if (dt < DateTime.Now.AddSeconds(minRefreshTimeSpan))
{
GetTokenFromURL();
json = System.IO.File.ReadAllText(wxml);
serializer = new DataContractJsonSerializer(typeof(AccessToken));
mStream = new MemoryStream(Encoding.Default.GetBytes(json));
token = (AccessToken)serializer.ReadObject(mStream);
}
return token.access_token;
}
private static string GetTokenFromURL()
{
string appid = AppID;
string secret = AppSecret;
string strUrl = Access_Token_URL;
string json = HttpUtility.SendGetHttpRequest(strUrl);
System.IO.File.WriteAllText(wxml, json);
return json;
}
(2)对于企业微信AccessToken,可以使用单列模式存储
private static DateTime _lastGetTimeOfAccessToken = DateTime.Now.AddSeconds(-7201);
private static string _AccessToken=""; public static string GetAccessToken()
{ if (_lastGetTimeOfAccessToken < DateTime.Now )
{
var rsEntity = new { access_token = "", expires_in = 0, errcode = 0, errmsg = "" };
string json = GetTokenFromURL();
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(AccessToken));
var mStream = new MemoryStream(Encoding.Default.GetBytes(json));
AccessToken token = (AccessToken)serializer.ReadObject(mStream);
_lastGetTimeOfAccessToken = DateTime.Now.AddSeconds( int.Parse(token.expires_in) - 1);
_AccessToken = token.access_token; } return _AccessToken; }
微信Access Token 缓存方法的更多相关文章
- 使用缓存Memcache存储更新微信access token
关键字:Memcache access_token 更新 存储 7200 本文介绍如何使用缓存Memcache存储及更新 access token的方法. 一.Access Token access_ ...
- 微信公众平台开发(112) 自动更新微信access token
关键字:Memcache access_token 更新 存储 7200 本文介绍如何存储及更新 access token的方法. 一.Access Token access_token是公众号的全局 ...
- 微信access token过期
两台服务器使用同一个微信账号(同一个app id) 时,当其中一台服务器向微信请求access token时,会造成另一台服务器的access token过期
- C# v3微信 access token 过期处理的问题
//记录access token 申请时的时间 private static DateTime GetAccessToken_Time; /// <summary> /// 过期时间为72 ...
- Force.com微信开发系列(四)申请Access Token及自定义菜单之创建菜单
在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒内失效,重复获取将导致上次获取的Token失效,本文将首先介 ...
- .NET微信开发通过Access Token和OpenID获取用户信息
本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称.头像.性别.国家.省份.城市.语言. 本文的方法将囊括订阅号和服务号以及自定义菜单各种场景,无论是否有高级接口权限,都有办法来获得用户基本信息 ...
- 微信开发-ACCESS TOKEN 过期失效解决方案
微信开发-ACCESS TOKEN 过期失效解决方案 起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一 ...
- 微信公众平台开发(26) ACCESS TOKEN
本文介绍微信公众平台下Access Token的概念及获取方法. 一.Access Token access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常 ...
- 微信公众平台开发视频教程-03-获取Access Token和获取微信服务器IP,添加微信菜单
1 获取access token 此token是以后每次调用微信接口都会带上的票据,token是公众号全局唯一票据,在调用其他接口之前都需要先得到token,taoken长度至少512个字符,通常用s ...
随机推荐
- liunx的命令大全
- MySQL Binlog 介绍
Binlog 简介 MySQL中一般有以下几种日志: 日志类型 写入日志的信息 错误日志 记录在启动,运行或停止mysqld时遇到的问题 通用查询日志 记录建立的客户端连接和执行的语句 二进制日志 记 ...
- Django如何重设Admin密码
如果你忘记了Admin的密码的话,就要用Django shell: python manage.py shell 然后获取你的用户名,并且重设密码: >>>from django.c ...
- Chrome导出书签瘦身,去除ADD_DATE和ICON
Chrome等浏览器导出的书签是一个html文件,每个链接是一个a标签,由于保存着添加时间和图标显得太臃肿. 原本的样子: 我们利用sublime的正则替换,变成一个清爽的样子. 正则表达式:ADD_ ...
- db 文件 查看 打开 工具 db 中文 版 navicat 中文
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha ======= db 中文 版 navicat 中文 ======= Navicatfo ...
- hiho1269 优化延迟 ([Offer收割]编程练习赛1)
一道中文题,就不用翻译了. 大意是讲,一串数字,可以按照输入的先后顺序扔到一个固定大小的缓冲池子里,这个池子里的数输出顺序随意.然后计算—— SP=1*Pi1+2*Pi2+3*Pi3+...+N*Pi ...
- Linux C语言编程学习笔记 (1)进程控制入门
想进行Linux系统开发已经很久了,一直没有付诸实践.今日终于开始学习Linux下的C语言编程,研究一天,终于大概弄明白了Linux系统进程管理的一些基本概念和编程方法,总结下来以方便大家学习和自己实 ...
- Codeforces Round #397 by Kaspersky Lab and Barcelona Bootcamp (Div. 1 + Div. 2 combined) C. Table Tennis Game 2 水题
C. Table Tennis Game 2 题目连接: http://codeforces.com/contest/765/problem/C Description Misha and Vanya ...
- Codeforces Round #373 (Div. 2) E. Sasha and Array 线段树维护矩阵
E. Sasha and Array 题目连接: http://codeforces.com/contest/719/problem/E Description Sasha has an array ...
- python之sys.stdout、sys.stdin
转自:http://www.cnblogs.com/turtle-fly/p/3280519.html 本文环境:Python 2.7 使用 print obj 而非 print(obj) sys. ...