微信全局获取并缓存Accesstoken的值

原创 2015年08月25日 17:46:09

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

        }

微信&java 开发6 全局缓存access_token与jsapi_ticket

access_token与jsapi_ticket 需要全局缓存为什么我就不说了,既然来看了就应该知道了 我用的是spring容器加载完毕后监听器,就是容器加载完毕调用 ApplicationLis...
  • cnm_1314
  • cnm_1314
  • 2016年05月12日 13:40
  • 6721

微信开发笔记之缓存access_token

官方解释:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。acce...
  • JustHaveTry
  • JustHaveTry
  • 2015年09月10日 16:23
  • 4918

采用java单例模式实现微信AccessToken和Jsapi_ticket缓存支持

一、单例模式介绍 java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例、饿汉式单例、登记式单例。   单例模式有以下特点:   1、单例类只能有一个实例。...
  • honghailiang888
  • honghailiang888
  • 2016年02月22日 09:58
  • 2397

微信公众号开发:access_token和jsapi_ticket的缓存和数据库存储方案

微信JS—SDK开放接口给我们的开发提供了很大的便利,以及更多的可能,鼓舞了我们做web app的信心。初看接口,感觉不是很简单,特别是还有demo做实例;由于太缺乏经验,后面自己做的过程中还是花费了...
  • hzqtx12345
  • hzqtx12345
  • 2015年05月30日 15:03
  • 6020

微信开发第二篇:获取全局access_token

public function get_access_token(){     //开发者的appid和appsecret     $appid = 'xxxxx';     $appsecre...
  • Web_My_Dream
  • Web_My_Dream
  • 2016年09月01日 11:21
  • 1146

缓存微信accesstoken实现

一、背景 微信公众号调用接口的accesstoken,失效期为7200秒,所以我们需要把它缓存起来,不用每次都去获取新的。 二、方案 将accesstoken保存再redis中,设置...
  • u010132124
  • u010132124
  • 2017年02月16日 16:13
  • 214

微信开发--如何存储并定时更新access_token

微信获取accessToken accessToken有2个小时时间限制。 分三步判断 1. 判断数据库中是否有,没有则插入accessToken,和过期时间 2. 判断数据库中accessT...
  • yangshuolll
  • yangshuolll
  • 2017年11月21日 00:07
  • 214

微信开发 access_token 缓存方法

class class_weixin { var $appid = APPID; var $appsecret = APPSECRET; //构造函数,获取Access To...
  • u011213403
  • u011213403
  • 2016年07月25日 12:01
  • 1401

java中获取微信公众号的access_token

闲暇时间写了个简单的获取微信公众号的access_token,当然只是简单的获取,而且有效期是两小时,之后可以考虑使用定时任务定时获取access_token,废话不多说了,贴上代码咯 im...
  • ll840768874
  • ll840768874
  • 2016年10月22日 16:46
  • 4887

微信企业号开发之获取AccessToken

在做企业号开发的时候,很有可能会调用微信提供的js接口(JS-SDK),但是调用微信js接口需要使用临时票据jsapi_ticket,而jsapi_ticket又是通过AccessToken来获取,那...
  • leonMary
  • leonMary
  • 2015年05月13日 14:55
  • 5842
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:微信全局获取并缓存Accesstoken的值
举报原因:
原因补充:

(最多只允许输入30个字)