您好,登錄后才能下訂單哦!
最近在做一個項目時,客戶要求網(wǎng)站能夠集成QQ登錄的功能,以前沒做過這方面的開發(fā),于是去QQ的開放平臺官網(wǎng)研究了一下相關(guān)資料,經(jīng)過自己的艱苦探索,終于實現(xiàn)了集成QQ登錄的功能,現(xiàn)在把相關(guān)的開發(fā)經(jīng)驗總結(jié)一下,希望對有這方面需求的朋友有所幫助。
一.前期準備
首先你需要登錄QQ的開發(fā)平臺注冊一個賬號,QQ互聯(lián)平臺官方地址:http://connect.qq.com/ 進去后注冊一個開發(fā)賬號,完了登錄后臺會有類似如下的一個后臺,填好相關(guān)信息,具體可以參考下圖。最后我們會有一個APP ID和APP KEY ,有了這兩個東西才能實現(xiàn)后面的集成QQ登錄功能。
二開發(fā)工作
當我們的賬號審核后,QQ開發(fā)平臺會給我們一個APP ID和APP KEY,有了這兩個,我們就可以進行開發(fā)的工作了。
QQ的登錄采用的是OAuth3.0協(xié)議,OAuth(開放授權(quán))是一個開放標準,允許用戶授權(quán)第三方網(wǎng)站訪問他們存儲在另外的服務(wù)提供者上的信息,而不需要將用戶名和密碼提供給第三方網(wǎng)站或分享他們數(shù)據(jù)的所有內(nèi)容。具體的內(nèi)容可以參考QQ的API文檔http://wiki.connect.qq.com/oauth3-0%e7%ae%80%e4%bb%8b
QQ的開發(fā)平臺已經(jīng)有PHP,JAVA,JS等版本的SDK了,如果是要用到這些語言進行開發(fā)的可以直接參考這些SDK,我這邊直接講一下ASP.NET版本(MVC)的開發(fā)。
第一步.先在WebConfig中的 <appSettings>節(jié)點下加入如下配置
<add key="QQAppID" value="QQ平臺給的APP ID" /> <add key="QQAppKey" value="QQ開發(fā)平臺給的APP KEY"/> <add key="QQCallBack" value="http://www.mylanqiu.com/Account/QQConnect/"/> <add key="QQAuthorizeURL" value="https://graph.qq.com/oauth3.0/authorize" />
第二部.在Controllers中加一個登陸的Action(我這邊用的是MVC的開發(fā)方式,如果是傳統(tǒng).NET的可以直接在.aspx的Page_Load事件里加如下方法)
public ActionResult LoginQQ() { string state = new Random(100000).Next(99, 99999).ToString();//隨機數(shù) Session["QQState"] = state; string appID = ConfigurationManager.AppSettings["QQAppID"]; string qqAuthorizeURL = ConfigurationManager.AppSettings["QQAuthorizeURL"]; string callback = ConfigurationManager.AppSettings["QQCallBack"]; string authenticationUrl = string.Format("{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}", qqAuthorizeURL, appID, callback, state);//互聯(lián)地址 return new RedirectResult(authenticationUrl); }
這一步主要是實現(xiàn)去QQ平臺進行身份驗證,直觀點也就是點擊后會去出現(xiàn)如下截圖的畫面
第三步.在點擊了上圖的同意登錄后(也就是已經(jīng)使用QQ號在QQ平臺登錄),QQ平臺會通過我們上面配置的回調(diào)地址也就是我這邊填的http://www.mylanqiu.com/Account/WeiboConnect/返回到這個頁面,并會返回一個code給我們,我們到時會使用這個code再去QQ開發(fā)平臺獲取access_token,并通過這個access_token獲取登錄的相關(guān)用戶信息。具體代碼如下:
/// <summary> /// QQ回調(diào)頁面 /// </summary> public ActionResult QQConnect() { if (!string.IsNullOrEmpty(Request.Params["code"]) && !string.IsNullOrEmpty(Request.Params["state"])) { var code = Request.Params["code"]; var state = Request.Params["state"]; string requestState = Session["QQState"] == null ? "" : Session["QQState"].ToString(); if (state == requestState) { try { QQOAuthHelper QAuthHelper = new QQOAuthHelper();//這是一個輔助類,代碼會在下面給出 QQOauthInfo qqOauthInfo = QAuthHelper.GetOauthInfo(code); string openID = QAuthHelper.GetOpenID(qqOauthInfo);//獲取用的OpenID,這個ID是QQ給我們的用戶的唯一ID,可以作為我們系統(tǒng)用戶唯一性的判斷存在我們自己的庫中 Session["QQOpenID"] = openID; string nickName = QAuthHelper.GetUserInfo(qqOauthInfo, openID);//獲取用戶的昵稱 UserAccount userAccount = AccountBLL.GetUserAccountByOpenID(OAuthPlatform.QQ.ToString(), openID); if (userAccount != null)//判斷是否是已用該OpenID是否已在我們的庫中,若已存在則允許登錄 { SetAuthCookie(userAccount); Response.Write("<script> window.opener.location.reload();window.close();</script>"); } ViewData["NickName"] = nickName; } catch (Exception ex) { return new RedirectResult("~/Error/Error.htm"); } } else { return new RedirectResult("~/Error/Error.htm"); } } else { return new RedirectResult("~/Error/Error.htm"); } return View(); }
通過上面的步驟就可以實現(xiàn)網(wǎng)站集成QQ登錄了。下面給出輔助類的源代碼:
using System; using System.Text; using System.Configuration; using System.Collections.Generic; using System.Linq; using System.Net; using System.Web; using System.IO; namespace Com.ABC.Mylanqiu.BLL { public class QQOAuthHelper { string appID = ConfigurationManager.AppSettings["QQAppID"]; string appKey = ConfigurationManager.AppSettings["QQAppKey"]; /// <summary> /// 獲取oauth信息 /// </summary> /// <param name="code"></param> /// <returns></returns> public QQOauthInfo GetOauthInfo(string code) { string callback = System.Web.HttpUtility.UrlEncode(ConfigurationManager.AppSettings["QQCallBack"], Encoding.UTF8); string url = string.Format("https://graph.qq.com/oauth3.0/token?grant_type={0}&client_id={1}&client_secret={2}&code={3}&redirect_uri={4}", "authorization_code", appID, appKey, code, callback); string res = LoadHtmlUserGetType(url, Encoding.UTF8); QQOauthInfo qqOauthInfo = new QQOauthInfo(); qqOauthInfo.AccessToken = CutString(res, "access_token=", "&expires_in="); qqOauthInfo.ExpiresIn = CutString(res, "&expires_in=", "&refresh_token="); qqOauthInfo.RefreshToken = res.Split(new string[] { "&refresh_token=" }, StringSplitOptions.None)[1]; return qqOauthInfo; } /// <summary> /// 截取字符串中兩個字符串中的字符串 /// </summary> /// <param name="str">字符串</param> /// <param name="startStr">開始字符串</param> /// <param name="endStr">結(jié)束字符串</param> /// <returns></returns> private string CutString(string str, string startStr, string endStr) { int begin, end; begin = str.IndexOf(startStr, 0) + startStr.Length; //開始位置 end = str.IndexOf(endStr, begin); //結(jié)束位置 return str.Substring(begin, end - begin); //取搜索的條數(shù),用結(jié)束的位置-開始的位置,并返回 } /// <summary> /// 通過GET方式獲取頁面的方法 /// </summary> /// <param name="urlString">請求的URL</param> /// <param name="encoding">頁面編碼</param> /// <returns></returns> public string LoadHtmlUserGetType(string urlString, Encoding encoding) { HttpWebRequest httpWebRequest = null; HttpWebResponse httpWebRespones = null; Stream stream = null; string htmlString = string.Empty; try { httpWebRequest = WebRequest.Create(urlString) as HttpWebRequest; } catch (Exception ex) { throw new Exception("建立頁面請求時發(fā)生錯誤!", ex); } httpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; Maxthon 2.0)"; try { httpWebRespones = (HttpWebResponse)httpWebRequest.GetResponse(); stream = httpWebRespones.GetResponseStream(); } catch (Exception ex) { throw new Exception("接受服務(wù)器返回頁面時發(fā)生錯誤!", ex); } StreamReader streamReader = new StreamReader(stream, encoding); try { htmlString = streamReader.ReadToEnd(); } catch (Exception ex) { throw new Exception("讀取頁面數(shù)據(jù)時發(fā)生錯誤!", ex); } streamReader.Close(); stream.Close(); return htmlString; } /// <summary> /// 獲取QQ賬號的OpenID /// </summary> /// <param name="qqOauthInfo"></param> /// <returns></returns> public string GetOpenID(QQOauthInfo qqOauthInfo) { string res = LoadHtmlUserGetType("https://graph.qq.com/oauth3.0/me?access_token=" + qqOauthInfo.AccessToken, Encoding.UTF8); return CutString(res, @"openid"":""", @"""}"); } /// <summary> /// 獲取QQ昵稱 /// </summary> /// <param name="qqOauthInfo"></param> /// <param name="openID"></param> /// <returns></returns> public string GetUserInfo(QQOauthInfo qqOauthInfo, string openID) { string urlGetInfo = string.Format(@"https://graph.qq.com/user/get_user_info?access_token={0}&oauth_consumer_key={1}&openid={2}", qqOauthInfo.AccessToken,appID, openID); string resUserInfo = LoadHtmlUserGetType(urlGetInfo, Encoding.UTF8); return CutString(resUserInfo, @"""nickname"": """, @""","); } } public class QQOauthInfo { public string AccessToken { get; set; } public string ExpiresIn { get; set; } public string RefreshToken { get; set; } } }
三.效果Demo
大家可以直接訪問http://www.mylanqiu.com看一下實際的效果,最后感謝大家的閱讀,如對你有所幫助就多多轉(zhuǎn)發(fā),以幫助更多人,正所謂:贈人玫瑰 手有余香!如有不足,還請指正!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。