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}