public override bool BackVerifySign(PartnerBackContext context) { NameValueCollection param = new NameValueCollection(); param["err_code"] = context.ResponseParam.AllKeys.Contains("err_code") ? context.ResponseParam["err_code"] : ""; if (!string.IsNullOrWhiteSpace(param["err_code"]) && !param["err_code"].Equals("0")) { param["err_msg"] = context.ResponseParam.AllKeys.Contains("err_msg") ? context.ResponseParam["err_msg"] : ""; if (!string.IsNullOrWhiteSpace(param["err_msg"])) { param["err_msg"] = SpecialUrlEncode(param["err_msg"]); } } param["login_status"] = context.ResponseParam.AllKeys.Contains("login_status") ? context.ResponseParam["login_status"] : ""; param["kjt_user_id"] = context.ResponseParam.AllKeys.Contains("kjt_user_id") ? context.ResponseParam["kjt_user_id"] : ""; param["client_state"] = context.ResponseParam.AllKeys.Contains("client_state") ? context.ResponseParam["client_state"] : ""; param["sign"] = context.ResponseParam.AllKeys.Contains("sign") ? context.ResponseParam["sign"] : ""; if (!string.IsNullOrWhiteSpace(param["client_state"])) { context.ReturnUrl = param["client_state"]; param["client_state"] = SpecialUrlEncode(param["client_state"]); } context.ResponseParam = param; string localSign = SignData(context); if (context.ResponseParam.AllKeys.Contains("sign") && context.ResponseParam["sign"].ToLower().Trim().Equals(localSign.ToLower().Trim())) { return(true); } Logger.WriteLog(string.Format("验签失败,跨境通签名为:{0},本地签名:{1}", context.ResponseParam["sign"], localSign), "PassportKuajingtong", "PassportVerifySign"); return(false); }
/// <summary> /// 第三方登录回调验签 /// </summary> /// <param name="context">第三方登录回调上下文</param> /// <returns></returns> public override bool BackVerifySign(PartnerBackContext context) { string localSign = SignReturnData(context); context.ActionType = PassportActionType.Accept; if (context.ResponseParam["is_success"] == "T") { if (context.ResponseParam.AllKeys.Contains("sign") && context.ResponseParam["sign"] == localSign) { if (VerfyNotifyID(context, context.ResponseParam["notify_id"])) { return(true); } else { Logger.WriteLog(string.Format("验证Notify失败,notify_id:{0}" , context.ResponseParam["notify_id"]), "PartnerAlipay", "PassportVerifySign"); } } } Logger.WriteLog(string.Format("验签失败,支付宝签名为:{0},本地签名:{1}" , context.ResponseParam["sign"], localSign) , "PartnerAlipay" , "PassportVerifySign"); return(false); }
/// <summary> /// Signs the return data. /// </summary> /// <param name="context">The context.</param> /// <returns></returns> private string SignReturnData(PartnerBackContext context) { StringBuilder builder = new StringBuilder(); if (context.ResponseParam != null && context.ResponseParam.AllKeys != null && context.ResponseParam.AllKeys.Length > 0) { List <string> allKeys = context.ResponseParam.AllKeys.OrderBy(m => m).ToList(); foreach (string key in allKeys) { if (key.Equals("sign", StringComparison.CurrentCultureIgnoreCase) || key.Equals("sign_type", StringComparison.CurrentCultureIgnoreCase)) { continue; } builder.AppendFormat("{0}={1}&", key, context.ResponseParam[key]); } } string sourceData = builder.ToString().TrimEnd('&'); sourceData += string.Format("{0}", context.PassportInfo.Parnter.AppSecret); string signData = GetMD5(sourceData, context.PassportInfo.Parnter.Encoding); //Debug模式下记录相关信息至日志 if (context.PassportInfo.Parnter.Debug.Equals("1")) { string sourceParam = BuildStringFromNameValueCollection(context.ResponseParam); Logger.WriteLog(string.Format("原始值:{0},签名明文:{1},签名:{2}", sourceParam, sourceData, signData), "PartnerAlipay", "PassportSignReturnData"); } return(signData); }
/// <summary> /// 第三方登录回调 /// </summary> /// <param name="identify">第三方标识</param> /// <param name="collection">回调参数</param> /// <returns></returns> public PartnerBackResult LoginBack(string identify, NameValueCollection collection) { PartnerBackContext context = new PartnerBackContext(); context.PartnerIdentify = identify; context.ResponseParam = collection; Partners partner = Partners.GetInstance(context); if (!partner.BackVerifySign(context)) { Logger.WriteLog(string.Format("第三方登录回调非法请求,第三方标识:{0}", identify), "Passport", "LoginBack"); throw new BusinessException("登录失败!"); } CustomerInfo customer = null; if (context.ActionType == PassportActionType.Accept) { partner.GetResponseUserInfo(context); customer = new CustomerInfo() { CustomerID = context.CustomerID, CustomerName = context.CustomerName, CustomersType = (int)context.CustomerSouce, InitRank = 1, Password = "", CellPhone = context.CellPhone, Email = context.Email }; var existsCustomer = CustomerFacade.GetCustomerByID(context.CustomerID); if (existsCustomer == null) { int customerSysNo = LoginFacade.CreateCustomer(customer).SysNo; if (customerSysNo <= 0) { Logger.WriteLog(string.Format("第三方登录回调注册用户失败,第三方标识:{0}", identify), "Passport", "LoginBack"); throw new BusinessException("第三方登录注册用户失败!"); } customer.SysNo = customerSysNo; } else { customer.SysNo = existsCustomer.SysNo; } } PartnerBackResult result = new PartnerBackResult() { Customer = customer, ReturnUrl = context.ReturnUrl, ActionType = context.ActionType }; return(result); }
/// <summary> /// Verfies the notify identifier. /// </summary> /// <param name="context">The context.</param> /// <param name="notifyID">The notify identifier.</param> /// <returns></returns> private bool VerfyNotifyID(PartnerBackContext context, string notifyID) { string notifyURL = context.PassportInfo.Parnter.LoginUrl + string.Format("?service=notify_verify&partner={0}¬ify_id={1}" , context.PassportInfo.Parnter.AppID , notifyID); string result = Partners.HttpGetRequest(notifyURL, "utf-8"); return(result.ToLower().Trim() == "true"); }
public static Partners GetInstance(PartnerBackContext context) { if (context != null && !string.IsNullOrWhiteSpace(context.PartnerIdentify)) { context.PassportInfo = GetPassportInfo(context.PartnerIdentify); if (context.PassportInfo != null && context.PassportInfo.Parnter != null) { return(GetInstance(context.PassportInfo.Parnter.PartnerProcessor)); } } return(null); }
public override void GetResponseUserInfo(PartnerBackContext context) { //第一步,获取AccessToken NameValueCollection postData = new NameValueCollection(); postData.Add("client_id", context.PassportInfo.Parnter.AppID); postData.Add("client_secret", context.PassportInfo.Parnter.AppSecret); postData.Add("grant_type", "authorization_code"); postData.Add("code", context.ResponseParam["code"]); postData.Add("redirect_uri", SpecialUrlEncode(BuildActionUrl(context.PassportInfo.Base.BaseUrl, context.PassportInfo.Parnter.LoginBackUrl))); string responseData = HttpPostRequest(context.PassportInfo.Parnter.AccessTokenUrl , BuildStringFromNameValueCollection(postData) , "application/x-www-form-urlencoded" , context.PassportInfo.Parnter.Encoding); //Debug模式下记录相关信息至日志 if (context.PassportInfo.Parnter.Debug.Equals("1")) { Logger.WriteLog(string.Format("获取AccessToken响应数据:{0}", responseData), "PassportSinaWeibo", "GetAccessToken"); } SinaWeiboAccessToken returnData = SerializationUtility.JsonDeserialize <SinaWeiboAccessToken>(responseData); if (returnData == null) { throw new BusinessException("登录失败!"); } //第二步,获取用户信息 string requestParam = string.Format("access_token={0}&uid={1}", returnData.access_token, returnData.uid ); responseData = HttpGetRequest(string.Format("{0}?{1}", context.PassportInfo.Parnter.GetUserInfoUrl, requestParam) , context.PassportInfo.Parnter.Encoding); //Debug模式下记录相关信息至日志 if (context.PassportInfo.Parnter.Debug.Equals("1")) { Logger.WriteLog(string.Format("获取User响应数据:{0}", responseData), "PassportSinaWeibo", "GetUserInfo"); } SinaWeiboUserInfo userInfo = SerializationUtility.JsonDeserialize <SinaWeiboUserInfo>(responseData); context.CustomerID = string.Format("SinaWeibo_{0}", userInfo.id); context.CustomerName = userInfo.screen_name; context.CustomerSouce = Enums.CustomerSourceType.Sina; }
public override bool BackVerifySign(PartnerBackContext context) { NameValueCollection param = new NameValueCollection(); param["code"] = context.ResponseParam.AllKeys.Contains("code") ? context.ResponseParam["code"] : ""; param["state"] = context.ResponseParam.AllKeys.Contains("state") ? context.ResponseParam["state"] : ""; context.ResponseParam = param; context.ActionType = PassportActionType.Accept; string localState = context.PassportInfo.Parnter.CustomProperty1; if (String.Equals(localState, param["state"], StringComparison.CurrentCultureIgnoreCase)) { return(true); } Logger.WriteLog(string.Format("验签失败,新浪微博状态为:{0},本地状态:{1}", context.ResponseParam["state"], localState), "PassportSinaWeibo", "PassportVerifySign"); return(false); }
/// <summary> /// 获取第三方登录回调用户信息 /// </summary> /// <param name="context">第三方登录回调上下文</param> public override void GetResponseUserInfo(PartnerBackContext context) { string alipayUserId = context.ResponseParam["user_id"]; string alipayUserEmail = context.ResponseParam["email"]; string alipayUserRealName = context.ResponseParam["real_name"]; alipayUserRealName = string.IsNullOrEmpty(alipayUserRealName) ? alipayUserId : alipayUserRealName; context.CustomerID = string.Format("Alipay_{0}", alipayUserId); context.CustomerName = alipayUserRealName; if (alipayUserEmail.IndexOf('@') > 0) { context.Email = alipayUserEmail; } else { context.CellPhone = alipayUserEmail; } context.CustomerSouce = Enums.CustomerSourceType.AliPay; }
/// <summary> /// 第三方登录回调验签 /// </summary> /// <param name="context">第三方登录回调上下文</param> /// <returns></returns> public override bool BackVerifySign(PartnerBackContext context) { context.ActionType = PassportActionType.Accept; NameValueCollection param = new NameValueCollection(); param["code"] = context.ResponseParam.AllKeys.Contains("code") ? context.ResponseParam["code"] : ""; param["state"] = context.ResponseParam.AllKeys.Contains("state") ? context.ResponseParam["state"] : ""; context.ResponseParam = param; //如果url中有code参数,说明是获取code请求的回调,需要验证state值,防止CSRF攻击 if (!String.IsNullOrWhiteSpace(param["code"])) { string localState = context.PassportInfo.Parnter.CustomProperty1; if (String.Equals(localState, param["state"], StringComparison.CurrentCultureIgnoreCase)) { return(true); } Logger.WriteLog(string.Format("验签失败,QQ状态为:{0},本地状态:{1}", context.ResponseParam["state"], localState), "PassportTencentQQ", "PassportVerifySign"); return(false); } return(false); }
public override void GetResponseUserInfo(PartnerBackContext context) { int rdm = (new Random()).Next(100000); string kuajingtongUserID = context.ResponseParam["kjt_user_id"]; NameValueCollection param = new NameValueCollection(); param["method"] = HttpUtility.UrlEncode("user.getInfo"); param["version"] = HttpUtility.UrlEncode("1.0"); param["appId"] = HttpUtility.UrlEncode(context.PassportInfo.Parnter.AppID); param["timestamp"] = GetNowTime2Timestamp(); param["nonce"] = rdm.ToString(); param["kjt_user_id"] = kuajingtongUserID; context.ResponseParam = param; string requestParam = string.Format("method={0}&version={1}&appId={2}×tamp={3}&nonce={4}&kjt_user_id={5}&sign={6}", HttpUtility.UrlEncode("user.getInfo"), HttpUtility.UrlEncode("1.0"), HttpUtility.UrlEncode(context.PassportInfo.Parnter.AppID), GetNowTime2Timestamp(), rdm, kuajingtongUserID, SignData(context)); string requestUrl = string.Format("{0}?{1}", context.PassportInfo.Parnter.GetUserInfoUrl, requestParam); string responseData = HttpGetRequest(requestUrl, context.PassportInfo.Parnter.Encoding); KuajingtongReturnData entity = SerializationUtility.JsonDeserialize <KuajingtongReturnData>(responseData); if (entity == null || entity.err_code.Equals("1") || !entity.err_code.Equals("0")) { Logger.WriteLog(string.Format("获取跨境通用户信息失败,原始数据:{0}", responseData), "PassportKuajingtong", "GetUserInfo"); throw new BusinessException("用户不存在!"); } context.CustomerID = string.Format("Kuajingtong_{0}", entity.id); context.CustomerName = entity.username; context.Email = entity.email; context.IsAuth = entity.is_real_auth; context.CustomerSouce = Enums.CustomerSourceType.Kuajingtong; }
/// <summary> /// 获取第三方登录回调用户信息 /// </summary> /// <param name="context">第三方登录回调上下文</param> /// <exception cref="ECommerce.Utility.BusinessException"> /// 登录失败! /// or /// </exception> public override void GetResponseUserInfo(PartnerBackContext context) { //第一步,获取AccessToken NameValueCollection data = new NameValueCollection(); data.Add("client_id", context.PassportInfo.Parnter.AppID); data.Add("client_secret", context.PassportInfo.Parnter.AppSecret); data.Add("grant_type", "authorization_code"); data.Add("code", context.ResponseParam["code"]); data.Add("redirect_uri", SpecialUrlEncode(BuildActionUrl(context.PassportInfo.Base.BaseUrl, context.PassportInfo.Parnter.LoginBackUrl))); string tokenResult = string.Empty; string tokenURL = string.Format("{0}?{1}", context.PassportInfo.Parnter.AccessTokenUrl, BuildStringFromNameValueCollection(data)); HttpHelper.Get(tokenURL, out tokenResult); //Debug模式下记录相关信息至日志 if (context.PassportInfo.Parnter.Debug.Equals("1")) { Logger.WriteLog(string.Format("获取AccessToken响应数据:{0}", tokenResult), "PassportTencentQQ", "AccessToken"); } //"access_token=7A16EECB7F4904A1D7ACF851E4B283C7&expires_in=7776000&refresh_token=BC5FC164D418609ED26DDE16F8DA5EFF" NameValueCollection nvc = HttpUtility.ParseQueryString(tokenResult); context.ResponseParam["access_token"] = nvc["access_token"]; //第二步,用AccessToken获取OpenID string returnData = string.Empty; string opidURL = string.Format("{0}?access_token={1}", context.PassportInfo.Parnter.OpenIDUrl, context.ResponseParam["access_token"]); HttpHelper.Get(opidURL, out returnData); //Debug模式下记录相关信息至日志 if (context.PassportInfo.Parnter.Debug.Equals("1")) { Logger.WriteLog(string.Format("获取OpenID响应数据:{0}", returnData), "PassportTencentQQ", "GetOpenID"); } //PC网站接入时,获取到用户OpenID,返回包如下: //callback( {"client_id":"YOUR_APPID","openid":"YOUR_OPENID"} ); string pattern = "callback\\(\\s*{\\s*\"client_id\"\\s*:\\s*\"(?<client_id>\\w+)\"\\s*,\\s*\"openid\"\\s*:\\s*\"(?<openid>\\w+)\"\\s*}\\s*\\)"; var match = Regex.Match(returnData, pattern); string client_id = string.Empty; string openid = string.Empty; if (match != null) { client_id = match.Groups["client_id"].Value; openid = match.Groups["openid"].Value; } else { Logger.WriteLog(string.Format("获取OpenID失败,{0}", returnData), "PassportTencentQQ", "GetOpenID"); throw new BusinessException("登录失败!"); } //第三步,获取用户信息 string requestParam = string.Format("access_token={0}&oauth_consumer_key={1}&openid={2}", context.ResponseParam["access_token"], context.PassportInfo.Parnter.AppID, openid ); string userInfoURL = string.Format("{0}?{1}", context.PassportInfo.Parnter.GetUserInfoUrl, requestParam); string responseData = string.Empty; HttpHelper.Get(userInfoURL, out responseData); //Debug模式下记录相关信息至日志 if (context.PassportInfo.Parnter.Debug.Equals("1")) { Logger.WriteLog(string.Format("获取User响应数据:{0}", responseData), "PassportTencentQQ", "GetUserInfo"); } TencentQQUserInfo userInfo = SerializationUtility.JsonDeserialize <TencentQQUserInfo>(responseData); if (userInfo.ret != 0) { throw new BusinessException(string.Format("登录失败! {0}", userInfo.msg)); } context.CustomerID = string.Format("TencentQQ_{0}", openid); context.CustomerName = userInfo.nickname; context.CustomerSouce = CustomerSourceType.TencentQQ; }
/// <summary> /// 获取第三方登录回调用户信息 /// </summary> /// <param name="context">第三方登录回调上下文</param> public abstract void GetResponseUserInfo(PartnerBackContext context);
/// <summary> /// 第三方登录回调验签 /// </summary> /// <param name="context">第三方登录回调上下文</param> /// <returns></returns> public abstract bool BackVerifySign(PartnerBackContext context);