微信公共平台开发5 .net
每次在于微信交互时,都要用到access_token,但是这个值限制的是有时间的,但是access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token改造一下。
另外需要说明的是access_token是变化的,有自己的周期,官方解释为:"有效期为7200秒",这就要求我们把获得的access_token存入一个物理文件或者Application中,请求到过期后修改这些内容,需要用的时候读出来.或者是存入数据库,到期时修改改access_token的值。
有些人可能想到了,如果过期我就在获得一个就好了,不用物理文件和Application也可以达到同样的效果,但是需要注意了微信平台对每天获得,access_token的次数也作了限制,一个用户出发多次,如果用户多,那肯定就超出了。所以我们还是按照以上的思路实现这些功能:
在此之前我们已经了解了获得access_token的方法(连接)http://www.cnblogs.com/QLJ1314/p/3838058.html,现在只需要保证它的随时更新就好了.
首先建立一个Access_token类
- 1 /// <summary>
- 2 ///Access_token 的摘要说明
- 3 /// </summary>
- 4 public class Access_token
- 5 {
- 6 public Access_token()
- 7 {
- 8 //
- 9 //TODO: 在此处添加构造函数逻辑
- 10 //
- 11 }
- 12 string _access_token;
- 13 string _expires_in;
- 14
- 15 /// <summary>
- 16 /// 获取到的凭证
- 17 /// </summary>
- 18 public string access_token
- 19 {
- 20 get { return _access_token; }
- 21 set { _access_token = value; }
- 22 }
- 23
- 24 /// <summary>
- 25 /// 凭证有效时间,单位:秒
- 26 /// </summary>
- 27 public string expires_in
- 28 {
- 29 get { return _expires_in; }
- 30 set { _expires_in = value; }
- 31 }
- 32 }

- 1 /// <summary>
- 2 ///Access_token 的摘要说明
- 3 /// </summary>
- 4 public class Access_token
- 5 {
- 6 public Access_token()
- 7 {
- 8 //
- 9 //TODO: 在此处添加构造函数逻辑
- 10 //
- 11 }
- 12 string _access_token;
- 13 string _expires_in;
- 14
- 15 /// <summary>
- 16 /// 获取到的凭证
- 17 /// </summary>
- 18 public string access_token
- 19 {
- 20 get { return _access_token; }
- 21 set { _access_token = value; }
- 22 }
- 23
- 24 /// <summary>
- 25 /// 凭证有效时间,单位:秒
- 26 /// </summary>
- 27 public string expires_in
- 28 {
- 29 get { return _expires_in; }
- 30 set { _expires_in = value; }
- 31 }
- 32 }

用下面的XML文件来存放access_token,建立一个XMLFile.xml,把Access_YouXRQ标签的内容写成一个已经过去的时间,这样我们好在一开始调用的时候,发现已经过期,然后获取新的access_token。
- 1 <?xml version="1.0" encoding="utf-8"?>
- 2 <xml>
- 3 <Access_Token>初始值可以随便写</Access_Token>
- 4 <Access_YouXRQ>1990/12/12 16:06:38</Access_YouXRQ>
- 5 </xml>
- 1 <?xml version="1.0" encoding="utf-8"?>
- 2 <xml>
- 3 <Access_Token>初始值可以随便写</Access_Token>
- 4 <Access_YouXRQ>1990/12/12 16:06:38</Access_YouXRQ>
- 5 </xml>
之前获得Access_token的方法改造一下,让他给Access_token实例赋值
- 1 public static Access_token GetAccess_token()
- 2 {
- 3 string appid = 你的appid ;
- 4 string secret = 你的secret;
- 5 string strUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
- 6 Access_token mode = new Access_token();
- 7
- 8 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl);
- 9
- 10 req.Method = "GET";
- 11 using (WebResponse wr = req.GetResponse())
- 12 {
- 13 HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();
- 14
- 15 StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
- 16
- 17 string content = reader.ReadToEnd();
- 18 //Response.Write(content);
- 19 //在这里对Access_token 赋值
- 20 Access_token token = new Access_token();
- 21 token = JsonHelper.ParseFromJson<Access_token>(content);
- 22 mode.access_token = token.access_token;
- 23 mode.expires_in = token.expires_in;
- 24 }
- 25 return mode;
- 26 }

