access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒(两个小时),微信获取access_token接口每日限制调用2000次。
(一)access_token的作用
access_token由公众号的AppID和AppSecret组成,所以具有识别公众号的作用。
(二)access_token的特点
access_token存储至少要保留512个字符空间。access_token的有效期目前为2个小时,重复获取将导致上次获取的access_token失效。
(三)access_token的存储调用策略
access_token在后期应用开发中应采取的策略,如图所示,将access_token存储到中控服务器,所有需要用到该参数的程序都应访问中控服务器获取access_token,中控服务器判断当前access_token是否有效并刷新即可。
(四)接口调用请求说明
http请求方式: GET https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
(五)获取access_token
1 /// <summary> 2 /// GET方式请求URL,并返回AccessTokenResult类 3 /// </summary> 4 public static AccessTokenResult GetJson<AccessTokenResult>(string url) 5 { 6 string returnText = HttpGet(url); 7 8 JavaScriptSerializer js = new JavaScriptSerializer(); 9 10 AccessTokenResult result = js.Deserialize<AccessTokenResult>(returnText); 11 12 return result; 13 }
1 /// <summary> 2 /// 获取凭证接口 3 /// </summary> 4 private static AccessTokenResult GetToken(string appid, string secret, string grant_type = "client_credential") 5 { 6 var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", grant_type, appid, secret); 7 8 return HttpService.GetJson<AccessTokenResult>(url); 9 }
1 //token缓存键值对 2 private static Dictionary<string, ComponentAccessTokenResult> tokenCache = new Dictionary<string, ComponentAccessTokenResult>(); 3 4/// <summary> 5/// 获取缓存令牌 6/// </summary> 7public static string GetAccessToken(string appid, string secret) 8{ 9 //token缓存 10 ComponentAccessTokenResult result = null; 11 //判断缓存是否存在键:appid,就将缓存中的token赋给result 12 if (tokenCache.ContainsKey(appid)) 13 { 14 result = tokenCache[appid]; 15 } 16 //不存在则获取token 17 if (result == null) 18 { 19 AccessTokenResult token = GetToken(appid, secret); 20 21 result = new ComponentAccessTokenResult() { 23 //access_token 24 component_access_token = token.access_token, 25 //生成access_token的时间 26 dt = System.DateTime.Now, 27 }; 28 tokenCache.Add(appid, result); 29 } 30 //判断是否在有效期内,过期重新获取token 31 else if (System.DateTime.Compare(result.dt.AddSeconds(7200), System.DateTime.Now) < 0) 32 { 33 AccessTokenResult token = GetToken(appid, secret); 34 result.component_access_token = token.access_token; 35 result.dt = System.DateTime.Now; 36 tokenCache[appid] = result; 37 } 38 return result.component_access_token; 39}