微信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 缓存方法的更多相关文章

  1. 使用缓存Memcache存储更新微信access token

    关键字:Memcache access_token 更新 存储 7200 本文介绍如何使用缓存Memcache存储及更新 access token的方法. 一.Access Token access_ ...

  2. 微信公众平台开发(112) 自动更新微信access token

    关键字:Memcache access_token 更新 存储 7200 本文介绍如何存储及更新 access token的方法. 一.Access Token access_token是公众号的全局 ...

  3. 微信access token过期

    两台服务器使用同一个微信账号(同一个app id) 时,当其中一台服务器向微信请求access token时,会造成另一台服务器的access token过期

  4. C# v3微信 access token 过期处理的问题

    //记录access token 申请时的时间 private static DateTime GetAccessToken_Time; /// <summary> /// 过期时间为72 ...

  5. Force.com微信开发系列(四)申请Access Token及自定义菜单之创建菜单

    在微信接口开发中,许多服务的使用都离不开Access Token,Access Token相当于打开这些服务的钥匙,正常情况下会在7200秒内失效,重复获取将导致上次获取的Token失效,本文将首先介 ...

  6. .NET微信开发通过Access Token和OpenID获取用户信息

    本文介绍如何获得微信公众平台关注用户的基本信息,包括昵称.头像.性别.国家.省份.城市.语言. 本文的方法将囊括订阅号和服务号以及自定义菜单各种场景,无论是否有高级接口权限,都有办法来获得用户基本信息 ...

  7. 微信开发-ACCESS TOKEN 过期失效解决方案

    微信开发-ACCESS TOKEN 过期失效解决方案 起因:因为access_token的重要性,开发过微信的都知道,但是他有自己的生命周期,官方解释为:"有效期为7200秒",一 ...

  8. 微信公众平台开发(26) ACCESS TOKEN

    本文介绍微信公众平台下Access Token的概念及获取方法. 一.Access Token access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token.正常 ...

  9. 微信公众平台开发视频教程-03-获取Access Token和获取微信服务器IP,添加微信菜单

    1 获取access token 此token是以后每次调用微信接口都会带上的票据,token是公众号全局唯一票据,在调用其他接口之前都需要先得到token,taoken长度至少512个字符,通常用s ...

随机推荐

  1. 【Java】 大话数据结构(9) 树(二叉树、线索二叉树)

    本文根据<大话数据结构>一书,对Java版的二叉树.线索二叉树进行了一定程度的实现. 另: 二叉排序树(二叉搜索树) 平衡二叉树(AVL树) 二叉树的性质 性质1:二叉树第i层上的结点数目 ...

  2. 001.DHCP简介

    一 DHCP概念 DHCP指动态主机配置协议,是一个局域网的网络协议,使用UDP协议工作. 二 应用 为大量客户机自动分配地址,提供集中管理 减轻管理和维护成本,提高网络配置效率 三 分配的主要信息 ...

  3. spring+springmvc+hibernate 礼品管理系统

    spring+springmvc+hibernate template礼品管理系统 1.简单介绍 如标题所示,这篇文章简单写了一个基于spring+springmvc+hibernate templa ...

  4. java 获取当前方法名

    String _thisMethodName = new Exception().getStackTrace()[0].getMethodName();// 获得当前的方法名

  5. POJ1274 The Perfect Stall[二分图最大匹配 Hungary]【学习笔记】

    The Perfect Stall Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 23911   Accepted: 106 ...

  6. hdu 3534 树形dp ***

    题意:统计一棵带权树上两点之间的最长距离以及最长距离的数目 链接:点我 首先统计出结点到叶子结点的最长距离和次长距离. 然后找寻经过这个点的,在这个为根结点的子树中的最长路径个数目. #include ...

  7. C#开发利器 Linq Pad 相关

    一,下载 Linq Pad 是平时在开发的过程中使用的利器,为什么这样说了. 你不用打开VS, 直接敲代码就行,F5运行即可以看到结果. 而且支持Linq, 是不错的选择. 最近想开发一个日志分析工具 ...

  8. Codeforces Round #258 (Div. 2) E. Devu and Flowers 容斥

    E. Devu and Flowers 题目连接: http://codeforces.com/contest/451/problem/E Description Devu wants to deco ...

  9. hdu 5821 Ball 贪心

    Ball 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5821 Description ZZX has a sequence of boxes nu ...

  10. CentOS下使用LVM进行分区(转)

    说明:为什么抄,因为这篇文章图文并茂,所有测试都在CentOS 6和7测试过. 许多Linux使用者安装操作系统时都会遇到这样的困境:如何精确评估和分配各个硬盘分区的容量,如果当初评估不准确,一旦系统 ...