由于本项目中使用自定义菜单接口、获取用户信息接口、用户分组接口、消息发送接口等,都需要传入一个相同的参数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. hdu4565之矩阵快速幂

    So Easy! Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total S ...

  2. Bootstrap标签Tabs

    <!--标签--> <ul class="nav nav-tabs" role="tablist"> <li class=&quo ...

  3. python中单星号(*)和双星号(**)的使用

    1.单星号*:对元组解包:接收可变参数 2.双星号**:对字典解包:接收可变参数 python函数的五类参数类型及出现顺序:必选参数.默认参数.可变参数.命名关键字参数.关键字参数 参考: https ...

  4. Oracle中分页查询语句的写法

    要动态的变化分页查询的条件,比如pageNow 这个变量表示的是当前是第几页, oracle分页有通用写法,假设一页5行 select * from ( select t.*,rownum rn fr ...

  5. webservice ssl双向认证配置

    1.在tomcat中安装axis2插件 2.生成证书,用jdk自带的keytool 服务端 keytool -genkey -alias Server -dname "CN=192.168. ...

  6. Java笔记4:JDBC纯驱动方式连接Oracle

    JDBC纯驱动方式连接Oracle 1 下载Oracle提供的驱动程序包 下载地址: http://www.oracle.com/technetwork/database/enterprise-edi ...

  7. 数据写入到TXT文档中

    public class FileWrite { public File file; public FileOutputStream stream = null; //每次写入都会覆盖之前的内容 pu ...

  8. [HTML5] Render Hello World Text with Custom Elements

    Custom elements are fun technology. In this video, you will learn how to set one up and running in l ...

  9. Java 9的14个新特性总结

    Java 9 包含了丰富的特性集.虽然Java 9没有新的语言概念,但是有开发者感兴趣的新的API和诊断命令. 我们将快速的,着重的浏览其中的几个新特性:  模块化系统–Jigsaw 项目 模块化是一 ...

  10. React Router V4发布

    React Router V4 正式版发布,该版本相较于前面三个版本有根本性变化,遵循 Just Component 的 API 设计理念. 本次升级的主要变更有: 声明式 Declarative 可 ...