如何更新微信access tokenToken

&&国之画&&&& &&
版权所有 京ICP备号-2
迷上了代码!经检测你所在的网络可能存在爬虫,因资源限制,我们只能拒绝你的请求。
如果你是推酷的用户,可以以继续访问使用。
如有疑问,可将IP信息发送到
请求解封。C#微信公众平台开发—access_token的获取存储与更新
一、什么是access_token?
& & access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。由于获取access_token的api调用次数非常有限,建议开发者全局存储与更新access_token,频繁刷新access_token会导致api调用受限,影响自身业务。
二、要解决的问题
1、如何获取access_token。
2、由于access_token的有效期为7200秒,即2小时,并且重复获取将导致上次获取的access_token失效,获取access_token的api调用次数非常有限,所以要解决如何全局存储与更新access_token。
1、将access_token存储在中。
2、何时更新access_token呢?当access_token失效的时候更新,那么怎么判断access_token有没有失效呢?使用当前的access_token请求微信接口,获取自定义菜单,如果返回的errcode为42001,则说明access_token已经失效,这时再重新获取access_token。
四、代码:
1、Http请求代码(HttpRequestUtil类):
#region 请求Url,不发送数据
/// &summary&
/// 请求Url,不发送数据
/// &/summary&
public static string RequestUrl(string url)
& & return RequestUrl(url, &POST&);
#endregion
#region 请求Url,不发送数据
/// &summary&
/// 请求Url,不发送数据
/// &/summary&
public static string RequestUrl(string url, string method)
& & // 设置参数
& & HttpWebRequest request = WebRequest.Create(url) as HttpWebR
& & CookieContainer cookieContainer = new CookieContainer();
& & request.CookieContainer = cookieC
& & request.AllowAutoRedirect =
& & request.Method =
& & request.ContentType = &text/html&;
& & request.Headers.Add(&charset&, &utf-8&);
& & //发送请求并获取相应回应数据
& & HttpWebResponse response = request.GetResponse() as HttpWebR
& & //直到request.GetResponse()程序才开始向目标网页发送Post请求
& & Stream responseStream = response.GetResponseStream();
& & StreamReader sr = new StreamReader(responseStream, Encoding.UTF8);
& & //返回结果网页(html)代码
& & string content = sr.ReadToEnd();
#endregion
2、辅助方法(Tools类):
namespace SWX.Utils
& & /// &summary&
& & /// 工具类
& & /// &/summary&
& & public class Tools
& & & & #region 获取Json字符串某节点的值
& & & & /// &summary&
& & & & /// 获取Json字符串某节点的值
& & & & /// &/summary&
& & & & public static string GetJsonValue(string jsonStr, string key)
& & & & & & string result = string.E
& & & & & & if (!string.IsNullOrEmpty(jsonStr))
& & & & & & {
& & & & & & & & key = &\&& + key.Trim('&') + &\&&;
& & & & & & & & int index = jsonStr.IndexOf(key) + key.Length + 1;
& & & & & & & & if (index & key.Length + 1)
& & & & & & & & {
& & & & & & & & & & //先截逗号,若是最后一个,截&}&号,取最小值
& & & & & & & & & & int end = jsonStr.IndexOf(',', index);
& & & & & & & & & & if (end == -1)
& & & & & & & & & & {
& & & & & & & & & & & & end = jsonStr.IndexOf('}', index);
& & & & & & & & & & }
& & & & & & & & & & result = jsonStr.Substring(index, end - index);
& & & & & & & & & & result = result.Trim(new char[] { '&', ' ', '\'' }); //过滤引号或空格
& & & & & & & & }
& & & & & & }
& & & & & &
& & & & #endregion
3、判断access_token是否过期(WXApi类):
#region 验证Token是否过期
/// &summary&
/// 验证Token是否过期
/// &/summary&
public static bool TokenExpired(string access_token)
& & string jsonStr = HttpRequestUtil.RequestUrl(string.Format(&https://api./cgi-bin/menu/get?access_token={0}&, access_token));
& & if (Tools.GetJsonValue(jsonStr, &errcode&) == &42001&)
#endregion
4、请求微信接口,获取access_token(WXApi类):
#region 获取Token
/// &summary&
/// 获取Token
/// &/summary&
public static string GetToken(string appid, string secret)
& & string strJson = HttpRequestUtil.RequestUrl(string.Format(&https://api./cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}&, appid, secret));
& & return Tools.GetJsonValue(strJson, &access_token&);
#endregion
5、全局存储与更新access_token(AdminUtil类):
#region 获取access_token
/// &summary&
/// 获取access_token
/// &/summary&
public static string GetAccessToken(PageBase page)
& & string access_token = string.E
& & UserInfo user = GetLoginUser(page);
& & if (user != null)
& & & & if (string.IsNullOrWhiteSpace(user.access_token)) //尚未保存过access_token
& & & & & & access_token = WXApi.GetToken(user.AppID, user.AppSecret);
& & & & else
& & & & & & if (WXApi.TokenExpired(user.access_token)) //access_token过期
& & & & & & {
& & & & & & & & access_token = WXApi.GetToken(user.AppID, user.AppSecret);
& & & & & & }
& & & & & & else
& & & & & & {
& & & & & & & & return user.access_
& & & & & & }
& & & & MSSQLHelper.ExecuteSql(string.Format(&update SWX_Config set access_token='{0}' where UserName='{1}'&, access_token, user.UserName));
& & return access_
#endregion
(window.slotbydup=window.slotbydup || []).push({
id: '2467140',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467141',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467142',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467143',
container: s,
size: '1000,90',
display: 'inlay-fix'
(window.slotbydup=window.slotbydup || []).push({
id: '2467148',
container: s,
size: '1000,90',
display: 'inlay-fix'微信开发笔记之缓存access_token
官方解释:access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。
使用redis缓存access_token、定时任务采用spring quartz。
逻辑见代码
更新access_token代码
*: updateAccessToken
*: 供 定时任务更新 AccessToken,同时更新 JsAPITicket
public synchronized boolean updateAccessToken()
throws Exception{
boolean updateRes = Boolean.FALSE;
for (int i = 0; i & WeiXinConstants.WEIXIN_CACHE_RETRY; i++) {
String accessTokenFromWeixin = getAccessTokenFromWeiXin();
String jsApiTicketFromWeiXin = this.getJsApiTicketFromWeiXin(accessTokenFromWeixin);
cacheManager.set(WeiXinConstants.WEIXIN_CACHE_KEY_JS_API_TICKET, jsApiTicketFromWeiXin);
updateRes = Boolean.TRUE;
if(updateRes){
} catch (Exception e) {
logger.error("定时任务更新 微信 端 access token 和 js api ticket 异常:",e);
return updateR
从缓存中获取access_token
*: getAccessToken
*: 获取 微信 AccessToken
public String getAccessToken()
throws Exception{
String accessToken = "";
accessToken =
cacheManager.getString(WeiXinConstants.WEIXIN_CACHE_KEY_ACCESS_TOKEN);
if(StringUtils.isBlank(accessToken)){
this.updateAccessToken();
accessToken =
cacheManager.getString(WeiXinConstants.WEIXIN_CACHE_KEY_ACCESS_TOKEN);
} catch (Exception e) {
logger.error(" 获取 微信 AccessToken 异常:",e);
return accessT
Spring quartz 的频率刚开始定为1小时一次,后代码中出现access_token 超时现象,最后检查代码未发现其他地方直接去微信服务器拿token的【因为只有从微信服务器端拿过后,缓存中token就会失效】,后又把定时频率调整为半小时一次,24X2=48,每天才48次,未出现access_token超时现象。。。。
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?

我要回帖

更多关于 access token是什么 的文章

 

随机推荐