您的位置:首页 > 移动开发 > 微信开发

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

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

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

/// <summary>
/// AccessToken类,公众号通过此token 获取相关信息 (单例类)
/// </summary>
public sealed class AccessToken
{
private static AccessToken _Token = new AccessToken();

private static object lock_Object = new object();

/// <summary>
/// 此处 会判断是否过期,没过期返回原存储的Token
/// </summary>
public static AccessToken Instance
{
get
{
if (_Token.Expired)
{
lock (lock_Object)
{
if (_Token.Expired)
{
_Token.CreateTime = DateTime.Now;
_Token.CopyModel(JsonConvert.DeserializeObject<AccessToken>(WeiXinHelper.GetAccessToken()));
}
}
}

return _Token;
}
}

/// <summary>
/// 此处会创建新的Token返回,只有在调用接口提示AccessToken过期时 才调用这个接口。
/// </summary>
/// <returns></returns>
public static AccessToken CreateNewInstance()
{
lock (lock_Object)
{
_Token.CreateTime = DateTime.Now;
_Token.CopyModel(JsonConvert.DeserializeObject<AccessToken>(WeiXinHelper.GetAccessToken()));
}
return _Token;
}

private AccessToken()
{
CreateTime = DateTime.Now;
_expiresIn = -1;
}

private string _accessToken;
private int _expiresIn;
public DateTime CreateTime;
public string Access_Token
{
get { return _accessToken; }
set { _accessToken = value; }
}

/// <summary>
/// 有效时间,秒
/// </summary>
public int Expires_In
{
get { return _expiresIn; }
set { _expiresIn = value; }
}

public bool Expired
{
get
{
DateTime expiredTime = CreateTime.AddSeconds(_expiresIn);

if (DateTime.Now > expiredTime)
return true;

return false;
}
}

public void CopyModel(AccessToken token)
{
//token 为空,将 过期时间 设置为 -1
if (token == null)
{
this.Expires_In = -1;
return;
}

this.Access_Token = token.Access_Token;
this.Expires_In = token.Expires_In;

}
}


这个类提供了两个出口,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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: