/// <summary> /// 使用AccessToken进行操作时,如果遇到AccessToken错误的情况,重新获取AccessToken一次,并重试。 /// 使用此方法之前必须使用AccessTokenContainer.Register(_appId, _appSecret);或JsApiTicketContainer.Register(_appId, _appSecret);方法对账号信息进行过注册,否则会出错。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="fun"></param> /// <param name="accessTokenOrAppId">AccessToken或AppId。如果为null,则自动取已经注册的第一个appId/appSecret来信息获取AccessToken。</param> /// <param name="retryIfFaild">请保留默认值true,不用输入。</param> /// <returns></returns> public static T TryCommonApi <T>(Func <string, T> fun, string accessTokenOrAppId = null, bool retryIfFaild = true) where T : WxJsonResult { string appId = null; string accessToken = null; if (accessTokenOrAppId == null) { appId = AccessTokenContainer.GetFirstOrDefaultAppId(); if (appId == null) { throw new WeixinException("尚无已经注册的AppId,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!"); } } else if (ApiUtility.IsAppId(accessTokenOrAppId)) { if (!AccessTokenContainer.CheckRegistered(accessTokenOrAppId)) { throw new WeixinException("此appId尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!"); } appId = accessTokenOrAppId; } else { //accessToken accessToken = accessTokenOrAppId; } T result = null; try { if (accessToken == null) { var accessTokenResult = AccessTokenContainer.GetTokenResult(appId, false); accessToken = accessTokenResult.access_token; } result = fun(accessToken); } catch (ErrorJsonResultException ex) { if (!retryIfFaild && appId != null && ex.JsonResult.errcode == ReturnCode.获取access_token时AppSecret错误或者access_token无效) { //尝试重新验证 var accessTokenResult = AccessTokenContainer.GetTokenResult(appId, true); accessToken = accessTokenResult.access_token; result = TryCommonApi(fun, appId, false); } else { result = Activator.CreateInstance <T>(); result.errcode = ex.JsonResult.errcode; result.errmsg = ex.JsonResult.errmsg; } } return(result); }
/// <summary> /// 使用AccessToken进行操作时,如果遇到AccessToken错误的情况,重新获取AccessToken一次,并重试。 /// 使用此方法之前必须使用AccessTokenContainer.Register(_appId, _appSecret);或JsApiTicketContainer.Register(_appId, _appSecret);方法对账号信息进行过注册,否则会出错。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="fun"></param> /// <param name="accessTokenOrAppId">AccessToken或AppId。如果为null,则自动取已经注册的第一个appId/appSecret来信息获取AccessToken。</param> /// <param name="retryIfFaild">请保留默认值true,不用输入。</param> /// <returns></returns> public static T TryCommonApi <T>(Func <string, T> fun, string accessTokenOrAppId = null, bool retryIfFaild = true) where T : WxJsonResult { string appId = null; string accessToken = null; if (accessTokenOrAppId == null) { appId = AccessTokenContainer.GetFirstOrDefaultAppId(); if (appId == null) { throw new UnRegisterAppIdException(null, "尚无已经注册的AppId,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!"); } } else if (ApiUtility.IsAppId(accessTokenOrAppId)) { if (!AccessTokenContainer.CheckRegistered(accessTokenOrAppId)) { throw new UnRegisterAppIdException(accessTokenOrAppId, string.Format("此appId({0})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!", accessTokenOrAppId)); } appId = accessTokenOrAppId; } else { accessToken = accessTokenOrAppId;//accessToken } T result = null; try { if (accessToken == null) { var accessTokenResult = AccessTokenContainer.GetAccessTokenResult(appId, false); accessToken = accessTokenResult.access_token; } result = fun(accessToken); } catch (ErrorJsonResultException ex) { if (retryIfFaild && appId != null && ex.JsonResult.errcode == ReturnCode.获取access_token时AppSecret错误或者access_token无效) { //尝试重新验证 var accessTokenResult = AccessTokenContainer.GetAccessTokenResult(appId, true);//强制获取并刷新最新的AccessToken accessToken = accessTokenResult.access_token; result = TryCommonApi(fun, appId, false); } else { throw; } } return(result); }
public static T TryCommonApi <T>(Func <string, T> fun, string accessTokenOrAppId = null, bool retryIfFaild = true) where T : HiShopJsonResult { string text = null; string text2 = null; if (accessTokenOrAppId == null) { text = AccessTokenContainer.GetFirstOrDefaultAppId(); if (text == null) { throw new Exception("尚无已经注册的AppId,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!"); } } else if (ApiUtility.IsAppId(accessTokenOrAppId)) { if (!AccessTokenContainer.CheckRegistered(accessTokenOrAppId)) { throw new Exception("此appId尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!"); } text = accessTokenOrAppId; } else { text2 = accessTokenOrAppId; } T val = null; try { if (text2 == null) { AccessTokenResult tokenResult = AccessTokenContainer.GetTokenResult(text, false); text2 = tokenResult.access_token; } return(fun(text2)); } catch (Exception ex) { if (!string.IsNullOrEmpty(ex.Message) && ApiHandlerWapper.getTokenCount < ApiHandlerWapper.MAXGETTOKENCOUNT) { ApiHandlerWapper.getTokenCount++; AccessTokenResult tokenResult2 = AccessTokenContainer.GetTokenResult(text, true); text2 = tokenResult2.access_token; return(ApiHandlerWapper.TryCommonApi(fun, text, false)); } throw; } }
/// <summary> /// TryCommonApi 方法的基类 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="platformType">平台类型,PlatformType枚举</param> /// <param name="accessTokenContainer_GetFirstOrDefaultAppIdFunc">AccessTokenContainer中的GetFirstOrDefaultAppId()方法</param> /// <param name="accessTokenContainer_CheckRegisteredFunc">AccessTokenContainer中的bool CheckRegistered(appId,getNew)方法</param> /// <param name="accessTokenContainer_GetAccessTokenResultFunc">AccessTokenContainer中的AccessTokenResult GetAccessTokenResult(appId)方法</param> /// <param name="invalidCredentialValue">"ReturnCode.获取access_token时AppSecret错误或者access_token无效"枚举的值</param> /// <param name="fun"></param> /// <param name="accessTokenOrAppId"></param> /// <param name="retryIfFaild"></param> /// <returns></returns> public static T TryCommonApiBase <T>( PlatformType platformType, Func <string> accessTokenContainer_GetFirstOrDefaultAppIdFunc, Func <string, bool> accessTokenContainer_CheckRegisteredFunc, Func <string, bool, IAccessTokenResult> accessTokenContainer_GetAccessTokenResultFunc, int invalidCredentialValue, Func <string, T> fun, string accessTokenOrAppId = null, bool retryIfFaild = true) where T : BaseJsonResult { //ApiHandlerWapperFactory.ApiHandlerWapperFactoryCollection["s"] = ()=> new Senparc.Weixin.MP.AdvancedAPIs.User.UserInfoJson(); //var platform = ApiHandlerWapperFactory.CurrentPlatform;//当前平台 /* * 对于企业微信来说,AppId = key = CorpId+CorpSecret */ string appId = null; string accessToken = null; if (accessTokenOrAppId == null) { appId = accessTokenContainer_GetFirstOrDefaultAppIdFunc != null?accessTokenContainer_GetFirstOrDefaultAppIdFunc() : null; // AccessTokenContainer.GetFirstOrDefaultAppId(); if (appId == null) { throw new UnRegisterAppIdException(null, "尚无已经注册的AppId,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!模块:" + platformType); } } else if (ApiUtility.IsAppId(accessTokenOrAppId, platformType)) { //if (!AccessTokenContainer.CheckRegistered(accessTokenOrAppId)) if (!accessTokenContainer_CheckRegisteredFunc(accessTokenOrAppId)) { throw new UnRegisterAppIdException(accessTokenOrAppId, string.Format("此appId({0})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!模块:" + platformType, accessTokenOrAppId)); } appId = accessTokenOrAppId; } else { accessToken = accessTokenOrAppId;//accessToken } T result = null; try { if (accessToken == null) { var accessTokenResult = accessTokenContainer_GetAccessTokenResultFunc(appId, false); //AccessTokenContainer.GetAccessTokenResult(appId, false); accessToken = accessTokenResult.access_token; } result = fun(accessToken); } catch (ErrorJsonResultException ex) { if (retryIfFaild && appId != null //如果 appId 为 null,已经没有重试的意义(直接提供的 AccessToken 是错误的) //&& ex.JsonResult.errcode == ReturnCode.获取access_token时AppSecret错误或者access_token无效) && (int)ex.JsonResult.errcode == invalidCredentialValue) { //尝试重新验证 var accessTokenResult = accessTokenContainer_GetAccessTokenResultFunc(appId, true);//AccessTokenContainer.GetAccessTokenResult(appId, true); //强制获取并刷新最新的AccessToken accessToken = accessTokenResult.access_token; result = TryCommonApiBase(platformType, accessTokenContainer_GetFirstOrDefaultAppIdFunc, accessTokenContainer_CheckRegisteredFunc, accessTokenContainer_GetAccessTokenResultFunc, invalidCredentialValue, fun, accessToken, false); } else { ex.AccessTokenOrAppId = accessTokenOrAppId; throw; } } catch (WeixinException ex) { ex.AccessTokenOrAppId = accessTokenOrAppId; throw; } return(result); }
/// <summary> /// TryCommonApi 方法的基类 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="platformType">平台类型,PlatformType枚举</param> /// <param name="accessTokenContainer_GetFirstOrDefaultAppIdFunc">AccessTokenContainer中的GetFirstOrDefaultAppId()方法</param> /// <param name="accessTokenContainer_CheckRegisteredFunc">AccessTokenContainer中的bool CheckRegistered(appId,getNew)方法</param> /// <param name="accessTokenContainer_GetAccessTokenResultAsyncFunc">AccessTokenContainer中的AccessTokenResult GetAccessTokenResultAsync(appId)方法(异步方法)</param> /// <param name="invalidCredentialValue">"ReturnCode.获取access_token时AppSecret错误或者access_token无效"枚举的值</param> /// <param name="fun"></param> /// <param name="accessTokenOrAppId"></param> /// <param name="retryIfFaild"></param> /// <returns></returns> public static async Task <T> TryCommonApiBaseAsync <T>( PlatformType platformType, Func <string> accessTokenContainer_GetFirstOrDefaultAppIdFunc, Func <string, bool> accessTokenContainer_CheckRegisteredFunc, Func <string, bool, Task <IAccessTokenResult> > accessTokenContainer_GetAccessTokenResultAsyncFunc, int invalidCredentialValue, Func <string, Task <T> > fun, string accessTokenOrAppId = null, bool retryIfFaild = true) where T : BaseJsonResult { //ApiHandlerWapperFactory.ApiHandlerWapperFactoryCollection["s"] = ()=> new Senparc.Weixin.MP.AdvancedAPIs.User.UserInfoJson(); //var platform = ApiHandlerWapperFactory.CurrentPlatform;//当前平台 string appId = null; string accessToken = null; if (accessTokenOrAppId == null) { appId = accessTokenContainer_GetFirstOrDefaultAppIdFunc();// AccessTokenContainer.GetFirstOrDefaultAppId(); if (appId == null) { throw new UnRegisterAppIdException(null, "尚无已经注册的AppId,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!"); } } else if (ApiUtility.IsAppId(accessTokenOrAppId, platformType)) { //if (!AccessTokenContainer.CheckRegistered(accessTokenOrAppId)) if (!accessTokenContainer_CheckRegisteredFunc(accessTokenOrAppId)) { throw new UnRegisterAppIdException(accessTokenOrAppId, string.Format("此appId({0})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!", accessTokenOrAppId)); } appId = accessTokenOrAppId; } else { accessToken = accessTokenOrAppId; //accessToken } T result = null; try { if (accessToken == null) { var accessTokenResult = await accessTokenContainer_GetAccessTokenResultAsyncFunc(appId, false);//AccessTokenContainer.GetAccessTokenResultAsync(appId, false); accessToken = accessTokenResult.access_token; } result = await fun(accessToken); } catch (ErrorJsonResultException ex) { if (retryIfFaild && appId != null //如果 appId 为 null,已经没有重试的意义(直接提供的 AccessToken 是错误的) //&& ex.JsonResult.errcode == ReturnCode.获取access_token时AppSecret错误或者access_token无效) && (int)ex.JsonResult.errcode == invalidCredentialValue) { //尝试重新验证(如果是低版本VS,此处不能使用await关键字,可以直接使用xx.Result输出。VS2013不支持:无法在 catch 字句体中等待) var accessTokenResult = await accessTokenContainer_GetAccessTokenResultAsyncFunc(appId, true);//AccessTokenContainer.GetAccessTokenResultAsync(appId, true); //强制获取并刷新最新的AccessToken accessToken = accessTokenResult.access_token; result = await TryCommonApiBaseAsync(platformType, accessTokenContainer_GetFirstOrDefaultAppIdFunc, accessTokenContainer_CheckRegisteredFunc, accessTokenContainer_GetAccessTokenResultAsyncFunc, invalidCredentialValue, fun, appId, false); //result = TryCommonApiAsync(fun, appId, false); } else { throw; } } return(result); }
public static T TryCommonTicketApi <T>(Func <string, T> fun, string AppId, string strSecret, bool retryIfFaild = true) where T : WxJsonResult { string appId = null; string ticket = null; if (AppId == null) { //appId = AccessTokenContainer.GetFirstOrDefaultAppId(); if (appId == null) { throw new UnRegisterAppIdException(null, "尚无已经注册的AppId,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!"); } } else if (ApiUtility.IsAppId(AppId)) { //if (!AccessTokenContainer.CheckRegistered(AppId)) //{ // throw new UnRegisterAppIdException(AppId, string.Format("此appId({0})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!", AppId)); //} appId = AppId; } else { //accessToken ticket = AppId; } T result = null; try { if (ticket == null) { var accessTokenResult = JsApiTicketContainer.GetJsApiTicketResult(appId, strSecret, Innocellence.Weixin.MP.CommonAPIs.CommonApi.GetTicket, false); ticket = accessTokenResult.ticket; } result = fun(ticket); } catch (ErrorJsonResultException ex) { if (retryIfFaild && appId != null && ex.JsonResult.errcode == ReturnCode.Ticket不合法) { JsApiTicketContainer.UpdateNull(appId, strSecret); //尝试重新验证 var accessTokenResult = JsApiTicketContainer.GetJsApiTicketResult(appId, strSecret, Innocellence.Weixin.MP.CommonAPIs.CommonApi.GetTicket, false);//强制获取并刷新最新的AccessToken if (ticket == accessTokenResult.ticket) { accessTokenResult = JsApiTicketContainer.GetJsApiTicketResult(appId, strSecret, Innocellence.Weixin.MP.CommonAPIs.CommonApi.GetTicket, true); } ticket = accessTokenResult.ticket; result = fun(ticket); //result = TryCommonApi(fun, appId,strSecret, false); } else { throw; } } return(result); }
/// <summary> /// TryCommonApi 方法的基类 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="platformType">平台类型,PlatformType枚举</param> /// <param name="accessTokenContainer_GetFirstOrDefaultAppIdAsyncFunc">AccessTokenContainer中的GetFirstOrDefaultAppId()方法</param> /// <param name="accessTokenContainer_CheckRegisteredAsyncFunc">AccessTokenContainer中的bool CheckRegistered(appId,getNew)方法</param> /// <param name="accessTokenContainer_GetAccessTokenResultAsyncFunc">AccessTokenContainer中的AccessTokenResult GetAccessTokenResultAsync(appId)方法(异步方法)</param> /// <param name="invalidCredentialValue">"ReturnCode.获取access_token时AppSecret错误或者access_token无效"枚举的值</param> /// <param name="fun"></param> /// <param name="accessTokenOrAppId">公众号、小程序中的 AppId,或企业微信中的 AppKey(由AppId+AppSecret组成)</param> /// <param name="retryIfFaild"></param> /// <returns></returns> public static async Task <T> TryCommonApiBaseAsync <T>( PlatformType platformType, Func <Task <string> > accessTokenContainer_GetFirstOrDefaultAppIdAsyncFunc, Func <string, Task <bool> > accessTokenContainer_CheckRegisteredAsyncFunc, Func <string, bool, Task <IAccessTokenResult> > accessTokenContainer_GetAccessTokenResultAsyncFunc, int invalidCredentialValue, Func <string, Task <T> > fun, string accessTokenOrAppId = null, bool retryIfFaild = true) where T : BaseJsonResult, new() { //ApiHandlerWapperFactory.ApiHandlerWapperFactoryCollection["s"] = ()=> new Senparc.Weixin.MP.AdvancedAPIs.User.UserInfoJson(); //var platform = ApiHandlerWapperFactory.CurrentPlatform;//当前平台 string appId = null; string accessToken = null; if (accessTokenOrAppId == null) { appId = await accessTokenContainer_GetFirstOrDefaultAppIdAsyncFunc().ConfigureAwait(false);// AccessTokenContainer.GetFirstOrDefaultAppId(); if (appId == null) { var unregisterAppIdEx = new UnRegisterAppIdException(null, $"尚无已经注册的AppId,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!模块:{platformType}"); if (Config.ThrownWhenJsonResultFaild) { throw unregisterAppIdEx;//抛出异常 } else { return(GetConfigErrorResult <T>(unregisterAppIdEx.Message));//返回 Json 错误结果 } } } else if (ApiUtility.IsAppId(accessTokenOrAppId, platformType)) { //if (!AccessTokenContainer.CheckRegistered(accessTokenOrAppId)) if (!await accessTokenContainer_CheckRegisteredAsyncFunc(accessTokenOrAppId)) { var unregisterAppIdEx = new UnRegisterAppIdException(null, $"此appId({accessTokenOrAppId})尚未注册,请先使用AccessTokenContainer.Register完成注册(全局执行一次即可)!模块:{platformType}"); if (Config.ThrownWhenJsonResultFaild) { throw unregisterAppIdEx;//抛出异常 } else { return(GetConfigErrorResult <T>(unregisterAppIdEx.Message));//返回 Json 错误结果 } } appId = accessTokenOrAppId; } else { accessToken = accessTokenOrAppId; //accessToken } T result = null; try { if (accessToken == null) { var accessTokenResult = await accessTokenContainer_GetAccessTokenResultAsyncFunc(appId, false);//AccessTokenContainer.GetAccessTokenResultAsync(appId, false); accessToken = accessTokenResult.access_token; } result = await fun(accessToken).ConfigureAwait(false); //当系统不抛出异常,且当前返回结果不成功,且允许重试的时候,在内部抛出一个异常,以便进行 Retry if (!Config.ThrownWhenJsonResultFaild && result is WxJsonResult && (result as WxJsonResult).errcode != ReturnCode.请求成功 && retryIfFaild ) { var errorResult = result as WxJsonResult; throw new ErrorJsonResultException( string.Format("微信请求发生错误!错误代码:{0},说明:{1}", (int)errorResult.errcode, errorResult.errmsg), null, errorResult); } } catch (ErrorJsonResultException ex) { if (retryIfFaild && appId != null //如果 appId 为 null,已经没有重试的意义(直接提供的 AccessToken 是错误的) //&& ex.JsonResult.errcode == ReturnCode.获取access_token时AppSecret错误或者access_token无效) && (int)ex.JsonResult.errcode == invalidCredentialValue) { //尝试重新验证(如果是低版本VS,此处不能使用await关键字,可以直接使用xx.Result输出。VS2013不支持:无法在 catch 字句体中等待) var accessTokenResult = await accessTokenContainer_GetAccessTokenResultAsyncFunc(appId, true).ConfigureAwait(false);//AccessTokenContainer.GetAccessTokenResultAsync(appId, true); //强制获取并刷新最新的AccessToken accessToken = accessTokenResult.access_token; result = await TryCommonApiBaseAsync(platformType, accessTokenContainer_GetFirstOrDefaultAppIdAsyncFunc, accessTokenContainer_CheckRegisteredAsyncFunc, accessTokenContainer_GetAccessTokenResultAsyncFunc, invalidCredentialValue, fun, accessToken, false).ConfigureAwait(false); //result = TryCommonApiAsync(fun, appId, false); } else { //如果要求抛出异常,并且传入的是 AccessToken(AppId 为 null),那么已经没有必要重试,直接抛出异常 if (Config.ThrownWhenJsonResultFaild && appId == null) { throw;//抛出异常 } else { return(GetJsonErrorResult <T>(ex.JsonResult));//返回 Json 错误结果 } } } catch (WeixinException ex) { ex.AccessTokenOrAppId = accessTokenOrAppId; //判断如果传进来的是 AccessToken,并且不抛出异常,那么这里不throw if (Config.ThrownWhenJsonResultFaild && ApiUtility.IsAppId(accessTokenOrAppId, platformType)) { throw;//抛出异常 } else { return(GetConfigErrorResult <T>(ex.Message));//返回 Json 错误结果 } } return(result); }