C#微信开发之旅(三):AccessToken获取及全局管理

由于AccessToken有效期为2小时,并且接口调用有数量限制,所以开始时选择用WCF做了全局管理(项目中要到AccessToken的地方太多了,支付相关、生成二维码、获取用户信息、菜单操作等等)

下面是AccessToken全局管理的单例类,(原理:通过微信接口获取AccessToken,存储在内存中,当其他项目调用时,会判断是否过期,过期去拿新Token再返回):

 1 /// <summary>
 2     /// AccessToken类,公众号通过此token 获取相关信息 (单例类)
 3     /// </summary>
 4     public sealed class AccessToken
 5     {
 6         private static AccessToken _Token = new AccessToken();
 7
 8         private static object lock_Object = new object();
 9
10         /// <summary>
11         /// 此处 会判断是否过期,没过期返回原存储的Token
12         /// </summary>
13         public static AccessToken Instance
14         {
15             get
16             {
17                 if (_Token.Expired)
18                 {
19                     lock (lock_Object)
20                     {
21                         if (_Token.Expired)
22                         {
23                             _Token.CreateTime = DateTime.Now;
24                             _Token.CopyModel(JsonConvert.DeserializeObject<AccessToken>(WeiXinHelper.GetAccessToken()));
25                         }
26                     }
27                 }
28
29                 return _Token;
30             }
31         }
32
33         /// <summary>
34         /// 此处会创建新的Token返回,只有在调用接口提示AccessToken过期时 才调用这个接口。
35         /// </summary>
36         /// <returns></returns>
37         public static AccessToken CreateNewInstance()
38         {
39             lock (lock_Object)
40             {
41                 _Token.CreateTime = DateTime.Now;
42                 _Token.CopyModel(JsonConvert.DeserializeObject<AccessToken>(WeiXinHelper.GetAccessToken()));
43             }
44             return _Token;
45         }
46
47         private AccessToken()
48         {
49             CreateTime = DateTime.Now;
50             _expiresIn = -1;
51         }
52
53         private string _accessToken;
54         private int _expiresIn;
55         public DateTime CreateTime;
56         public string Access_Token
57         {
58             get { return _accessToken; }
59             set { _accessToken = value; }
60         }
61
62         /// <summary>
63         /// 有效时间,秒
64         /// </summary>
65         public int Expires_In
66         {
67             get { return _expiresIn; }
68             set { _expiresIn = value; }
69         }
70
71         public bool Expired
72         {
73             get
74             {
75                 DateTime expiredTime = CreateTime.AddSeconds(_expiresIn);
76
77                 if (DateTime.Now > expiredTime)
78                     return true;
79
80                 return false;
81             }
82         }
83
84         public void CopyModel(AccessToken token)
85         {
86             //token 为空,将 过期时间 设置为 -1
87             if (token == null)
88             {
89                 this.Expires_In = -1;
90                 return;
91             }
92
93             this.Access_Token = token.Access_Token;
94             this.Expires_In = token.Expires_In;
95
96         }
97     }

这个类提供了两个出口,Instance和CreateNewInstance ,区别是 CreateNewInstance 直接调用微信接口生成新的AccessToken(请确保只在 AccessToken过期时使用),由于本人之前的项目,微信不是只我们一家开发,所以导致AccessToken 经常出现过期情况,才会多出这个方法。 如果可以保证所有用到AccessToken的地方都调用WCF的话,可以不需要这个逻辑。

下面是 获取AccessToken的代码,经过各种封装,简单的不能再简单了,这个方法在WeiXinHelper(核心类,在后续随笔中慢慢讲)中,HttpClientHelper请看:C#微信开发之旅(二):基础类之HttpClientHelper

        /// <summary>
        /// 获取Access_Token
        /// </summary>
        /// <returns></returns>
        public static string GetAccessToken()
        {
            string url = WeiXinConst.WeiXin_AccessTokenUrl;
            string result = HttpClientHelper.GetResponse(url);
            return result;
        }
时间: 2024-10-12 22:49:29

C#微信开发之旅(三):AccessToken获取及全局管理的相关文章

微信开发之(三)获取微信服务器IP地址

官方文档解析:获取微信服务器IP地址 在上面的官方文档中我们可以直接在最浏览器里面进行测试例如: 请求访问这个地址,前提是已经获得了access_token的值上篇已获得:https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN   是否必须 说明 access_token 是 公众号的access_token C#代码(access_token的值见上一篇的获取方法): /// <summary> //

