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

用下面的XML文件来存放access_token,建立一个XMLFile.xml,把Access_YouXRQ标签的内容写成一个已经过去的时间,这样我们好在一开始调用的时候,发现已经过期,然后获取新的access_token。

  1. 1 <?xml version="1.0" encoding="utf-8"?>
  2. 2 <xml>
  3. 3 <Access_Token>初始值可以随便写</Access_Token>
  4. 4 <Access_YouXRQ>1990/12/12 16:06:38</Access_YouXRQ>
  5. 5 </xml>
  1. 1 <?xml version="1.0" encoding="utf-8"?>
  2. 2 <xml>
  3. 3 <Access_Token>初始值可以随便写</Access_Token>
  4. 4 <Access_YouXRQ>1990/12/12 16:06:38</Access_YouXRQ>
  5. 5 </xml>

之前获得Access_token的方法改造一下,让他给Access_token实例赋值

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

以上的方法用到了Json对象的处理,所以我把JsonHelper的代码一贴出来供大家参考,一下就是JsonHelper.cs的代码:

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

其实还可以直接饮用Newtonsoft.Json.dll可以直接操作json,这样更方便一些。

我们还需要写一个判断access_token是否过期如果过期更新XML文件的方法。

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

好了,完成了上面的工作,我只需要在使用到access_token的时调用如下就OK了,“客户再也不用担心token的过期”
string _access_token = IsExistAccess_Token();

微信公共平台开发5 .net的更多相关文章

  1. ASP.NET MVC 微信公共平台开发之获取用户消息并处理

    ASP.NET MVC 微信公共平台开发 获取用户消息并处理 获取用户消息 用户发送的消息是在微信服务器发送的一个HTTP POST请求中包含的,获取用户发送的消息要从POST请求的数据流中获取 微信 ...

  2. ASP.NET MVC 微信公共平台开发之验证消息的真实性

    ASP.NET MVC 微信公共平台开发 验证消息的真实性 在MVC Controller所在项目中添加过滤器,在过滤器中重写 public override void OnActionExecuti ...

  3. ASP.NET MVC 微信公共平台开发之 微信接入

    ASP.NET MVC 接入微信公共平台 申请微信公共账号 既然要接入微信公共平台,微信公共号是必须的(当然如果只是测试的话也可以申请微信公共平台接口测试账号),来这里微信公共平台 申请微信公共号(注 ...

  4. 微信公共平台开发-(.net实现)1--成为开发者

    刚换了个新环境,哎这都快一个月了,还没适应过来,还是怀念老地方呀.老板让开发一个基于微信平台的开发项目,而且是用net实现.当时就蒙了,微信就用了一会个人赶脚不好,所以果断不用,现在让开发,而且查了一 ...

  5. 微信公共平台开发1 .net

    如果想通过微信去开发(当然,指的是开发模式下),首先 建议先申请一个服务号,因为服务号的功能与接口也多,有些功能订阅号是实现不了的.另外申请过以后必须得通过微信 认证才能开发,好像是得付300大洋,高 ...

  6. 微信公共平台开发-(.net实现)5--access_token过期的问题

    每次在于微信交互时,都要用到access_token,但是这个值限制的是有时间的,但是access_token,在以后的高级功能里面会经常用到,所以这里不得不这里对前面所讲解的access_token ...

  7. 微信公共平台开发-(.net实现)3--发送文本消息

    最近,项目这边比较忙,没来得及续写,哎,先吐吐槽吧,在这个周六还得来上班,以后每个周六多要上,一天的滋味真有点受不鸟呀.还不习惯ing... 嗯,别的不说了现在开始接着上次http://www.cnb ...

  8. 微信公共平台开发-(.net实现)2--ACCESSTOKEN值获得

    成功的走出第一步后,我们紧接着趁热打铁开始下一步: 成为了开发者之后微信平台会给您AppId和AppSecret,在订阅号中是没有的,所以因该申请一下服务号, 若没有请注意上一篇http://www. ...

  9. 微信公共平台开发3 .net

    嗯,别的不说了现在开始接着上次http://www.cnblogs.com/QLJ1314/p/3838058.html  获取ACCESSTOKEN,开始吧,接下来我们就写发送文本消息吧. 首先建立 ...

随机推荐

  1. p范数(p norm)

    先回顾一下范数的定义(en.wikipedia.org/wiki/Norm_(mathematics)): Given a vector space V over a subfield F of th ...

  2. 深入浅出MySQL 数据库开发、优化与管理维护(第2版) -- 读书笔记 -- 基础篇

      1.切换数据库 use blog; 2.显示当前数据库 所有的表. show tables; +----------------+ | Tables_in_blog | +------------ ...

  3. WebKit中的Chrome 和 ChromeClient

    原文地址:http://blog.csdn.net/dlmu2001/article/details/6208241 摘要: 浏览器的GUI接口分成两种,一种是控件的绘制,另一种则是同应用息息相关的窗 ...

  4. 配置<authorization>节(配置文件)

    在 Web.config 文件的<configuration>标记的子标记<authorization>和</authorization>之间用于设置应用程序的授权 ...

  5. 【软件分析与挖掘】Multiple kernel ensemble learning for software defect prediction

    摘要: 利用软件中的历史缺陷数据来建立分类器,进行软件缺陷的检测. 多核学习(Multiple kernel learning):把历史缺陷数据映射到高维特征空间,使得数据能够更好地表达: 集成学习( ...

  6. Mybatis对MySQL中BLOB字段的读取

    1.在sqlMapConfig中,定义一个typeHandlers <typeHandlers> <typeHandler jdbcType="BLOB" jav ...

  7. 开放产品开发(OPD):OPD框架

    在 开放产品开发(OPD):开篇 中讲了一下OPD是什么,以及它主要指引的方法,这篇文字将给大家介绍一下OPD框架. 一个公司有三种经营模式,像游戏代理的属于运营型,做企业定制项目管理软件的属于项目型 ...

  8. Twitter算法面试题详解(Java实现)

    最近在网上看到一道Twitter的算法面试题,网上已经有人给出了答案,不过可能有些人没太看明白(我也未验证是否正确),现在给出一个比较好理解的答案.先看一下题目. 图1 先看看图图1.可以将方块看做砖 ...

  9. 用eclipse加载别人的工程,报错Target runtime com.genuitec.runtime.generic.jee60 is not defined

    系统加载工程后,报错Target runtime com.genuitec.runtime.generic.jee60 is not defined,在发布工程的同事电脑上正常 新导入的工程,出问题很 ...

  10. AC自动机 - 关于Fail指针

    fail指针可以说是AC自动机里最难理解的东西,怎样更好的理解AC自动机的fail指针? 先来看一幅图: 看这幅图上的fail指针是怎么构造的. 树上的词分别是: { he , hers , his ...