由于本项目中使用自定义菜单接口、获取用户信息接口、用户分组接口、消息发送接口等,都需要传入一个相同的参数access_token,其有效期 是7200秒(两小时),在有效期内可以使用,一旦access_token过期,需要重新通过调用微信接口获取。目前微信接口上面获取 access_token每日限额为2000次,如果Oauth2.0授权、发送主动消息、获取用户信息、群发信息之前都去获取,必然会达到该接口的频率 限制,因此需要把获取到的access_token存储起来,然后设置有效期,在有效期过期后再去获取,以保证access_token实时的有效性。详 细代码如下:

a.       新建xml文件,命名为XMLToken.xml。

<?xml version="1.0" encoding="utf-8"?>

<xml>

<AccessToken></AccessToken>

<AccessExpires></AccessExpires>

</xml>

b.       AccessToken实体结构如下:

public class AccessToken

{

public stringaccess_token { get; set;}

public int expires_in{ get; set; }

}

c.       获取AccessToken()和getJson()方法如下:

public AccessTokenGetAccessToken(string CorpId, string Secret)

{

string str_accessToken ="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+ CorpId +"&corpsecret=" +Secret;

string accessToken = GetJson(str_accessToken);

AccessToken getAccessToken =js.Deserialize<AccessToken>(accessToken);

return getAccessToken;

}

public stringGetJson(string url)

{

WebClient wc = newWebClient();

wc.Credentials = CredentialCache.DefaultCredentials;

wc.Encoding = Encoding.UTF8;

string returnText = wc.DownloadString(url);

if (returnText.Contains("errcode"))

{

//可能出错

}

return returnText;

}

d.       校验AccessToken是否过期方法 GetExistAccessToken()如下:

public stringGetExistAccessToken()

{

string filepath = System.Web.HttpContext.Current.Server.MapPath("XMLToken.xml");

StreamReader str = newStreamReader(filepath ,System.Text.Encoding.UTF8);

XmlDocument xml = newXmlDocument();

xml.Load(str);

str.Close();

str.Dispose();

string token = xml.SelectSingleNode("xml").SelectSingleNode("AccessToken").InnerText;

string time = xml.SelectSingleNode("xml").SelectSingleNode("AccessExpires").InnerText;

if (string.IsNullOrEmpty(token)||string.IsNullOrEmpty(time))

{

AccessToken getAccessToken =GetAccessToken(str_CorpId, str_Secret);

xml.SelectSingleNode("xml").SelectSingleNode("AccessToken").InnerText =getAccessToken.access_token;

DateTime _accessExpires =DateTime.Now.AddSeconds(getAccessToken.expires_in);

xml.SelectSingleNode("xml").SelectSingleNode("AccessExpires").InnerText =_accessExpires.ToString();

xml.Save(filepath);

token = getAccessToken.access_token;

}

else if (!string.IsNullOrEmpty(token) || !string.IsNullOrEmpty(time))

{

DateTime AccessExpires =Convert.ToDateTime(time);

if (DateTime.Now> AccessExpires)

{

AccessToken getAccessToken =GetAccessToken(str_CorpId, str_Secret);

xml.SelectSingleNode("xml").SelectSingleNode("AccessToken").InnerText =getAccessToken.access_token;

DateTime _accessExpires =DateTime.Now.AddSeconds(getAccessToken.expires_in);

xml.SelectSingleNode("xml").SelectSingleNode("AccessExpires").InnerText =_accessExpires.ToString();

xml.Save(filepath);

token = getAccessToken.access_token;

}

}

return token;

}