C#微信开发之旅(三):基础类之WeiXinConst

开发过程中需要用的的公众号信息在这里配置,此外需要用到的Url信息无需更改. /// <summary> /// 微信 需要用到的Url.Json常量 /// </summary> public class WeiXinConst { #region Value Const /// <summary> /// 微信开发者 AppId /// </summary> public const string AppId = "你的AppId";

C#微信开发之旅(十三):V2订单查询&amp;退款(完结)

订单查询 用处同V3订单查询,直接上代码: 1 /// <summary> 2 /// V2订单查询 3 /// </summary> 4 public void QueryOrder() 5 { 6 string orderNo = string.Empty; 7 8 WxPayModel model = WxPayModel.Create(orderNo); 9 OrderQueryMessage message = WeiXinHelper.OrderQuery(model.

C#微信开发之旅(八):通过授权code以及openid获取用户信息

要将我们的Web账号和微信账号绑定到一起,必须要用到微信openid的概念,每个账号对于不同公众号都会有一个openid ,可以根据openid与我们的账号关联到一起. 而openid 的获取最主要的: 微信推送给我们的各种消息 网页授权 可能用到的地方: 注册(通过网页授权获取openid,与注册的账户关联起来) 公众号菜单配置为网页授权Url,免登陆 统计分析(比如:关注用户中的注册.未注册用户数量) 直接上代码:(由于开发过程中未用到 授权snsapi_userinfo的,所以代码先空着,

微信开发第4章 通过accesstoken获取用户标签管理

通过access_token获取用户标签管理: 1.获取标签列表 调用接口为: http请求方式:GET(请使用https协议) https://api.weixin.qq.com/cgi-bin/tags/get?access_token=ACCESS_TOKEN 返回为: 代码如下: 获取结果如下: 2.创建标签 一个公众号,最多可以创建100个标签. 调用接口说明: 请求地址: http请求方式:POST(请使用https协议) https://api.weixin.qq.com/cgi-

C#微信开发之旅(九):JSAPI支付(V3)(相关代码待补全)

微信开发遇到最复杂的就是支付了,无论V2还是V3.这篇文章将给出全套的V3版本JSAPI支付代码,包括预支付->支付->订单查询->通知->退款,其中前三步已经上线应用,退款只是简单测试了一下,大家要用的话需要谨慎... 一.预支付&支付 实际就是讲订单信息交给微信端,返回给我们一个预支付id(与V2app支付相似),支付时将预支付id交给微信处理.注意:预支付id 需存储,每个out_trade_no(我们自己的订单号)只能对应一个预支付id.代码奉上:(mvc demo

微信开发之(五)获取media_id的值

在很多地方的微信开发中有关于获取media_id值得问题,比如某些图片信息的引用就会有media_id这个参数, 为了更简洁的获得参数微信测试开发文档里面有接口网页:使用网页调试工具调试该接口 我们可以在这里打开的链接中设置相关的参数,请求成功就会有对应的media_id的值,获得后我们就可以在其他图文参数引用中加以引用:  

微信开发学习日记(三):6点经验

1.token验证和微信请求响应token验证,用get方法. 微信请求入口,用psot方法. 一个微信公众号或者轻应用的入口,就是一个url,同一个url分为get和post. get的时候,4个参数都不为空,必须校验. post的时候,也要校验参数,只是不用输出echostr.post的时候,echostr可能为空,是否要检查echostr是否为空呢?既然不用输出,按说不需要校验.2.接口访问凭证access_token每次获得一次凭证,有一定的过期时间.也就是说,可以缓存起来.暂时还没仔细

C#微信开发之旅(七):根据经纬度获取地址(百度地图Api)

开发过程中遇到这样的需求,根据用户的地理位置不同,显示不同区域的产品. 这里用到了微信:获取用户地理位置 的功能,(每隔5秒上报 或 进入回话时上报一次),我们根据微信推送过来的经纬度,来转换成实际地址,这里用到的是百度地图Api(要用的话先申请百度ak). PS:微信的这个功能很不稳定,靠它不靠谱,经常不推送...(后来加了手动定位,百度地图Web定位组件 还不错,不是广告!0.0) #region 根据经纬度 获取地址信息 BaiduApi /// <summary> /// 根据经纬度