C#微信公众号开发——获取access_token

时间:2023-03-22 12:04:02

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是否有效并刷新即可。

C#微信公众号开发——获取access_token

(四)接口调用请求说明

http请求方式: GET
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET

(五)获取access_token

 /// <summary>
/// GET方式请求URL,并返回AccessTokenResult类
/// </summary>
public static AccessTokenResult GetJson<AccessTokenResult>(string url)
{
string returnText = HttpGet(url); JavaScriptSerializer js = new JavaScriptSerializer(); AccessTokenResult result = js.Deserialize<AccessTokenResult>(returnText); return result;
}
 /// <summary>
/// 获取凭证接口
/// </summary>
private static AccessTokenResult GetToken(string appid, string secret, string grant_type = "client_credential")
{
var url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type={0}&appid={1}&secret={2}", grant_type, appid, secret); return HttpService.GetJson<AccessTokenResult>(url);
}
 //token缓存键值对
private static Dictionary<string, ComponentAccessTokenResult> tokenCache = new Dictionary<string, ComponentAccessTokenResult>(); /// <summary>
/// 获取缓存令牌
/// </summary>
public static string GetAccessToken(string appid, string secret)
{
//token缓存
ComponentAccessTokenResult result = null;
11  //判断缓存是否存在键:appid,就将缓存中的token赋给result
if (tokenCache.ContainsKey(appid))
{
14   result = tokenCache[appid];
}
//不存在则获取token
if (result == null)
{
19   AccessTokenResult token = GetToken(appid, secret); result = new ComponentAccessTokenResult() {
23       //access_token
      component_access_token = token.access_token,
      //生成access_token的时间
      dt = System.DateTime.Now,
    };
tokenCache.Add(appid, result);
}
  //判断是否在有效期内,过期重新获取token
else if (System.DateTime.Compare(result.dt.AddSeconds(), System.DateTime.Now) < )
{
33   AccessTokenResult token = GetToken(appid, secret);
result.component_access_token = token.access_token;
result.dt = System.DateTime.Now;
tokenCache[appid] = result;
}
return result.component_access_token;
}