微信全局获取并缓存Accesstoken的值的更多相关文章

  1. Spring Boot中微信全局token的缓存实现

    为什么要缓存token? 这里的token指的是微信JSAPI中基础支持的ACCESS_TOKEN,并非网页授权ACCESS_TOKEN.网页授权Token每天的调用次数没有限制,不需要缓存. 接口 ...

  2. 微信公众号的搭建-第四天(2)-获取并缓存access_token

    1. 什么是access_token? 为了使第三方开发者能够为用户提供更多更有价值的个性化服务,微信公众平台 开放了许多接口,包括自定义菜单接口.客服接口.获取用户信息接口.用户分组接口.群发接口等 ...

  3. 单例设计模式全局缓存accessToken

    使用微信JS-SDK开发的小伙伴们,看文档经常会看到这样一句话:(下面是微信开发文档的一部分原话截图) 这句话就是:开发者必须在自己的服务全局缓存access_token,jsapi_ticket 下 ...

  4. php开发微信支付获取用户地址

    http://mp.weixin.qq.com/s/uNpWE_Z5RZ48PDIWkmGBYQ 使用微信获取地址信息是和微信支付一道申请的,微信支付申请通过,就可以使用该功能. 微信商城中,使用微信 ...

  5. 如何获取byte的各个bit值以及常见位操作

    项目中通过信号采集板的数据获取车上仪表盘指示灯的信息,将接收到的数据转成byte后,还要将每一个Byte的各个Bit值分离出来,这样才知道每个bit的值代表的具体信息.这里记录下如何获取byte的各个 ...

  6. [转] Android进阶——安卓接入微信,获取OpenID

    PS: sendAuthRequest拿到code,通过code拿到access_token和openId,access_token可以拿到用户的信息 http://blog.csdn.net/hao ...

  7. 转:微信开发获取地理位置实例(java,非常详细,附工程源码)

    微信开发获取地理位置实例(java,非常详细,附工程源码)   在本篇博客之前,博主已经写了4篇关于微信相关文章,其中三篇是本文基础: 1.微信开发之入门教程,该文章详细讲解了企业号体验号免费申请与一 ...

  8. 绑定微信以及获取openId

    由于公司最近在做一个微信公众号的项目,需要获取用户openId,我再一次踏入了微信的坑! 先在这里告诫后来的同志,如果一样要开始做有关微信的东西,最好是有前辈,或者直接看完文档,不懂或者纳闷的地方直接 ...

  9. 微信授权获取用户openid前端实现

    近来,倒霉的后台跟我说让我拿个openid做微信支付使用,寻思很简单,开始干活.   首先引导用户打开如下链接,只需要将appid修改为自己的就可以,redirect_url写你的重定向url   h ...

随机推荐

  1. 输入输出流和String的混合使用-替换信息

    ---恢复内容开始--- package demo; import java.io.BufferedReader; import java.io.BufferedWriter; import java ...

  2. 使用DFS求任意两点的所有路径

    先上代码: public static void findAllPaths(Integer nodeId,Integer targetNodeId, Map<Integer,ArrayList& ...

  3. Java高级架构师(一)第21节:通过X-gen生成商品模块

    package com.sishuok.architecture1.goodsmgr.vo; import com.sishuok.architecture1.common.vo.BaseModel; ...

  4. 数据访问与sql语句的管理(一)

    在开发过程中数据访问是必不可少的.每个框架都会有自己数据访问机制.大家在一般的情况下会为自己的框架配备2套数据访问机制,ORM和DataHelper.当然,根据项目的需要有时候也可能只一种. 其实这2 ...

  5. 查看Java代码对应的汇编指令又一利器,JITWatch 转

    http://www.tuicool.com/articles/IRrIRb3 时间 2015-05-13 08:00:00  Liuxinglanyue's Blog 原文  http://java ...

  6. 关于css解决俩边等高的问题(等高布局)

    等高布局 前段时间公司需哦一个后台管理系统,左侧是导航栏,右侧是content区域.然厚刚开始用的是js 去控制的,但是当页面的椰蓉过长的时候,有与js单线程,加载比较慢,就会有那么一个过程,查找了很 ...

  7. Java使用纯真IP库获取IP对应省份和城市

    原文:http://blog.csdn.net/chwshuang/article/details/78027873?locationNum=10&fps=1 Java使用纯真IP库获取IP对 ...

  8. 如何判断一个请求是不是ajax请求

    原文:http://blog.csdn.net/easy_is_good/article/details/53609057 public boolean isAjaxRequest(HttpServl ...

  9. vue假全家桶升级方式,形成类似于小程序的路径管理(新增require-css与require-text)

    1.路径布局大致就是这样,完全模拟小程序,主要是靠require来做到的 2.首先index.html是这样的(配置js和css没有用requireJs主要是方便而且载入什么组件比较清晰) <! ...

  10. leetcode第一刷_Edit Distance

    最小编辑距离.非常经典的问题.今年微软实习生的笔试有一个这个的扩展版,牵扯到模板之类的,当时一行代码也没写出来. . dp能够非常优雅的解决问题.状态转移方程也非常明白.用pos[i][j]表示wor ...