public async Task OnGetAsync() { var allMpAccounts = await _mpAccountService.GetObjectListAsync(0, 0, z => true, z => z.Id, OrderingType.Descending); MpAccountDtos = allMpAccounts.Select(z => _mpAccountService.Mapper.Map <MpAccountDto>(z)).ToList(); AccessTokenBags = new List <AccessTokenBag>(); RegisteredMpAccountCount = 0; foreach (var mpAccount in allMpAccounts) { if (await AccessTokenContainer.CheckRegisteredAsync(mpAccount.AppId)) { var bag = await AccessTokenContainer.TryGetItemAsync(mpAccount.AppId); if (bag.AccessTokenResult != null && !bag.AccessTokenResult.access_token.IsNullOrEmpty()) { RegisteredMpAccountCount++; } AccessTokenBags.Add(bag); } } WeixinUserCount = await _weixinUserService.GetCountAsync(z => true); TodayWeixinUserCount = await _weixinUserService.GetCountAsync(z => z.AddTime >= DateTime.Today); }
///// 使用AccessToken进行操作时,如果遇到AccessToken错误的情况,重新获取AccessToken一次,并重试 ///// </summary> ///// <typeparam name="T"></typeparam> ///// <param name="appId"></param> ///// <param name="appSecret"></param> ///// <param name="fun">第一个参数为accessToken</param> ///// <param name="retryIfFaild"></param> ///// <returns></returns> //[Obsolete("请使用TryCommonApi()方法")] //public static T Do<T>(Func<string, T> fun, string appId, string appSecret, bool retryIfFaild = true) // where T : WxJsonResult //{ // T result = null; // try // { // var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret, false); // result = fun(accessToken); // } // catch (ErrorJsonResultException ex) // { // if (retryIfFaild && ex.JsonResult.errcode == ReturnCode.获取access_token时AppSecret错误或者access_token无效) // { // //尝试重新验证 // var accessToken = AccessTokenContainer.TryGetAccessToken(appId, appSecret, true); // result = Do(fun, appId, appSecret, false); // } // } // return result; //} #endregion #endregion #region 异步方法 /// <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 async Task <T> TryCommonApiAsync <T>(Func <string, Task <T> > fun, string accessTokenOrAppId = null, bool retryIfFaild = true) where T : WxJsonResult, new() { Func <Task <string> > accessTokenContainer_GetFirstOrDefaultAppIdAsyncFunc = async() => await AccessTokenContainer.GetFirstOrDefaultAppIdAsync(PlatformType.MP).ConfigureAwait(false); Func <string, Task <bool> > accessTokenContainer_CheckRegisteredAsyncFunc = async appId => await AccessTokenContainer.CheckRegisteredAsync(appId).ConfigureAwait(false); Func <string, bool, Task <IAccessTokenResult> > accessTokenContainer_GetAccessTokenResultAsyncFunc = (appId, getNewToken) => AccessTokenContainer.GetAccessTokenResultAsync(appId, getNewToken); int invalidCredentialValue = (int)ReturnCode.获取access_token时AppSecret错误或者access_token无效; var result = ApiHandlerWapperBase. TryCommonApiBaseAsync( PlatformType.MP, accessTokenContainer_GetFirstOrDefaultAppIdAsyncFunc, accessTokenContainer_CheckRegisteredAsyncFunc, accessTokenContainer_GetAccessTokenResultAsyncFunc, invalidCredentialValue, fun, accessTokenOrAppId, retryIfFaild); return(await result.ConfigureAwait(false)); }
/// <summary> /// 【异步方法】使用AccessToken进行操作时,如果遇到AccessToken错误的情况,重新获取AccessToken一次,并重试。 /// 使用此方法之前必须使用AccessTokenContainer.Register(_appId, _appSecret);或JsApiTicketContainer.Register(_appId, _appSecret);方法对账号信息进行过注册,否则会出错。 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="fun"></param> /// <param name="accessTokenOrAppKey">AccessToken或AppKey。如果为null,则自动取已经注册的第一个corpId/corpSecret来信息获取AccessToken。</param> /// <param name="retryIfFaild">请保留默认值true,不用输入。</param> /// <returns></returns> public static async Task <T> TryCommonApiAsync <T>(Func <string, Task <T> > fun, string accessTokenOrAppKey, bool retryIfFaild = true) where T : WorkJsonResult { Func <Task <string> > accessTokenContainer_GetFirstOrDefaultAppIdAsyncFunc = async() => await AccessTokenContainer.GetFirstOrDefaultAppIdAsync(PlatformType.Work); Func <string, Task <bool> > accessTokenContainer_CheckRegisteredAsyncFunc = async appKey => { /* * 对于企业微信来说,AppId = key = CorpId+'@'+CorpSecret */ return(await AccessTokenContainer.CheckRegisteredAsync(appKey)); }; Func <string, bool, Task <IAccessTokenResult> > accessTokenContainer_GetAccessTokenResultAsyncFunc = (appKey, getNewToken) => { /* * 对于企业微信来说,AppId = key = CorpId+'@'+CorpSecret */ return(AccessTokenContainer.GetTokenResultAsync(appKey, getNewToken)); }; int invalidCredentialValue = (int)ReturnCode_Work.获取access_token时Secret错误_或者access_token无效; var result = ApiHandlerWapperBase. TryCommonApiBaseAsync( PlatformType.Work, accessTokenContainer_GetFirstOrDefaultAppIdAsyncFunc, accessTokenContainer_CheckRegisteredAsyncFunc, accessTokenContainer_GetAccessTokenResultAsyncFunc, invalidCredentialValue, fun, accessTokenOrAppKey, retryIfFaild); return(await result); }
public async Task <IActionResult> OnPostAccessTokenStatusAsync([FromBody] int[] ids) { var data = new List <AccessTokenData>(); var allMpAccounts = await _mpAccountService.GetFullListAsync(z => true); foreach (var id in ids) { var mpAccount = allMpAccounts.FirstOrDefault(z => z.Id == id); if (mpAccount == null) { continue; } var appId = mpAccount.AppId; string status = null; double leftSeconds = 0; AccessTokenBag bag = null; if (!appId.IsNullOrEmpty()) { if (await AccessTokenContainer.CheckRegisteredAsync(appId)) { bag = await AccessTokenContainer.TryGetItemAsync(appId); if (bag.AccessTokenResult != null && !bag.AccessTokenResult.access_token.IsNullOrEmpty()) { leftSeconds = (bag.AccessTokenExpireTime - SystemTime.Now).TotalSeconds; if (leftSeconds > 9999) { leftSeconds = 0; status = "未启动"; } else if (leftSeconds > 0) { status = "有效"; } else //leftSeconds <= 0 { leftSeconds = 0; status = "已过期"; } } else { status = "未启动"; } } else { status = "未注册"; } } else { status = "AppId无效"; } var totalSeconds = bag?.AccessTokenResult.expires_in ?? 0; var leftPercent = bag?.AccessTokenResult != null && totalSeconds != 0 ? Math.Round(leftSeconds / bag.AccessTokenResult.expires_in * 100, 1) : 0; data.Add(new AccessTokenData() { Id = id, AppId = appId, Status = status, LeftPercent = leftPercent, TotalSeconds = totalSeconds, }); } return(Ok(data)); }