(二)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
3//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; }
//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);
中間沒有提到的相關的函式,在上篇微信中,都有提到,這裡不再贅述。
同樣,本人初學者,歡迎批評指正,謝謝!