/// <summary> /// 构造Get请求 /// </summary> static HttpWebRequest _BuildGetRequest(string url, RequestParams data, Action <HttpWebRequest> action) { //如果传入了data,则先构造请求url if (data != null && data.Count > 0) { StringBuilder sb = new StringBuilder(url); if (url.IndexOf('?') < 0) { sb.Append('?'); } //build request foreach (var entry in data) { object v = entry.Value; sb.Append(HttpHelper.UrlEncode(entry.Key)) .Append('=') .Append(v == null ? "" : HttpHelper.UrlEncode(v.ToString())) .Append('&'); } //change url url = sb.ToString(0, sb.Length - 1); //remove last '&' } HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = "GET"; action?.Invoke(req); return(req); }
/// <summary> /// OAuth/WXLogin?referer= /// 转到这里进行授权 /// </summary> /// <param name="referer"></param> /// <returns></returns> public ActionResult WXLogin(string referer = null) { //静默模式登陆 string toUrl = string.Format(baseUrl + "BaseCallback?referer={0}", HttpUtility.UrlEncode(referer ?? "/")); string url = OAuthApi.GetAuthorizeUrl(appId, toUrl, STATE, OAuthScope.snsapi_base); return(Redirect(url)); }
public Contacts FetchContacts() { var o = new OAuthBase(); var nonce = OAuthBase.GenerateNonce(); var timestamp = OAuthBase.GenerateTimeStamp(); var sig = OAuthBase.GenerateSignature(new Uri(url), OAuthClient.OAUTH_YAHOO_CONSUMER_KEY, OAuthClient.OAUTH_YAHOO_CONSUMER_SECRET, oauth_token, oauth_secret, "GET", timestamp, nonce); sig = HttpUtility.UrlEncode(sig); var sb = new StringBuilder(); sb.Append(url); sb.AppendFormat("&oauth_consumer_key={0}", OAuthClient.OAUTH_YAHOO_CONSUMER_KEY); sb.AppendFormat("&oauth_nonce={0}", nonce); sb.AppendFormat("&oauth_timestamp={0}", timestamp); sb.AppendFormat("&oauth_version={0}", "1.0"); sb.AppendFormat("&oauth_signature_method={0}", "HMAC-SHA1"); sb.AppendFormat("&oauth_signature={0}", sig); sb.AppendFormat("&oauth_token={0}", HttpUtility.UrlEncode(oauth_token)); string content = ""; WebResponse response; try { var request = WebRequest.Create(sb.ToString()); response = request.GetResponse(); using (StreamReader sr = new StreamReader(response.GetResponseStream())) { content = sr.ReadToEnd(); } } catch (WebException ex) { response = ex.Response; if (response != null) { using (var sr = new StreamReader(response.GetResponseStream())) { var error = sr.ReadToEnd(); Syslog.Write(sb + " " + error); } } return(null); } var serializer = new JavaScriptSerializer(); var result = serializer.Deserialize <ContactsResult>(content); return(result.contacts); }
public static string Build(IReadOnlyCollection <KeyValuePair <string, string> >?source) #endif { if (source == null || source.Count == 0) { return(""); } var sb = new StringBuilder(source.Count * 32); foreach (var kv in source) { sb.Append('&'); sb.Append(WebUtility.UrlEncode(kv.Key)); sb.Append('='); sb.Append(WebUtility.UrlEncode(kv.Value)); } return(sb.ToString(1, sb.Length - 1)); }
/// <summary> /// 构造Post请求 (x-www-form-urlencoded) /// </summary> static HttpWebRequest _BuildPostRequest(string url, RequestParams data, Action <HttpWebRequest> action) { HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; action?.Invoke(req); //写入数据 if (data != null && data.Count > 0) { //Build request using (StreamWriter writer = new StreamWriter(req.GetRequestStream())) { bool first = true; foreach (var entry in data) { if (!first) { writer.Write('&'); } else { first = false; } object v = entry.Value; writer.Write(HttpHelper.UrlEncode(entry.Key)); writer.Write('='); if (v != null) { writer.Write(HttpHelper.UrlEncode(v.ToString())); } } } } return(req); }
/// <summary> /// 静默模式 /// </summary> /// <param name="code"></param> /// <param name="state"></param> /// <returns></returns> public ActionResult BaseCallback(string code, string state) { if (string.IsNullOrEmpty(code)) { return(Content("您拒绝了授权!")); } if (state != STATE) { //这里的state其实是会暴露给客户端的,验证能力很弱,这里只是演示一下 //实际上可以存任何想传递的数据,比如用户ID,并且需要结合例如下面的Session["OAuthAccessToken"]进行验证 return(Content("验证失败!请从正规途径进入!")); } //通过,用code换取access_token var result = OAuthApi.GetAccessToken(appId, secret, code); if (result.errcode != ReturnCode.请求成功) { return(Content("错误:" + result.errmsg)); } //下面2个数据也可以自己封装成一个类,储存在数据库中(建议结合缓存) //如果可以确保安全,可以将access_token存入用户的cookie中,每一个人的access_token是不一样的 Session["OAuthAccessTokenStartTime"] = DateTime.Now; Session["OAuthAccessToken"] = result; //判断用户是否存存 string userId = null; try { userId = GetUserIdByOpenId(result.openid); } catch (Exception ex) { } if (userId == null) { //因为这里还不确定用户是否关注本微信,所以只能试探性地获取一下 OAuthUserInfo userInfo = null; try { if (ReqietTryGetUser) { //已关注,可以得到详细信息 userInfo = OAuthApi.GetUserInfo(result.access_token, result.openid); } if (string.IsNullOrEmpty(Request["referer"])) { ViewData["ByBase"] = true; return(View("UserInfoCallback", userInfo)); } else { } } catch (ErrorJsonResultException ex) { //未关注,只能授权,无法得到详细信息 //这里的 ex.JsonResult 可能为:"{\"errcode\":40003,\"errmsg\":\"invalid openid\"}" //return Content("用户已授权,授权Token:" + result); } if (userInfo != null && result.openid == userInfo.openid && userInfo.nickname != null) { userId = RegisterUser(result.openid, userInfo); } } string referer = Request["referer"] ?? "/"; if (userId == null) { //授权登陆 string toUrl = string.Format(baseUrl + "UserInfoCallback?referer={0}", HttpUtility.UrlEncode(referer)); string url = OAuthApi.GetAuthorizeUrl(appId, toUrl, STATE, OAuthScope.snsapi_userinfo); return(Redirect(url)); } else { if (!LoginByUserId(userId)) { return(Content("登陆失败 userId:" + userId)); } //登陆用户 return(RedirectToUrl(referer)); } }