public override async Task <AuthorizationResult> GetTokenAsync(Application application, HttpRequest callbackRequest)
        {
            if (callbackRequest == null)
            {
                throw new ArgumentNullException(nameof(callbackRequest));
            }
            var           code          = callbackRequest.QueryString["code"];
            var           grant_type    = "authorization_code";
            var           client_id     = application.AppKey;
            var           client_secret = application.Secret;
            var           redirect_uri  = application.RedirectUrl;
            StringBuilder requestPar    = new StringBuilder();

            requestPar.Append($"grant_type={grant_type}&");
            requestPar.Append($"client_id={client_id}&");
            requestPar.Append($"client_secret={client_secret}&");
            requestPar.Append($"redirect_uri={redirect_uri}&");
            requestPar.Append($"code={code}");
            var result = await HttpHelp.GetStrAsync(GenerateApiUrl(application, requestPar.ToString())).ConfigureAwait(false);

            ValidateResult(result);
            QQAuthorizationTokenResult tokenResult = new QQAuthorizationTokenResult();
            await Task.Factory.StartNew(() => { tokenResult = AnalyParameter(result); }).ConfigureAwait(false);

            AuthorizationResult authorizationResult = new AuthorizationResult
            {
                ExpireAt        = DateTime.Now.AddMinutes(-3).AddSeconds(tokenResult.expires_in),
                RefreshExpireAt = DateTime.Now.AddMinutes(-3).AddSeconds(tokenResult.expires_in),
                Token           = tokenResult.access_token,
                OpenId          = await GetOpenId(tokenResult.access_token).ConfigureAwait(false)
            };

            return(authorizationResult);
        }
        private QQAuthorizationTokenResult AnalyParameter(string urlResult)
        {
            object qAuthorizationTokenResult = new QQAuthorizationTokenResult();
            var    urlResults = urlResult.Split('&');

            Parallel.For(0, urlResults.Length, (i) =>
            {
                var attbuiter    = urlResults[i].Split('=')[0];
                var value        = urlResults[i].Split('=')[1];
                var propertyInfo = qAuthorizationTokenResult.GetType().GetProperty(attbuiter, System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.IgnoreCase | System.Reflection.BindingFlags.Instance);
                if (propertyInfo != null)
                {
                    propertyInfo.SetValue(qAuthorizationTokenResult, Convert.ChangeType(value, propertyInfo.PropertyType));
                }
            });
            return((QQAuthorizationTokenResult)qAuthorizationTokenResult);
        }