/// <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 }
/// <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 }