/// <summary> /// 获取可用AccessTokenResult对象 /// </summary> /// <param name="clientId"></param> /// <param name="getNewToken">是否强制重新获取新的Token</param> /// <returns></returns> public static AccessTokenResult GetAccessTokenResult(string clientId, bool getNewToken = false, SessionType sessionType = SessionType.Prod) { if (!CheckRegistered(clientId)) { throw new UnRegisterClientIdException(clientId, string.Format("此clientId({0})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!", clientId)); } var accessTokenBag = TryGetItem(clientId); using (Cache.BeginCacheLock(LockResourceName, clientId))//同步锁 { if (getNewToken || accessTokenBag.AccessTokenExpireTime <= DateTime.Now) { //已过期,重新获取 //accessTokenBag.AccessTokenResult = CommonApi.GetToken(accessTokenBag.clientId, accessTokenBag.clientSecret); //accessTokenBag.AccessTokenExpireTime = ApiUtility.GetExpireTime(accessTokenBag.AccessTokenResult.expires_in); accessTokenBag.AccessTokenResult = CommonApi.GetAccessToken(accessTokenBag.ClientId, accessTokenBag.ClientSecret, accessTokenBag.PreAuthCode, accessTokenBag.RedirectUri, sessionType); accessTokenBag.AccessTokenExpireTime = ApiUtility.GetExpireTime(accessTokenBag.AccessTokenResult.data.expires_in); } } return(accessTokenBag.AccessTokenResult); }
/// <summary> /// 获取可用Ticket /// </summary> /// <param name="appId"></param> /// <param name="getNewTicket">是否强制重新获取新的Ticket</param> /// <returns></returns> public static JsApiTicketResult GetWxCardApiTicketResult(string appId, bool getNewTicket = false) { if (!CheckRegistered(appId)) { throw new UnRegisterAppIdException(null, "此appId尚未注册,请先使用WxCardApiTicketContainer.Register完成注册(全局执行一次即可)!"); } WxCardApiTicketBag wxCardApiTicketBag = TryGetItem(appId); using (Cache.BeginCacheLock(LockResourceName, appId))//同步锁 { if (getNewTicket || wxCardApiTicketBag.WxCardApiTicketExpireTime <= SystemTime.Now) { //已过期,重新获取 wxCardApiTicketBag.WxCardApiTicketResult = CommonApi.GetTicket(wxCardApiTicketBag.AppId, wxCardApiTicketBag.AppSecret, "wx_card"); wxCardApiTicketBag.WxCardApiTicketExpireTime = ApiUtility.GetExpireTime(wxCardApiTicketBag.WxCardApiTicketResult.expires_in); Update(wxCardApiTicketBag, null); } } return(wxCardApiTicketBag.WxCardApiTicketResult); }
/// <summary> /// 获取可用AccessTokenResult对象 /// </summary> /// <param name="appId"></param> /// <param name="getNewToken">是否强制重新获取新的Token</param> /// <returns></returns> public static async Task <IAccessTokenResult> GetAccessTokenResultAsync(string appId, bool getNewToken = false) { if (!await CheckRegisteredAsync(appId)) { throw new UnRegisterAppIdException(appId, string.Format("此appId({0})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!", appId)); } var accessTokenBag = await TryGetItemAsync(appId); using (await Cache.BeginCacheLockAsync(LockResourceName, appId))//同步锁 { if (getNewToken || accessTokenBag.AccessTokenExpireTime <= SystemTime.Now) { //已过期,重新获取 var accessTokenResult = await CommonApi.GetTokenAsync(accessTokenBag.AppId, accessTokenBag.AppSecret); accessTokenBag.AccessTokenResult = accessTokenResult; accessTokenBag.AccessTokenExpireTime = ApiUtility.GetExpireTime(accessTokenBag.AccessTokenResult.expires_in); await UpdateAsync(accessTokenBag, null);//更新到缓存 } } return(accessTokenBag.AccessTokenResult); }
/// <summary> /// 获取ComponentVerifyTicket /// </summary> /// <param name="componentAppId"></param> /// <param name="getNewToken"></param> /// <returns>如果不存在,则返回null</returns> public static string TryGetComponentVerifyTicket(string componentAppId, bool getNewToken = false) { if (!CheckRegistered(componentAppId)) { throw new WeixinOpenException(UN_REGISTER_ALERT); } var bag = TryGetItem(componentAppId); var componentVerifyTicket = bag.ComponentVerifyTicket; if (getNewToken || componentVerifyTicket == default(string) || bag.ComponentVerifyTicketExpireTime < SystemTime.Now) { if (GetComponentVerifyTicketFunc == null) { throw new WeixinOpenException("GetComponentVerifyTicketFunc必须在注册时提供!", bag); } componentVerifyTicket = GetComponentVerifyTicketFunc(componentAppId).GetAwaiter().GetResult(); //获取最新的componentVerifyTicket bag.ComponentVerifyTicket = componentVerifyTicket; bag.ComponentVerifyTicketExpireTime = ApiUtility.GetExpireTime(COMPONENT_VERIFY_TICKET_UPDATE_MINUTES * 60); Update(bag, null);//更新到缓存 } return(componentVerifyTicket); }
/// <summary> /// 【异步方法】获取可用Ticket /// </summary> /// <param name="appId"></param> /// <param name="getNewTicket">是否强制重新获取新的Ticket</param> /// <returns></returns> public static async Task <JsApiTicketResult> GetTicketResultAsync(string appId, string appSecret, bool getNewTicket = false) { if (!CheckRegistered(BuildingKey(appId, appSecret))) { throw new WeixinQyException(UN_REGISTER_ALERT); } var jsApiTicketBag = TryGetItem(BuildingKey(appId, appSecret)); //lock (jsApiTicketBag.Lock) { if (getNewTicket || jsApiTicketBag.ExpireTime <= DateTime.Now) { //已过期,重新获取 var jsApiTicketResult = await CommonApi.GetTicketAsync(jsApiTicketBag.AppId, jsApiTicketBag.AppSecret); jsApiTicketBag.JsApiTicketResult = jsApiTicketResult; //jsApiTicketBag.JsApiTicketResult = CommonApi.GetTicket(jsApiTicketBag.AppId, jsApiTicketBag.AppSecret); jsApiTicketBag.ExpireTime = ApiUtility.GetExpireTime(jsApiTicketBag.JsApiTicketResult.expires_in); } } return(jsApiTicketBag.JsApiTicketResult); }
/// <summary> /// 【异步方法】获取可用AccessToken /// </summary> /// <param name="componentAppId"></param> /// <param name="componentVerifyTicket">如果为null则自动获取</param> /// <param name="getNewToken">是否强制重新获取新的Token</param> /// <returns></returns> public static async Task<ComponentAccessTokenResult> GetComponentAccessTokenResultAsync(string componentAppId, string componentVerifyTicket = null, bool getNewToken = false) { if (!CheckRegistered(componentAppId)) { throw new WeixinOpenException(UN_REGISTER_ALERT); } var accessTokenBag = TryGetItem(componentAppId); using (Cache.BeginCacheLock(LockResourceName + ".GetComponentAccessTokenResult", componentAppId))//同步锁 { if (getNewToken || accessTokenBag.ComponentAccessTokenExpireTime <= DateTime.Now) { //已过期,重新获取 componentVerifyTicket = componentVerifyTicket ?? TryGetComponentVerifyTicket(componentAppId); var componentAccessTokenResult = await ComponentApi.GetComponentAccessTokenAsync(accessTokenBag.ComponentAppId, accessTokenBag.ComponentAppSecret, componentVerifyTicket); accessTokenBag.ComponentAccessTokenResult = componentAccessTokenResult; accessTokenBag.ComponentAccessTokenExpireTime = ApiUtility.GetExpireTime(componentAccessTokenResult.expires_in); } } return accessTokenBag.ComponentAccessTokenResult; }
/// <summary> /// 【异步方法】获取可用Ticket /// </summary> /// <param name="appId"></param> /// <param name="code">code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。</param> /// <param name="getNewToken">是否强制重新获取新的Ticket</param> /// <returns></returns> public static async Task <OAuthAccessTokenResult> GetOAuthAccessTokenResultAsync(string appId, string code, bool getNewToken = false) { if (!CheckRegistered(appId)) { throw new UnRegisterAppIdException(null, "此appId尚未注册,请先使用OAuthAccessTokenContainer.Register完成注册(全局执行一次即可)!"); } var oAuthAccessTokenBag = TryGetItem(appId); using (Cache.BeginCacheLock(LockResourceName, appId))//同步锁 { if (getNewToken || oAuthAccessTokenBag.OAuthAccessTokenExpireTime <= DateTime.Now) { //已过期,重新获取 var oAuthAccessTokenResult = await OAuthApi.GetAccessTokenAsync(oAuthAccessTokenBag.AppId, oAuthAccessTokenBag.AppSecret, code); oAuthAccessTokenBag.OAuthAccessTokenResult = oAuthAccessTokenResult; //oAuthAccessTokenBag.OAuthAccessTokenResult = OAuthApi.GetAccessToken(oAuthAccessTokenBag.AppId, oAuthAccessTokenBag.AppSecret, code); oAuthAccessTokenBag.OAuthAccessTokenExpireTime = ApiUtility.GetExpireTime(oAuthAccessTokenBag.OAuthAccessTokenResult.expires_in); } } return(oAuthAccessTokenBag.OAuthAccessTokenResult); }
/// <summary> ///【异步方法】获取可用Token /// </summary> /// <param name="componentAppId"></param> /// <param name="getNewToken">是否强制重新获取新的Token</param> /// <returns></returns> public static async Task <PreAuthCodeResult> GetPreAuthCodeResultAsync(string componentAppId, bool getNewToken = false) { if (!CheckRegistered(componentAppId)) { throw new WeixinOpenException(UN_REGISTER_ALERT); } var componentBag = TryGetItem(componentAppId); using (Cache.BeginCacheLock(LockResourceName + ".GetPreAuthCodeResult", componentAppId))//同步锁 { if (getNewToken || componentBag.PreAuthCodeExpireTime <= DateTime.Now) { //已过期,重新获取 var componentVerifyTicket = TryGetComponentVerifyTicket(componentAppId); var accessToken = TryGetComponentAccessToken(componentAppId, componentBag.ComponentAppSecret, componentVerifyTicket); var preAuthCodeResult = await ComponentApi.GetPreAuthCodeAsync(componentBag.ComponentAppId, accessToken); componentBag.PreAuthCodeExpireTime = ApiUtility.GetExpireTime(preAuthCodeResult.expires_in); componentBag.PreAuthCodeResult = preAuthCodeResult; Update(componentBag);//更新到缓存 ////TODO:这里有出现expires_in=0的情况,导致始终处于过期状态(也可能是因为参数过期等原因没有返回正确的数据,待观察) //var expiresIn = componentBag.PreAuthCodeResult.expires_in > 0 // ? componentBag.PreAuthCodeResult.expires_in // : 60 * 20;//默认为20分钟 //componentBag.PreAuthCodeExpireTime = DateTime.Now.AddSeconds(expiresIn); } } return(componentBag.PreAuthCodeResult); }
/// <summary> /// 【异步方法】获取可用Ticket /// </summary> /// <param name="appId"></param> /// <param name="getNewTicket">是否强制重新获取新的Ticket</param> /// <returns></returns> public static async Task <JsApiTicketResult> GetTicketResultAsync(string appId, string appSecret, bool getNewTicket = false) { if (!await CheckRegisteredAsync(BuildingKey(appId, appSecret)).ConfigureAwait(false)) { throw new WeixinWorkException(UN_REGISTER_ALERT); } var jsApiTicketBag = await TryGetItemAsync(BuildingKey(appId, appSecret)).ConfigureAwait(false); //lock (jsApiTicketBag.Lock) { if (getNewTicket || jsApiTicketBag.ExpireTime <= SystemTime.Now) { //已过期,重新获取 var jsApiTicketResult = await CommonApi.GetTicketAsync(jsApiTicketBag.CorpId, jsApiTicketBag.CorpSecret).ConfigureAwait(false); jsApiTicketBag.JsApiTicketResult = jsApiTicketResult; //jsApiTicketBag.JsApiTicketResult = CommonApi.GetTicket(jsApiTicketBag.AppId, jsApiTicketBag.AppSecret); jsApiTicketBag.ExpireTime = ApiUtility.GetExpireTime(jsApiTicketBag.JsApiTicketResult.expires_in); await UpdateAsync(jsApiTicketBag, null).ConfigureAwait(false);//更新到缓存 } } return(jsApiTicketBag.JsApiTicketResult); }
/// <summary> /// 获取可用Ticket /// </summary> /// <param name="appId"></param> /// <param name="code">code作为换取access_token的票据,每次用户授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。</param> /// <param name="getNewToken">是否强制重新获取新的Ticket</param> /// <returns></returns> public static OAuthAccessTokenResult GetOAuthAccessTokenResult(string appId, string code, bool getNewToken = false) { var key = BuildKey(appId, code); if (!CheckRegistered(key)) { throw new UnRegisterAppIdException(null, "此 appId code 尚未注册,请先使用 OAuthAccessTokenContainer.Register 完成注册(全局执行一次即可)!"); } var oAuthAccessTokenBag = TryGetItem(key); using (Cache.BeginCacheLock(LockResourceName, key))//同步锁 { if (getNewToken || oAuthAccessTokenBag.OAuthAccessTokenExpireTime <= SystemTime.Now) { //已过期,重新获取 oAuthAccessTokenBag.OAuthAccessTokenResult = OAuthApi.GetAccessToken(oAuthAccessTokenBag.AppId, oAuthAccessTokenBag.AppSecret, code); oAuthAccessTokenBag.OAuthAccessTokenExpireTime = ApiUtility.GetExpireTime(oAuthAccessTokenBag.OAuthAccessTokenResult.expires_in); Update(oAuthAccessTokenBag, null); } } return(oAuthAccessTokenBag.OAuthAccessTokenResult); }
/// <summary> /// 【异步方法】获取可用AccessToken /// </summary> /// <param name="componentAppId"></param> /// <param name="componentVerifyTicket">如果为null则自动获取</param> /// <param name="getNewToken">是否强制重新获取新的Token</param> /// <returns></returns> public static async Task <ComponentAccessTokenResult> GetComponentAccessTokenResultAsync(string componentAppId, string componentVerifyTicket = null, bool getNewToken = false) { if (!CheckRegistered(componentAppId)) { throw new WeixinOpenException(UN_REGISTER_ALERT); } var accessTokenBag = (ComponentBag)ItemCollection[componentAppId]; // lock (accessTokenBag.Lock) { if (getNewToken || accessTokenBag.ComponentAccessTokenExpireTime <= DateTime.Now) { //已过期,重新获取 componentVerifyTicket = componentVerifyTicket ?? TryGetComponentVerifyTicket(componentAppId); var componentAccessTokenResult = await ComponentApi.GetComponentAccessTokenAsync(accessTokenBag.ComponentAppId, accessTokenBag.ComponentAppSecret, componentVerifyTicket); accessTokenBag.ComponentAccessTokenResult = componentAccessTokenResult; accessTokenBag.ComponentAccessTokenExpireTime = ApiUtility.GetExpireTime(componentAccessTokenResult.expires_in); } } return(accessTokenBag.ComponentAccessTokenResult); }
/// <summary> /// 获取可用AccessTokenResult对象 /// </summary> /// <param name="appId"></param> /// <param name="getNewToken">是否强制重新获取新的Token</param> /// <returns></returns> public static AccessTokenResult GetAccessTokenResult(string appId, bool getNewToken = false) { if (!CheckRegistered(appId)) { throw new UnRegisterAppIdException(appId, string.Format("此appId({0})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!", appId)); } var accessTokenBag = TryGetItem(appId); if (getNewToken || accessTokenBag.AccessTokenExpireTime <= DateTime.Now) { using (Cache.BeginCacheLock(LockResourceName, appId)) //同步锁 { if (getNewToken || accessTokenBag.AccessTokenExpireTime <= DateTime.Now) { //已过期,重新获取 accessTokenBag.AccessTokenResult = CommonApi.GetToken(accessTokenBag.AppId, accessTokenBag.AppSecret); accessTokenBag.AccessTokenExpireTime = ApiUtility.GetExpireTime(accessTokenBag.AccessTokenResult.expires_in); } } } return(accessTokenBag.AccessTokenResult); }