系统没有更新跟ajax获取access tokenn有关吗

C#微信公众平台开发—access_token的获取存储与更新 - C#技巧 - 大学IT网
当前位置: >
> C#微信公众平台开发—access_token的获取存储与更新
关键词:&&阅读(9501) 赞(16)
[摘要]本文是对C#微信公众平台开发—access_token的获取存储与更新的讲解,对学习C#编程技术有所帮助,与大家分享。
一、什么是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);
if (WXApi.TokenExpired(user.access_token)) //access_token过期
access_token = WXApi.GetToken(user.AppID, user.AppSecret);
return user.access_
MSSQLHelper.ExecuteSql(string.Format("update SWX_Config set access_token='{0}' where UserName='{1}'", access_token, user.UserName));
return access_
#endregion
C#微信公众平台开发源码在我的博客首页左侧下面
相关C#技巧推荐后使用快捷导航没有帐号?
主题帖子积分最后登录&
达人级萤石控, 积分 60, 距离下一级还需 140 积分
@Shmily 现在用的是莹石自己的demo,短信验证提示验证成功之后,在点击“进入设备列表页面”是要输入accessToken的,然后我查看文档3.5
意思是组建一个json,然后我调用SignUtil.getGetAccessTokenSign(&&);方法,就组建了这样一个json数据,
文档中说传一个手机号码 和useid,我根本就没找到获取accesstoken的方法,还有EzvizAPI.getAccessToken(),这个方法,我不知道到底用哪个?
我就是想问,短信验证成功之后,要怎么样获取accesstoken。
谢谢,很急得 ,希望技术人员看到这个问题 帮忙解答下,可能这个问题对你来说很白痴。
主题帖子积分最后登录&
您好!获取accessToken在萤石云平台·接口文档的 3.5接口--- 私有云获取用户accessToken
主题帖子积分最后登录&
达人级萤石控, 积分 60, 距离下一级还需 140 积分
达人级萤石控
您好!获取accessToken在萤石云平台·接口文档的 3.5接口--- 私有云获取用户accessToken ...
好吧,3.5我已经看了, 我想问的是请求actoken是不是先要获取系统时间,然后计算sign。
主题帖子积分最后登录&
达人级萤石控, 积分 61, 距离下一级还需 139 积分
达人级萤石控
HttpAgent.getInstance().getGetAccessTokenSign(&xlinklxy&,
& & & & & & & && &&&&&, new TextHttpResponseHandler() {
& & & & & & & & & & & & @Override
& & & & & & & & & & & & public void onSuccess(int arg0, Header[] arg1,
& & & & & & & & & & & & & & & & String arg2) {
& & & & & & & & & & & && &&&// {&result&:
& & & & & & & & & & & && &&&// {&data&:{&accessToken&:&at.clvc93jp5brettp818t5odq05k0v1zpo-2rrdgvqjlv-1crdskr-zigqqhuj1&,&userId&:&f0e87fe&}
& & & & & & & & & & & && &&&// ,&code&:&200&,&msg&:&操作成功!&}}
& & & & & & & & & & & && &&&try {
& & & & & & & & & & & & & & & & // JSONObject result = new JSONObject(arg2);
& & & & & & & & & & & & & & & & JSONObject result = new JSONObject(arg2)
& & & & & & & & & & & & & & & & & & & & .getJSONObject(&result&);
& & & & & & & & & & & & & & & & if (result.getString(&code&).equals(&200&)) {
& & & & & & & & & & & & & & & && &&&JSONObject data = result
& & & & & & & & & & & & & & & & & & & && &&&.getJSONObject(&data&);
& & & & & & & & & & & & & & & && &&&String token = data
& & & & & & & & & & & & & & & & & & & && &&&.getString(&accessToken&);
& & & & & & & & & & & & & & & && &&&mEzvizAPI.setAccessToken(token);
& & & & & & & & & & & & & & & && &&&Intent toIntent = new Intent(
& & & & & & & & & & & & & & & & & & & && &&&LoginSelectActivity.this,
& & & & & & & & & & & & & & & & & & & && &&&CameraListActivity.class);
& & & & & & & & & & & & & & & && &&&toIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
& & & & & & & & & & & & & & & && &&&LoginSelectActivity.this
& & & & & & & & & & & & & & & & & & & && &&&.startActivity(toIntent);
& & & & & & & & & & & & & & & && &&&AndroidpnUtils
& & & & & & & & & & & & & & & & & & & && &&&.startPushServer(LoginSelectActivity.this);
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & & & & & XlinkUtils.shortTips(arg2);
& & & & & & & & & & & && &&&} catch (JSONException e) {
& & & & & & & & & & & & & & & & e.printStackTrace();
& & & & & & & & & & & && &&&}
& & & & & & & & & & & && &&&System.out.println();
& & & & & & & & & & & & }
& & & & & & & & & & & & @Override
& & & & & & & & & & & & public void onFailure(int arg0, Header[] arg1,
& & & & & & & & & & & & & & & & String arg2, Throwable arg3) {
& & & & & & & & & & & && &&&// TODO Auto-generated method stub
& & & & & & & & & & & && &&&System.out.println();
& & & & & & & & & & & & }
& & & & & & & && &&&});
主题帖子积分最后登录&
达人级萤石控, 积分 61, 距离下一级还需 139 积分
达人级萤石控
&&public void getGetAccessTokenSign(String userId, String phone,
& & & && &&&TextHttpResponseHandler handler) {
& & & & String json = SignUtil.getGetAccessTokenSign(userId, phone);
& & & & StringEntity entity =
& & & & try {
& & & && &&&entity = new StringEntity(json, &UTF-8&);
& & & & } catch (UnsupportedEncodingException e) {
& & & && &&&e.printStackTrace();
& & & & client.post(EzvizApplication.application, url, entity, &text/html&,
& & & & & & & & handler);
主题帖子积分最后登录&
达人级萤石控, 积分 61, 距离下一级还需 139 积分
达人级萤石控
SignUtil.getGetAccessTokenSign 是demo提供的 其他的是自己写的 http post接口&&http 的body 就是把在文档的json串封装成StringEntity 然后http请求提交
主题帖子积分最后登录&
达人级萤石控, 积分 61, 距离下一级还需 139 积分
达人级萤石控
基本上除了观看摄像头,报警推送之类的功能使用sdk外 ,其他的根据文档 自己拼凑成 http post请求,进行获取数据
主题帖子积分最后登录&
潜力级萤石控, 积分 8, 距离下一级还需 42 积分
潜力级萤石控
基本上除了观看摄像头,报警推送之类的功能使用sdk外 ,其他的根据文档 自己拼凑成 http post请求,进行获 ...
http&&post请求的url是哪个?
主题帖子积分最后登录&
达人级萤石控, 积分 78, 距离下一级还需 122 积分
达人级萤石控
http&&post请求的url是哪个?
:443/api/method
主题帖子积分最后登录&
潜力级萤石控, 积分 16, 距离下一级还需 34 积分
潜力级萤石控
public void getGetAccessTokenSign(String userId, String phone,
& & & && &&&TextHttpResponseHandler handle ...
我是小白,有没有完整的,发一个给我
萤石工程商
萤石工程商C#微信公众平台开发之access_token的获取存储与更新
作者:秋荷雨翔
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了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。
数据库设计(表名SWX_Config):
四、代码:
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);
if (WXApi.TokenExpired(user.access_token)) //access_token过期
access_token = WXApi.GetToken(user.AppID, user.AppSecret);
return user.access_
MSSQLHelper.ExecuteSql(string.Format("update SWX_Config set access_token='{0}' where UserName='{1}'", access_token, user.UserName));
return access_
#endregion
精彩专题分享:,欢迎大家学习。
以上就是本文的全部内容,希望对大家进行微信公众平台开发有所帮助。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具2647人阅读
这真是一个巨大的坑,为了避免以后踩到同样的坑和帮助刚接触这块的同学快速脱坑,我花了些时间研究问题的来龙去脉,提供了一个不太完美的解决方案,以及未来规划的完美解决方案。
在开发微信jssdk的图像接口功能时,测试环境和回归环境都ok。但是更新到预发布环境后,功能就异常了,一直报图片下载失败。最后快到发布时间时,功能又恢复正常了。于是按照常规流程进行了发布。过了两天,收到线上反馈的问题:用户刚开始还能正常传图,用着用着就突然报错说传图失败,然后就一直不能用了。我们在测试环境模拟测试,功能又是正常的:(
这种偶现的问题一般都很难迅速定位到具体原因,而且本地和测试环境正常,预发布环境和线上异常,但是又不能进行调试。于是只能根据代码逻辑进行猜测性判断和尝试修复,中间走了大量的弯路,最后发现,删除存储access_token的redis值,再使用时功能正常。
问题暂时解决了,但这不是长久之计。于是我花了点时间阅读,发现这果真是个大坑啊!官方文档原文如下:
第一个红色框里的内容,我测试了三次,第一次连续请求13遍,access_token发生了变化;第二次连续请求12遍,access_token发生了变化;第三次连续请求19遍,access_token发生了变化。(坑一)
第二个红色框里的内容,我们有开发环境,测试环境,回归环境,预发布环境,正式环境,都是同一套代码,同一个微信号,相当于每个环境都是单独的中控服务器。(坑二)
搞清楚问题后,我们通过一些手段尝试性的触发问题现象:
1、测试环境下,清空access_token的redis数据。
2、正常测试,功能ok,查看access_token的redis内容,这里假设值为A。
3、手动调用接口刷新access_token,大概十几次后,值变化为B。
4、再次正常测试,发现功能异常(因为此时存储在redis的access_token已经过期)。
5、清空access_token的redis数据,再次测试,功能又恢复正常。
现在问题终于变成必现的了:)
现在我们搞清楚问题的原因是存储在redis的access_token可能在很短的时间内过期(因为有太多中控服务器啦),但是我们一般设置的有效期都接近或等于7200s,这就导致一旦出现问题的话,如果不清理redis,问题就会持续2小时左右,这简直就是灾难!
目前想到的比较理想的解决方案就是:服务器发现功能异常时,刷新access_token并更新redis,然后再次调用接口。这种容错机制本来是微信的事-_-!
正如开头所说,这的确是个巨坑,未来只能期望微信获取access_token的接口能够完善:
1、说好的2小时过期时间,就得保证2小时内不过期
2、返回的过期时间字段为还剩多少秒过期,而不是每次都返回7200s
然而微信并没有
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:111225次
积分:2058
积分:2058
排名:第15010名
原创:85篇
转载:89篇
评论:28条
(2)(31)(2)(5)(4)(1)(1)(4)(7)(4)(9)(7)(8)(2)(6)(16)(5)(4)(1)(8)(10)(26)(9)(2)

我要回帖

更多关于 js获取access token 的文章

 

随机推荐