QQ開放平台 OAUTH2.0 QqConnetSDK 登錄,運行原理,附源碼。


 

供大家研究使用,您可以對源代碼進行修正編寫。有很多不足,有很多缺點,在這里我只編寫原理。

您需要開放式站點,做為了解它,您需要編寫補充很多,或者您可以按照我的使用提供下載,進行編寫其余內容補充及修正。謝謝大家,讓大家的站點也融合這玩意。

開發環境:vs2005

QqConnetSDK

// 默認“Microsoft XML,v3.0”,其他版本也可以,只要能編譯通過,步驟如下。
// 添加引用 -> “COM” 選項卡 -> 找到組件名稱為“Microsoft XML,v3.0”

LoginToQQ.aspx     登錄
QQCallback.aspx    回調訪問頁面
QqConnetSDK        項目sdk
      QqConnet  QqConnet基礎類             ;您可以改進
      ConfigurationHandler 配置節點句柄類  ;用於擴展配置文件節點,您可以改進
      JSON      JSON分析類                 ;您可以改進
      UserInfo  用戶實體類                 ;您可以改進,其他實體類不在一一列出,自行擴展。

web.config         站點配置文件
      <add key="OAUTH_CONSUMER_KEY" value="10000000" /> 您的 app id
      <add key="OAUTH_CONSUMER_SECRET" value="AbcdAbcdAbcdAbcdAbcdAbcdAbcdAbcd" /> 您的 app key
      <add key="CALLBACK_URL" value="http://您的站點/QQCallback.aspx" /> 您的回調處理地址

QqConnetSDK    

