微信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. spark优化之并行度

    这个其实我前面已经记录过了,这里在记录一下. 我可以通过参数人为的来控制分区大小,增加分区中即可增加任务的并行度,并行度高自然运行的就快了嘛. 官方推荐集群中每个cpu并行的任务是2-3个(也就是2- ...

  2. 几种常见类的使用(System,Runtime,Math,Date,Calendar,Random)

    一:System 1.介绍 System:类中的方法和属性都是静态的. out:标准输出,默认是控制台. in:标准输入,默认是键盘. 2.properties 获取系统属性信息:Properties ...

  3. 基于CommonsCollections4的Gadget分析

    基于CommonsCollections4的Gadget分析 Author:Welkin 0x1 背景及概要 随着Java应用的推广和普及,Java安全问题越来越被人们重视,纵观近些年来的Java安全 ...

  4. C语言应用操作之文件

    文件是C语言中德中的重点,小编在学习C语言基础知识的时候,大多数的输入输出操作是在屏幕上进行的,现在总算在文件学习上感觉到高大上的样纸.在以前数据量很小时,我们通常将信息从键盘在屏幕上进行输入输出的, ...

  5. JVM7、8参数详解及优化

    1. JVM堆内存划分 这两天看到下面这篇文章的图不错. 一图读懂JVM架构解析 1.1 JDK7及以前的版本 其中最上一层是Nursery内存,一个对象被创建以后首先被放到Nursery中的Eden ...

  6. @Transactional导致AbstractRoutingDataSource动态数据源无法切换的解决办法

    上午花了大半天排查一个多数据源主从切换的问题,记录一下: 背景: 项目的数据库采用了读写分离多数据源,采用AOP进行拦截,利用ThreadLocal及AbstractRoutingDataSource ...

  7. HDU 4750 Count The Pairs (2013南京网络赛1003题,并查集)

    Count The Pairs Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others ...

  8. Revit API通过相交过滤器找到与风管相交的对象。

    相交过滤器的应用,比几何相交法简便.Excluding剔除 //找到与风管相交的对象,通过相交过滤器. [TransactionAttribute(Autodesk.Revit.Attributes. ...

  9. delphi:临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别

    临界区对象TCriticalSection(Delphi) 与 TRtlCriticalSection 的区别 TRtlCriticalSection 是一个结构体,在windows单元中定义: 是I ...

  10. WordPress主题开发:开启侧边栏小工具功能

    步骤一:在主题的functions.php中,添加一段代码,开启侧边栏功能,代码如下: <?php //参数 $args = array( 'name' => __( '主侧边栏'), ' ...