/// <summary>
        /// 接受回调请求后向平台换取Token。
        /// </summary>
        /// <param name="application">平台应用。</param>
        /// <param name="callbackRequest">回调请求。</param>
        public override async Task<AuthorizationResult> GetTokenAsync(Application application, HttpRequest callbackRequest)
        {


            #region 请求参数
            //授权码
            string code = callbackRequest.QueryString["code"];
            //应用app  key
            string client_id = application.AppKey;
            //应用密匙
            string client_secret = application.Secret;
            //换取方式
            string grant_type = "authorization_code";
            //回调请求
            string redirect_uri = application.RedirectUrl;

            #endregion

            #region 生成请求URL
            //请求URL
            string url = application.Platform.TokenUrl;
            //请求参数拼接
            string para = string.Format("code={0}&app_key={1}&app_secret={2}&grant_type={3}&redirect_uri={4}",
                code, client_id, client_secret, grant_type, redirect_uri);

            #endregion

            #region 发送请求及处理结果

            //返回json字符串结果
            string json = await HttpHelp.GetStrAsync(url + "?" + para);
            JavaScriptSerializer jss = new JavaScriptSerializer();
            if (json.Contains("data"))
            {
                //反序列化json字符串
                MeiLiShuoData meiLiShuoData = await Task.Factory.StartNew(() => { return Newtonsoft.Json.JsonConvert.DeserializeObject<MeiLiShuoData>(json); });
                MeiLiShuoJson meiLiShuoJson = meiLiShuoData.data;
                //填充数据返回
                return new AuthorizationResult()
                {
                    OpenId = meiLiShuoJson.Meilishuo_user_id,
                    Token = meiLiShuoJson.Access_token,
                    RefreshToken = meiLiShuoJson.Refresh_token,
                    TokenType = meiLiShuoJson.Token_type,
                    ExpireAt = DateTime.Now.AddMinutes(-1).AddSeconds(36000),
                    RefreshExpireAt = DateTime.FromFileTimeUtc(meiLiShuoJson.Re_expires_in),
                    UserName = meiLiShuoData.data.Meilishuo_shop_nick
                };

            }
            else//异常处理
            {
                //抛异常
                MeiLiShuoExecption ex = jss.Deserialize<MeiLiShuoExecption>(json);
                throw EtpException.Create(application.Platform.Name, ex.Error_code, ex.Message, "", "");
            }
            #endregion

        }
Пример #2
0
        /// <summary>
        /// 接受回调请求后向平台换取Token。
        /// </summary>
        /// <param name="application">应用信息。</param>
        /// <param name="callbackRequest">回调请求。</param>
        public override async Task<AuthorizationResult> GetTokenAsync(Application application, HttpRequest callbackRequest)
        {

            #region 获取Token请求参数

            //从请求报文中获取签名
            string code = callbackRequest.Params["Code"];
            //授权类型,使用authorization_code即可
            string grant_type = "authorization_code";
            //是否需要返回refresh_token,如果返回了refresh_token,原来获取的refresh_token也不会失效,除非超过半年有效期
            string need_refresh_token = "true";
            //app唯一标识,即appKey
            string client_id = application.AppKey;
            //app密钥
            string client_secret = application.Secret;
            //app入口地址
            string redirect_uri = application.RedirectUrl;

            #endregion

            #region 生成请求URL
            string url = application.Platform.TokenUrl.Replace("YOUR_APPKEY", application.AppKey);
            string para = string.Format("grant_type={0}&need_refresh_token={1}&client_id= {2}&client_secret= {3}&redirect_uri={4}&code={5}",
                grant_type, need_refresh_token, client_id, client_secret, redirect_uri, code);

            #endregion

            #region 发送请求及返回结果

            try
            {
                //发送请求报文
                string json = await HttpHelp.GetStrAsync(url + "?" + para);
                //判断是否返回异常
                if (json.Contains("error"))
                {
                    AlibabaException alibabaException = await Task.Factory.StartNew(() => { return JsonConvert.DeserializeObject<AlibabaException>(json); });
                    //抛出异常
                    if (string.IsNullOrWhiteSpace(alibabaException.Error))
                    {
                        throw EtpException.Create(application.Platform.Name, alibabaException.Error_code.ToString(), alibabaException.Error_message, "", "");
                    }
                    else
                    {
                        throw EtpException.Create(application.Platform.Name, alibabaException.Error, alibabaException.Error_description, "", "");
                    }
                }
                else
                {
                    //把返回的json字符串反序列化
                    AlibabaJson alibabaJson = await Task.Factory.StartNew(() => { return JsonConvert.DeserializeObject<AlibabaJson>(json); });
                    //填充AuthorizationResult数据
                    return new AuthorizationResult()
                    {
                        Token = alibabaJson.Access_token,
                        OpenId =alibabaJson.AliId,
                        RefreshToken = alibabaJson.Refresh_token,
                        UserName = alibabaJson.MemberId,
                        ExpireAt = DateTime.Now.AddMinutes(-1).AddSeconds(alibabaJson.Expires_in),
                        RefreshExpireAt = DateTime.Parse(alibabaJson.Refresh_token_timeout.Substring(0, 4) + "-" +
                        alibabaJson.Refresh_token_timeout.Substring(4, 2) + "-" +
                        alibabaJson.Refresh_token_timeout.Substring(6, 2) + " " +
                        alibabaJson.Refresh_token_timeout.Substring(8, 2) + ":" +
                        alibabaJson.Refresh_token_timeout.Substring(10, 2) + ":" +
                        alibabaJson.Refresh_token_timeout.Substring(12, 2))
                    };
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
            #endregion
        }