- 1 public static Access_token GetAccess_token()
- 2 {
- 3 string appid = 你的appid ;
- 4 string secret = 你的secret;
- 5 string strUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
- 6 Access_token mode = new Access_token();
- 7
- 8 HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(strUrl);
- 9
- 10 req.Method = "GET";
- 11 using (WebResponse wr = req.GetResponse())
- 12 {
- 13 HttpWebResponse myResponse = (HttpWebResponse)req.GetResponse();
- 14
- 15 StreamReader reader = new StreamReader(myResponse.GetResponseStream(), Encoding.UTF8);
- 16
- 17 string content = reader.ReadToEnd();
- 18 //Response.Write(content);
- 19 //在这里对Access_token 赋值
- 20 Access_token token = new Access_token();
- 21 token = JsonHelper.ParseFromJson<Access_token>(content);
- 22 mode.access_token = token.access_token;
- 23 mode.expires_in = token.expires_in;
- 24 }
- 25 return mode;
- 26 }

以上的方法用到了Json对象的处理,所以我把JsonHelper的代码一贴出来供大家参考,一下就是JsonHelper.cs的代码:
- 1 using System;
- 2 using System.IO;
- 3 using System.Text;
- 4 using System.Runtime.Serialization.Json;
- 5
- 6
- 7
- 8 public class JsonHelper
- 9 {
- 10 /// <summary>
- 11 /// 生成Json格式
- 12 /// </summary>
- 13 /// <typeparam name="T"></typeparam>
- 14 /// <param name="obj"></param>
- 15 /// <returns></returns>
- 16 public static string GetJson<T>(T obj)
- 17 {
- 18 DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
- 19 using (MemoryStream stream = new MemoryStream())
- 20 {
- 21 json.WriteObject(stream, obj);
- 22 string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;
- 23 }
- 24 }
- 25 /// <summary>
- 26 /// 获取Json的Model
- 27 /// </summary>
- 28 /// <typeparam name="T"></typeparam>
- 29 /// <param name="szJson"></param>
- 30 /// <returns></returns>
- 31 public static T ParseFromJson<T>(string szJson)
- 32 {
- 33 T obj = Activator.CreateInstance<T>();
- 34 using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
- 35 {
- 36 DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
- 37 return (T)serializer.ReadObject(ms);
- 38 }
- 39 }
- 40 }

- 1 using System;
- 2 using System.IO;
- 3 using System.Text;
- 4 using System.Runtime.Serialization.Json;
- 5
- 6
- 7
- 8 public class JsonHelper
- 9 {
- 10 /// <summary>
- 11 /// 生成Json格式
- 12 /// </summary>
- 13 /// <typeparam name="T"></typeparam>
- 14 /// <param name="obj"></param>
- 15 /// <returns></returns>
- 16 public static string GetJson<T>(T obj)
- 17 {
- 18 DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
- 19 using (MemoryStream stream = new MemoryStream())
- 20 {
- 21 json.WriteObject(stream, obj);
- 22 string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;
- 23 }
- 24 }
- 25 /// <summary>
- 26 /// 获取Json的Model
- 27 /// </summary>
- 28 /// <typeparam name="T"></typeparam>
- 29 /// <param name="szJson"></param>
- 30 /// <returns></returns>
- 31 public static T ParseFromJson<T>(string szJson)
- 32 {
- 33 T obj = Activator.CreateInstance<T>();
- 34 using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
- 35 {
- 36 DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
- 37 return (T)serializer.ReadObject(ms);
- 38 }
- 39 }
- 40 }

