using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Threading; using Deepleo.Weixin.SDK; using Deepleo.Weixin.SDK.JSSDK; namespace Deepleo.Weixin.SDK.Helpers { /// /// 由于微信AccessToken,7200s过期,故需要在7200s后重新获取新的有效Token。 /// ps:每次都重新生成新的Token会比较慢(大概需要500ms)。 /// public class TokenHelper { public int Interval { private set; get; } public bool Status { private set; get; } public DateTime LastRunDateTime { private set; get; } public string AppId { private set; get; } public string AppSecrect { private set; get; } public bool IsOpenJSTickect { private set; get; } /// /// 建议小于7200s,比如6000s /// /// /// /// /// 是否打开JSSDK生成Tickect功能 /// false:无法通过GetJSTickect获取JSTickect /// public TokenHelper(int IntervalInSeconds, string appId, string appSecrect, bool isOpenJSTickect = false) { Interval = IntervalInSeconds; AppId = appId; AppSecrect = appSecrect; Status = false; LastRunDateTime = DateTime.MinValue; IsOpenJSTickect = isOpenJSTickect; } public void Run() { if (Status) throw new Exception(string.Format("Token Manager is already running.")); Status = true; refreshToken(); _timer = new System.Timers.Timer(Interval * 1000); _timer.Elapsed += delegate { refreshToken(); if (IsOpenJSTickect) { refreshJSTickect(); } }; _timer.Start(); } public void Close() { if (!Status) throw new Exception(string.Format("Token Manager is already closed.")); _timer.Stop(); _timer.Dispose(); _timer = null; Status = false; } private string _token; private string _jsTickect; private System.Timers.Timer _timer = null; public event EventHandler TokenChangedEvent; public event EventHandler JSTickectChangedEvent; public event EventHandler ErrorEvent; /// /// 获取access_token /// 刷新access_token后,JSTickect会自动刷新 /// /// 是否强制刷新,建议不要频繁刷新 /// public string GetToken(bool isForceRefresh = false) { if (isForceRefresh) { refreshToken(); if (IsOpenJSTickect) refreshJSTickect(); } return _token; } /// /// 使用JSSDK权限签名算法jsapi_ticket /// /// 是否强制刷新,建议不要频繁刷新 /// public string GetJSTickect(bool isForceRefresh = false) { if (!IsOpenJSTickect) return string.Empty; if (string.IsNullOrEmpty(_token)) refreshToken(); if (string.IsNullOrEmpty(_jsTickect)) refreshJSTickect(); else if (isForceRefresh) refreshJSTickect(); return _jsTickect; } private void refreshToken() { if (!Status) return; LastRunDateTime = DateTime.Now; try { string newToken = BasicAPI.GetAccessToken(AppId, AppSecrect).access_token; _token = newToken; if (TokenChangedEvent != null) TokenChangedEvent(this, EventArgs.Empty); } catch (Exception ex) { if (ErrorEvent != null) ErrorEvent(this, new ThreadExceptionEventArgs(ex)); } } private void refreshJSTickect() { if (!Status) return; LastRunDateTime = DateTime.Now; try { string newTickect = JSAPI.GetTickect(_token).ticket; _jsTickect = newTickect; if (JSTickectChangedEvent != null) JSTickectChangedEvent(this, EventArgs.Empty); } catch (Exception ex) { if (ErrorEvent != null) ErrorEvent(this, new ThreadExceptionEventArgs(ex)); } } } }