您好,登錄后才能下訂單哦!
最近在做一個項目時,客戶要求網站能夠集成QQ登錄的功能,以前沒做過這方面的開發,于是去QQ的開放平臺官網研究了一下相關資料,經過自己的艱苦探索,終于實現了集成QQ登錄的功能,現在把相關的開發經驗總結一下,希望對有這方面需求的朋友有所幫助。
一.前期準備
首先你需要登錄QQ的開發平臺注冊一個賬號,QQ互聯平臺官方地址:http://connect.qq.com/ 進去后注冊一個開發賬號,完了登錄后臺會有類似如下的一個后臺,填好相關信息,具體可以參考下圖。最后我們會有一個APP ID和APP KEY ,有了這兩個東西才能實現后面的集成QQ登錄功能。
二開發工作
當我們的賬號審核后,QQ開發平臺會給我們一個APP ID和APP KEY,有了這兩個,我們就可以進行開發的工作了。
QQ的登錄采用的是OAuth3.0協議,OAuth(開放授權)是一個開放標準,允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方網站或分享他們數據的所有內容。具體的內容可以參考QQ的API文檔http://wiki.connect.qq.com/oauth3-0%e7%ae%80%e4%bb%8b
QQ的開發平臺已經有PHP,JAVA,JS等版本的SDK了,如果是要用到這些語言進行開發的可以直接參考這些SDK,我這邊直接講一下ASP.NET版本(MVC)的開發。
第一步.先在WebConfig中的 <appSettings>節點下加入如下配置
<add key="QQAppID" value="QQ平臺給的APP ID" /> <add key="QQAppKey" value="QQ開發平臺給的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的開發方式,如果是傳統.NET的可以直接在.aspx的Page_Load事件里加如下方法)
public ActionResult LoginQQ() { string state = new Random(100000).Next(99, 99999).ToString();//隨機數 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);//互聯地址 return new RedirectResult(authenticationUrl); }
這一步主要是實現去QQ平臺進行身份驗證,直觀點也就是點擊后會去出現如下截圖的畫面
第三步.在點擊了上圖的同意登錄后(也就是已經使用QQ號在QQ平臺登錄),QQ平臺會通過我們上面配置的回調地址也就是我這邊填的http://www.mylanqiu.com/Account/WeiboConnect/返回到這個頁面,并會返回一個code給我們,我們到時會使用這個code再去QQ開發平臺獲取access_token,并通過這個access_token獲取登錄的相關用戶信息。具體代碼如下:
/// <summary> /// QQ回調頁面 /// </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,可以作為我們系統用戶唯一性的判斷存在我們自己的庫中 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(); }
通過上面的步驟就可以實現網站集成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">結束字符串</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); //結束位置 return str.Substring(begin, end - begin); //取搜索的條數,用結束的位置-開始的位置,并返回 } /// <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("建立頁面請求時發生錯誤!", 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("接受服務器返回頁面時發生錯誤!", ex); } StreamReader streamReader = new StreamReader(stream, encoding); try { htmlString = streamReader.ReadToEnd(); } catch (Exception ex) { throw new Exception("讀取頁面數據時發生錯誤!", 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看一下實際的效果,最后感謝大家的閱讀,如對你有所幫助就多多轉發,以幫助更多人,正所謂:贈人玫瑰 手有余香!如有不足,還請指正!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。