其实还可以直接饮用Newtonsoft.Json.dll可以直接操作json,这样更方便一些。
我们还需要写一个判断access_token是否过期如果过期更新XML文件的方法。
- 1 /// <summary>
- 2 /// 根据当前日期 判断Access_Token 是否超期 如果超期返回新的Access_Token 否则返回之前的Access_Token
- 3 /// </summary>
- 4 /// <param name="datetime"></param>
- 5 /// <returns></returns>
- 6 public static string IsExistAccess_Token()
- 7 {
- 8
- 9 string Token = string.Empty;
- 10 DateTime YouXRQ;
- 11 // 读取XML文件中的数据,并显示出来 ,注意文件路径
- 12 string filepath = Server.MapPath("XMLFile.xml");
- 13
- 14 StreamReader str = new StreamReader(filepath, System.Text.Encoding.UTF8);
- 15 XmlDocument xml = new XmlDocument();
- 16 xml.Load(str);
- 17 str.Close();
- 18 str.Dispose();
- 19 Token = xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText;
- 20 YouXRQ = Convert.ToDateTime(xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText);
- 21
- 22 if (DateTime.Now > YouXRQ)
- 23 {
- 24 DateTime _youxrq = DateTime.Now;
- 25 Access_token mode = GetAccess_token();
- 26 xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText = mode.access_token;
- 27 _youxrq = _youxrq.AddSeconds(int.Parse(mode.expires_in));
- 28 xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText = _youxrq.ToString();
- 29 xml.Save(filepath);
- 30 Token = mode.access_token;
- 31 }
- 32 return Token;
- 33 }

- 1 /// <summary>
- 2 /// 根据当前日期 判断Access_Token 是否超期 如果超期返回新的Access_Token 否则返回之前的Access_Token
- 3 /// </summary>
- 4 /// <param name="datetime"></param>
- 5 /// <returns></returns>
- 6 public static string IsExistAccess_Token()
- 7 {
- 8
- 9 string Token = string.Empty;
- 10 DateTime YouXRQ;
- 11 // 读取XML文件中的数据,并显示出来 ,注意文件路径
- 12 string filepath = Server.MapPath("XMLFile.xml");
- 13
- 14 StreamReader str = new StreamReader(filepath, System.Text.Encoding.UTF8);
- 15 XmlDocument xml = new XmlDocument();
- 16 xml.Load(str);
- 17 str.Close();
- 18 str.Dispose();
- 19 Token = xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText;
- 20 YouXRQ = Convert.ToDateTime(xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText);
- 21
- 22 if (DateTime.Now > YouXRQ)
- 23 {
- 24 DateTime _youxrq = DateTime.Now;
- 25 Access_token mode = GetAccess_token();
- 26 xml.SelectSingleNode("xml").SelectSingleNode("Access_Token").InnerText = mode.access_token;
- 27 _youxrq = _youxrq.AddSeconds(int.Parse(mode.expires_in));
- 28 xml.SelectSingleNode("xml").SelectSingleNode("Access_YouXRQ").InnerText = _youxrq.ToString();
- 29 xml.Save(filepath);
- 30 Token = mode.access_token;
- 31 }
- 32 return Token;
- 33 }

