C# winform C/S WebBrowser qq第三方授权登录
qq的授权登录,跟微信相似,不同的地方是:
1 申请appid与appkey的时候,注意填写回调地址。
2 这里可以在WebBrowser的是Navigated事件中直接得到Access Token,一般情况是通过Authorization Code获取Access Token。
3 获取用户信息,需要先根据Access Token获取用户的OpenID。
最后,在WebBrowser的DocumentCompleted事件中,完成所有的调用。
总结一下,分以下几步:
1 根据appid与appkey获取Authorization Code(这里忽略此步,直接到步骤2)。
2 根据code获取Access Token,这里可在WebBrowser的Navigated事件中,直接在网址中获取Access Token。
3 使用Access Token来获取用户的OpenID
4 根据Access Token和OpenID 调用OpenAPI获取各种信息,这里qq提供了具体的API文档。
需要的资料,都在qq互联-文档资料,非常的详细。
具体的过程如下:
1 在新的form中,拉一个WebBrowser控件,在属性-url,设置为
https://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=你的appid&redirect_uri=你的回调地址&scope=get_user_info
同样,回调地址注意进行URLEncode。这样运行,可以进入到qq授权登录的界面。
2 在Navigated事件中,用list记录跳转的网址
ArrayList addressList2 = new ArrayList(); private void webBrowser_QQ_Navigated(object sender, WebBrowserNavigatedEventArgs e) { string url = e.Url.ToString(); addressList2.Add(url); }
3 遍历addressList2,找到含有access_token的网址,取出access_token
//Step2:一般情况是通过Authorization Code获取Access Token,这里直接从网址获取Access Token protected string Get_AccessToken() { string strTempToken = ""; // 获取含有Access_token的网址 foreach (string url in addressList2) { if (url.Contains("access_token")) { strTempToken = url; break; } } if (string.IsNullOrEmpty(strTempToken)) return null; //qq最终获得的Access_token string AccessToken = ""; int iStart = strTempToken.IndexOf("="); int iEnd = strTempToken.LastIndexOf('&'); if (iStart < iEnd) { int codeLength = iEnd - iStart - 1; AccessToken = strTempToken.Substring(iStart + 1, codeLength); } return AccessToken; }
3
//Step3:使用Access Token来获取用户的OpenID protected string Get_OpenID(string Access_token) { string callback = JsonHelper.GetJson("https://graph.qq.com/oauth2.0/me?access_token=" + Access_token); int ibegin = callback.IndexOf("{"); int iEnd = callback.IndexOf("}"); int ilength = 0; if(ibegin<iEnd) { ilength = iEnd - ibegin; } string strOpenId = callback.Substring(ibegin, ilength + 1); QQCallBack qqOpenId = JsonHelper.ParseFromJson<QQCallBack>(strOpenId); string openId = qqOpenId.openid; return openId; }
/// <summary> /// QQ回调类,获取Openid /// </summary> public class QQCallBack { public string client_id { get; set; } public string openid { get; set; } }
4 先定义QQUser用户信息类,根据Access_token和openId获取用户信息
/// <summary> /// qq登录回调结果实体类 /// </summary> public class QQUser { /// <summary> /// 回调结果码(0成功,其他失败) /// </summary> public int ret { get; set; } public string msg { get; set; } public string is_lost { get; set; } /// <summary> /// 用户昵称 /// </summary> public string nickname { get; set; } /// <summary> /// 性别 /// </summary> public string gender { get; set; } public string province { get; set; } public string city { get; set; } public string year { get; set; } /// <summary> /// 用户头像 /// </summary> public string figureurl { get; set; } public string figureurl_2 { get; set; } public string figureurl_qq_2 { get; set; } }
//Step4: 调用OpenAPI获取各种信息
protected QQUser Get_qqUserInfo(string Access_token, string openId) { string userInfostr = JsonHelper.GetJson("https://graph.qq.com/user/get_user_info?access_token=" + Access_token + "&oauth_consumer_key=" + app_id + "&openid=" + openId); QQUser qqUser = JsonHelper.ParseFromJson<QQUser>(userInfostr); return qqUser; }
最后,在WebBrowser的DocumentCompleted事件中,调用上述的函数。
private void webBrowser_QQ_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { string access_token = Get_AccessToken(); if (string.IsNullOrEmpty(access_token)) return; string openid = Get_OpenID(access_token); if (string.IsNullOrEmpty(openid)) { return; } QQUser qqUser = Get_qqUserInfo(access_token, openid);
中间没有提到的相关的函数,在上篇微信中,都有提到,这里不再赘述。