Esempio n. 1
0
        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);
        }
Esempio n. 4
0
        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));
        }