溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

網(wǎng)站集成QQ登錄功能

發(fā)布時間:2020-07-10 12:39:59 來源:網(wǎng)絡(luò) 閱讀:292 作者:再見喬布斯 欄目:編程語言

最近在做一個項目時,客戶要求網(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登錄功能。

網(wǎng)站集成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)如下截圖的畫面

網(wǎng)站集成QQ登錄功能

第三步.在點擊了上圖的同意登錄后(也就是已經(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ā),以幫助更多人,正所謂:贈人玫瑰 手有余香!如有不足,還請指正!


向AI問一下細節(jié)

免責聲明:本站發(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)容。

AI