好了,完成了上面的工作,我只需要在使用到access_token的时调用如下就OK了,“客户再也不用担心token的过期”
string _access_token = IsExistAccess_Token();
微信公共平台开发5 .net的更多相关文章
- ASP.NET MVC 微信公共平台开发之获取用户消息并处理
ASP.NET MVC 微信公共平台开发 获取用户消息并处理 获取用户消息 用户发送的消息是在微信服务器发送的一个HTTP POST请求中包含的,获取用户发送的消息要从POST请求的数据流中获取 微信 ...
- ASP.NET MVC 微信公共平台开发之验证消息的真实性
ASP.NET MVC 微信公共平台开发 验证消息的真实性 在MVC Controller所在项目中添加过滤器,在过滤器中重写 public override void OnActionExecuti ...
- ASP.NET MVC 微信公共平台开发之 微信接入
ASP.NET MVC 接入微信公共平台 申请微信公共账号 既然要接入微信公共平台,微信公共号是必须的(当然如果只是测试的话也可以申请微信公共平台接口测试账号),来这里微信公共平台 申请微信公共号(注 ...
- 微信公共平台开发-(.net实现)1--成为开发者
刚换了个新环境,哎这都快一个月了,还没适应过来,还是怀念老地方呀.老板让开发一个基于微信平台的开发项目,而且是用net实现.当时就蒙了,微信就用了一会个人赶脚不好,所以果断不用,现在让开发,而且查了一 ...
- 微信公共平台开发1 .net
如果想通过微信去开发(当然,指的是开发模式下),首先 建议先申请一个服务号,因为服务号的功能与接口也多,有些功能订阅号是实现不了的.另外申请过以后必须得通过微信 认证才能开发,好像是得付300大洋,高 ...
- 微信公共平台开发-(.net实现)5--access_token过期的问题
每次在于微信交互时,都要用到access_token,但是这个值限制的是有时间的,但是access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token ...
- 微信公共平台开发-(.net实现)3--发送文本消息
最近,项目这边比较忙,没来得及续写,哎,先吐吐槽吧,在这个周六还得来上班,以后每个周六多要上,一天的滋味真有点受不鸟呀.还不习惯ing... 嗯,别的不说了现在开始接着上次http://www.cnb ...
- 微信公共平台开发-(.net实现)2--ACCESSTOKEN值获得
成功的走出第一步后,我们紧接着趁热打铁开始下一步: 成为了开发者之后微信平台会给您AppId和AppSecret,在订阅号中是没有的,所以因该申请一下服务号, 若没有请注意上一篇http://www. ...
- 微信公共平台开发3 .net
嗯,别的不说了现在开始接着上次http://www.cnblogs.com/QLJ1314/p/3838058.html 获取ACCESSTOKEN,开始吧,接下来我们就写发送文本消息吧. 首先建立 ...
随机推荐
- p范数(p norm)
先回顾一下范数的定义(en.wikipedia.org/wiki/Norm_(mathematics)): Given a vector space V over a subfield F of th ...
- 深入浅出MySQL 数据库开发、优化与管理维护(第2版) -- 读书笔记 -- 基础篇
1.切换数据库 use blog; 2.显示当前数据库 所有的表. show tables; +----------------+ | Tables_in_blog | +------------ ...
- WebKit中的Chrome 和 ChromeClient
原文地址:http://blog.csdn.net/dlmu2001/article/details/6208241 摘要: 浏览器的GUI接口分成两种,一种是控件的绘制,另一种则是同应用息息相关的窗 ...
- 配置<authorization>节(配置文件)
在 Web.config 文件的<configuration>标记的子标记<authorization>和</authorization>之间用于设置应用程序的授权 ...
- 【软件分析与挖掘】Multiple kernel ensemble learning for software defect prediction
摘要: 利用软件中的历史缺陷数据来建立分类器,进行软件缺陷的检测. 多核学习(Multiple kernel learning):把历史缺陷数据映射到高维特征空间,使得数据能够更好地表达: 集成学习( ...
- Mybatis对MySQL中BLOB字段的读取
1.在sqlMapConfig中,定义一个typeHandlers <typeHandlers> <typeHandler jdbcType="BLOB" jav ...
- 开放产品开发(OPD):OPD框架
在 开放产品开发(OPD):开篇 中讲了一下OPD是什么,以及它主要指引的方法,这篇文字将给大家介绍一下OPD框架. 一个公司有三种经营模式,像游戏代理的属于运营型,做企业定制项目管理软件的属于项目型 ...
- Twitter算法面试题详解(Java实现)
最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...
- 用eclipse加载别人的工程,报错Target runtime com.genuitec.runtime.generic.jee60 is not defined
系统加载工程后,报错Target runtime com.genuitec.runtime.generic.jee60 is not defined,在发布工程的同事电脑上正常 新导入的工程,出问题很 ...
- AC自动机 - 关于Fail指针
fail指针可以说是AC自动机里最难理解的东西,怎样更好的理解AC自动机的fail指针? 先来看一幅图: 看这幅图上的fail指针是怎么构造的. 树上的词分别是: { he , hers , his ...