微信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 ...
随机推荐
- ld: warning: directory not found for option '-F/Users/Jason/Project/xxx'
解决方法: 选择项目名称----->Targets----->Build Settings----->Search Paths----->Library Search Path ...
- pymysql模块 执行sql封装
封装pymysql模块执行sql class HandCost(object): """ 处理数据库中的数据 """ def __init_ ...
- jquery插件机制
jQuery插件开发全解析 jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命 ...
- InnoDB的锁机制浅析(四)—不同SQL的加锁状况
不同SQL的加锁状况 文章总共分为五个部分: InnoDB的锁机制浅析(一)-基本概念/兼容矩阵 InnoDB的锁机制浅析(二)-探索InnoDB中的锁(Record锁/Gap锁/Next-key锁/ ...
- 电子邮件-TCP
参考下图,由于电子邮件是最早应用于网络上的服务,而早期网络的不可靠性,才设计了TCP协议,而邮件必须要保证正确传输,而非高速,所以早期的电子邮件协议 全是基于TCP的,一直持续到现在.
- 最长子回文字符串(Manacher’s Algorithm)
# # 大佬博客: https://www.cnblogs.com/z360/p/6375514.html https://blog.csdn.net/zuanfengxiao/article/det ...
- BZOJ.1879.[SDOI2009]Bill的挑战(状压DP)
题目链接 f定义和下面的思路一样,转移时枚举填什么字符,去更新f并算出有哪些字符串可以匹配某个状态(见code吧...). 预处理出有哪些字符串在第i位可以转移到某个字符c,dp时&一下状态即 ...
- QtTest模块出现控制台的原因与方案
转到Qt安装目录下的mkspces/features目录下, 1.用记事本打开qtestlib.prf文件,注释掉CONFIG += console #CONFIG += console 2.用记事本 ...
- How Visual Studio 2012 Avoids Prompts for Source
[原文地址]:http://blogs.msdn.com/b/heaths/archive/2012/07/26/how-visual-studio-2012-avoids-prompts-for-s ...
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
首先,vector 在VC 2008 中的实现比较复杂,虽然vector 的声明跟VC6.0 是一致的,如下: C++ Code 1 2 template < class _Ty, ...