View Code
using System;
using System.Data;
using System.Configuration;
using System.Text;
using System.Web;
using System.Web.UI.WebControls;
using System.Collections.Generic;
using System.Text.RegularExpressions;
using System.Reflection;
// 默認“Microsoft XML,v3.0”,其他版本也可以,只要能編譯通過,步驟如下。
// 添加引用 -> “COM” 選項卡 -> 找到組件名稱為“Microsoft XML,v3.0”
using MSXML2; 
using System.Net;
using System.Collections;
using System.Xml;
namespace QqConnetSDK
{
    /// <summary>
    /// QqConnet 基礎類
    /// </summary>
    #region QqConnet
    public class QqConnet
    {
        private string QQ_OAUTH_CONSUMER_KEY;
        private string QQ_OAUTH_CONSUMER_SECRET;
        private string QQ_CALLBACK_URL;
        private string QQ_SCOPE;
        public string State = "";
        public QqConnet()
        {
            Hashtable table = ConfigurationManager.GetSection("QzoneGroups/QzoneSection") as Hashtable;
            this.VerifyQzoneSection(table);

            this.QQ_OAUTH_CONSUMER_KEY = table["OAUTH_CONSUMER_KEY"].ToString();//APP ID
            this.QQ_OAUTH_CONSUMER_SECRET = table["OAUTH_CONSUMER_SECRET"].ToString();//APP KEY
            this.QQ_CALLBACK_URL = table["CALLBACK_URL"].ToString();//回調地址。
            this.QQ_SCOPE = "get_user_info";//授權項

        }
        /// <summary>
        /// 檢測QzoneSection節點
        /// </summary>
        /// <param name="table"></param>
        private void VerifyQzoneSection(Hashtable table)
        {
            if (table == null) this.ShowErrMsg("QzoneGroups/QzoneSection 不存在.", 0);
            if (table.Count <= 0) this.ShowErrMsg("QzoneGroups/QzoneSection 不存在.", 0);
            if (table["OAUTH_CONSUMER_KEY"] == null) this.ShowErrMsg("QzoneGroups/QzoneSection/OAUTH_CONSUMER_KEY 節點不存在.", 0);
            if (table["OAUTH_CONSUMER_SECRET"] == null) this.ShowErrMsg("QzoneGroups/QzoneSection/OAUTH_CONSUMER_SECRET 節點不存在.", 0);
            if (table["CALLBACK_URL"] == null) this.ShowErrMsg("QzoneGroups/QzoneSection/CALLBACK_URL 節點不存在.", 0);
        }
        public string APP_ID
        {
            get { return this.QQ_OAUTH_CONSUMER_KEY; }
        }
        /// <summary>
        /// State 數據.
        /// </summary>
        /// <returns></returns>
        private void GenerationState()
        {
            string value = Guid.NewGuid().ToString();
            this.State = value.Replace("-", "");
        }
        /// <summary>
        /// Get方法請求url,獲取請求內容
        /// </summary>
        /// <param name="Url"></param>
        /// <returns></returns>
        public string RequestUrl(string Url)
        {
            ServerXMLHTTP xmlhttp = new ServerXMLHTTP();
            xmlhttp.setTimeouts(10000, 10000, 10000, 50000);
            xmlhttp.open("GET", Url, false, null, null);
            xmlhttp.send("");
            if (xmlhttp.readyState == 4)
            {
                return xmlhttp.responseText;
            }
            return "";
        }
        ///// <summary>
        ///// Post方法請求url,獲取請求內容
        ///// </summary>
        ///// <param name="Url"></param>
        ///// <param name="data"></param>
        ///// <returns></returns>
        //public string RequestUrl_post(string Url, string data)
        //{
        //    ServerXMLHTTP xmlhttp = new ServerXMLHTTP();
        //    xmlhttp.setTimeouts(10000, 10000, 10000, 50000);
        //    xmlhttp.open("POST", Url, false, null, null);
        //    xmlhttp.setRequestHeader("Host", " graph.qq.com");
        //    xmlhttp.setRequestHeader("content-length ", data.Length.ToString());
        //    xmlhttp.setRequestHeader("content-type ", "application/x-www-form-urlencoded");
        //    xmlhttp.setRequestHeader("Connection", " Keep-Alive");
        //    xmlhttp.setRequestHeader("Cache-Control", " no-cache");
        //    xmlhttp.send(data);
        //    if (xmlhttp.readyState == 4)
        //    {
        //        return xmlhttp.responseText;
        //    }
        //    return "";
        //}
        /// <summary>
        /// 生成登錄地址
        /// </summary>
        /// <returns></returns>
        public string GetAuthorization_Code()
        {
            this.GenerationState();

            string url, str;
            url = "https://graph.qq.com/oauth2.0/authorize";
            str = "client_id=" + this.QQ_OAUTH_CONSUMER_KEY;
            str += "&redirect_uri=" + this.QQ_CALLBACK_URL;
            str += "&response_type=code";
            str += "&scope=" + this.QQ_SCOPE;
            str += "&state=" + this.State;
            url = url + "?" + str;
            return url;
        }
        /// <summary>
        /// 檢測是否合法
        /// </summary>
        /// <returns></returns>
        public bool VerifyCallback()
        {
            string Code = this.Request("code");
            string State = this.Request("state");
            if (Code != "")
            {
                return true;
            }
            return false;
        }
        /// <summary>
        /// 獲取 access_token
        /// 示例.返回結果:正確 access_token=ABCDEFGABCDEFGABCDEFG&expires_in=7776000; 
        /// </summary>
        /// <returns></returns>
        public string GetAccess_Token()
        {
            string url, str, result;
            url = "https://graph.qq.com/oauth2.0/token";
            str = "client_id=" + this.QQ_OAUTH_CONSUMER_KEY;
            str += "&client_secret=" + this.QQ_OAUTH_CONSUMER_SECRET;
            str += "&redirect_uri=" + this.QQ_CALLBACK_URL;
            str += "&grant_type=authorization_code";
            str += "&code=" + this.Request("code");
            str += "&state=" + this.Request("state");
            url = url + "?" + str;
            result = RequestUrl(url);
            this.ShowErrMsg(result);

            result = result.Split('&')[0];
            result = result.Replace("access_token=", "");
            return result;
        }
        /// <summary>
        /// 獲取Openid
        /// 示例.返回結果:正確 callback( {"client_id":"100000001","openid":"ABCDEFGABCDEFGABCDEFG"} ); 
        /// </summary>
        /// <returns></returns>
        public string GetOpenid(string Access_Token)
        {
            string url, str, result;
            url = "https://graph.qq.com/oauth2.0/me";
            str = "access_token=" + Access_Token;
            url = url + "?" + str;
            result = RequestUrl(url);
            this.ShowErrMsg(result);

            JSON j = new JSON(result);
            return j.GetValue("openid").ToString();
        }
        ///// <summary>
        ///// 發送記錄到微博
        ///// </summary>
        ///// <param name="content">發送內容</param>
        ///// <returns></returns>
        //public string Post_Webo(string Access_Token, string Openid, string content)
        //{
        //    string url, str;
        //    url = "https://graph.qq.com/t/add_t";
        //    str = "oauth_consumer_key=" + this.QQ_OAUTH_CONSUMER_KEY;
        //    str += "&access_token=" + Access_Token;
        //    str += "&openid=" + Openid;
        //    str += "&content=" + content;
        //    return RequestUrl_post(url, str);
        //}
        /// <summary>
        /// 獲取用戶信息
        /// </summary>
        /// <returns></returns>
        public UserInfo GetUserInfo(string Access_Token, string Openid)
        {
            string url, str, result;
            url = "https://graph.qq.com/user/get_user_info";
            str = "oauth_consumer_key=" + this.QQ_OAUTH_CONSUMER_KEY;
            str += "&access_token=" + Access_Token;
            str += "&openid=" + Openid;
            url += "?" + str;
            result = RequestUrl(url);
            this.ShowErrMsg(result);

            JSON j = new JSON(result);
            UserInfo src = new UserInfo();
            src = j.Convert<UserInfo>(src);
            return src;
        }
        /// <summary>
        /// 顯示錯誤提示信息
        /// </summary>
        /// <param name="error"></param>
        public void ShowErrMsg(string ErrMsg, params object[] ErrParams)
        {
            string error = "";
            if (ErrParams.Length > 0)
            {
                error = ErrMsg;
            }
            else
            {
                int num = ErrMsg.IndexOf("\"error\"");
                if (num != -1)
                {
                    JSON j = new JSON(ErrMsg);
                    string description = j.GetValue("error_description").ToString();
                    switch (description)
                    {
                        case "code is reused error": //錯誤提示:code代碼已被使用,無法重復使用該代碼。其他錯誤不在一一列出。
                            break;
                    }
                    error = ErrMsg;
                }
            }
            if (error != "")
            {
                HttpContext.Current.Response.Write(ErrMsg);
                HttpContext.Current.Response.End();
            }
        }
        /// <summary>
        /// 獲取與設置服務端會話
        /// </summary>
        /// <returns></returns>
        public object Session(string name, params object[] value)
        {
            object result = "";
            if (value.Length > 0)
                HttpContext.Current.Session[name] = value[0];
            else
                result = HttpContext.Current.Session[name];
            return result == null ? "" : result;
        }
        /// <summary>
        /// 獲取接收地址欄參數值
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public string Request(string name)
        {
            string value = HttpContext.Current.Request.QueryString[name];
            return value == null ? "" : value.Trim();
        }
    } 
    #endregion
    /// <summary>
    /// JSON 分析類
    /// </summary>
    #region JSON
    public class JSON
    {
        private string _json;
        /// <summary>
        /// 傳入Json
        /// </summary>
        /// <param name="json"></param>
        public JSON(string json)
        {
            this._json = json;

        }
        /// <summary>
        /// 獲取指定名稱的值
        /// </summary>
        /// <param name="name"></param>
        /// <returns></returns>
        public object GetValue(string name)
        {
            try
            {
                string value = this._json.Split(new string[] { "" + name + "\":\"" }, StringSplitOptions.RemoveEmptyEntries)[1];
                value = value.Split(new string[] { "\"" }, StringSplitOptions.RemoveEmptyEntries)[0];
                return value;
            }
            catch (Exception)
            {
                return null;
            }
        }
        /// <summary>
        /// 轉化為提供的實體類
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="NewT"></param>
        /// <returns></returns>
        public T Convert<T>(T NewT)
        {
            PropertyInfo[] properties = typeof(T).GetProperties();
            foreach (PropertyInfo propertyInfo in properties)
            {
                string Name = propertyInfo.Name;
                object value = this.GetValue(Name);
                if (value == null) { NewT = default(T); break; }
                propertyInfo.SetValue(NewT, value, null); //默認字符型處理.
            }
            return NewT;
        }
    } 
    #endregion
    /// <summary>
    /// ConfigurationHandler 配置節點句柄類
    /// </summary>
    #region ConfigurationHandler
    public class ConfigurationHandler : IConfigurationSectionHandler
    {
        public virtual object Create(Object parent, Object context, XmlNode node)
        {
            Hashtable m_Config = new Hashtable();
            foreach (XmlNode child in node.ChildNodes)
            {
                m_Config.Add(child.Attributes["key"].Value, child.Attributes["value"].Value);
            }
            return m_Config;
        }
    } 
    #endregion
    /// <summary>
    /// UserInfo  用戶實體類
    /// </summary>
    #region UserInfo
    public class UserInfo
    {
        private string _nickname;
        public string nickname
        {
            set { this._nickname = value; }
            get { return this._nickname; }
        }
        private string _figureurl;
        public string figureurl
        {
            set { this._figureurl = value; }
            get { return this._figureurl; }
        }
        private string _figureurl_1;
        public string figureurl_1
        {
            set { this._figureurl_1 = value; }
            get { return this._figureurl_1; }
        }
        private string _figureurl_2;
        public string figureurl_2
        {
            set { this._figureurl_2 = value; }
            get { return this._figureurl_2; }
        }
        private string _gender;
        public string gender
        {
            set { this._gender = value; }
            get { return this._gender; }
        }
        private string _vip;
        public string vip
        {
            set { this._vip = value; }
            get { return this._vip; }
        }
        private string _level;
        public string level
        {
            set { this._level = value; }
            get { return this._level; }
        }
        private string _is_yellow_year_vip;
        public string is_yellow_year_vip
        {
            set { this._is_yellow_year_vip = value; }
            get { return this._is_yellow_year_vip; }
        }
    } 
    #endregion
}

登錄

View Code
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using QqConnetSDK;
public partial class LoginToQQ : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        GetRequestToken();
    }
    private void GetRequestToken()
    {
        QqConnet qc = new QqConnet();
        string url = qc.GetAuthorization_Code();
        string state = qc.State;

        Response.Redirect(url);
    }
}

 回調訪問頁面

View Code
using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using QqConnetSDK;

public partial class QQCallback : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        req();
    }
    private void req()
    {
        QqConnet qc = new QqConnet();
        if (!qc.VerifyCallback())
        {
            qc.ShowErrMsg("參數缺少.");
        }

        //數據令牌
        string Access_Token = qc.GetAccess_Token();

        //唯一標識 Openid與QQ號一對一對應
        string Openid = qc.GetOpenid(Access_Token);

        //獲取當前登錄用戶
        UserInfo User = qc.GetUserInfo(Access_Token, Openid);
        if (User != null)
        {
            this.result.Text = "成功登錄.";
            this.Nickname.Text = User.nickname;
            this.Figureurl.ImageUrl = User.figureurl;

            qc.Session("QzoneOauth", User);
        }
    }
}


提供下載:http://files.cnblogs.com/DreamWu/QqConnet.zip


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM