網站集成QQ登錄功能

来源:http://www.cnblogs.com/bokeyuan123/archive/2016/04/29/5445355.html
-Advertisement-
Play Games

最近在做一個項目時,客戶要求網站能夠集成QQ登錄的功能,以前沒做過這方面的開發,於是去QQ的開放平臺官網研究了一下相關資料,經過自己的艱苦探索,終於實現了集成QQ登錄的功能,現在把相關的開發經驗總結一下,希望對有這方面需求的朋友有所幫助。 一.前期準備 首先你需要登錄QQ的開發平臺註冊一個賬號,QQ ...


最近在做一個項目時,客戶要求網站能夠集成QQ登錄的功能,以前沒做過這方面的開發,於是去QQ的開放平臺官網研究了一下相關資料,經過自己的艱苦探索,終於實現了集成QQ登錄的功能,現在把相關的開發經驗總結一下,希望對有這方面需求的朋友有所幫助。

一.前期準備

首先你需要登錄QQ的開發平臺註冊一個賬號,QQ互聯平臺官方地址:http://connect.qq.com/ 進去後註冊一個開發賬號,完了登錄後臺會有類似如下的一個後臺,填好相關信息,具體可以參考下圖。最後我們會有一個APP ID和APP KEY ,有了這兩個東西才能實現後面的集成QQ登錄功能。


二.開發工作

當我們的賬號審核後,QQ開發平臺會給我們一個APP ID和APP KEY,有了這兩個,我們就可以進行開發的工作了。
QQ的登錄採用的是OAuth2.0協議,OAuth(開放授權)是一個開放標準,允許用戶授權第三方網站訪問他們存儲在另外的服務提供者上的信息,而不需要將用戶名和密碼提供給第三方網站或分享他們數據的所有內容。具體的內容可以參考QQ的API文檔http://wiki.connect.qq.com/oauth2-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/oauth2.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/oauth2.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/oauth2.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看一下實際的效果,最後感謝大家的閱讀,如對你有所幫助就多多轉發,以幫助更多人,正所謂:贈人玫瑰 手有餘香!如有不足,還請指正!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 首先實體是: using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Web; namespace Pag ...
  • 學C#也有兩年多了,發現如果不總結一下,很多C#的知識都會忘掉,所以希望寫這系列的文章來總結一下C#的基礎知識。如果有寫錯或者不足的地方,希望可以提出糾正。 C#可以說是依附在.NET Framework 框架的編程語言,當然,你可以用來寫Unity3D腳本也是可以的。C#的.NET Framewo ...
  • 轉自:http://holysonll.blog.163.com/blog/static/2141390932013411112823855/ document.ready和onload的區別——JavaScript文檔載入完成事件 頁面載入完成有兩種事件 一是ready,表示文檔結構已經載入完成( ...
  • 前記:好吧好吧,我好好的自我檢討,這個總結拖了這麼久才來寫,而且一周多沒有看技術相關的東西,實在罪過,不過因為想做的事情太多,所以時間的分配確實是一個很嚴肅的問題,不是時間不夠用,是我自己沒有做好時間管理,五一之後的分配重心又回歸技術的學習,但是寫小說、學英語也不能放下,所以時間安排就更重要了,an ...
  • 使用WinForm實現了圖片base64編碼解碼的效果圖:示例base 64編碼字元串: 代碼如下: 轉自:http://hovertree.com/h/bjaf/wa5nbd3w.htm 參考:http://hovertree.com/h/bjaf/mdklgyjr.htm 更多:http://w ...
  • 一般我們寫好實體之後,配置好數據上下文對象,還有在配置文件中改好連接字元串之後。 還不能生成資料庫,自動生成資料庫,有兩步關鍵步驟: 1. Enable Migrations 2. Update-database 執行玩第二步之後,就自動生成了資料庫。 實例 //實體: using System; ...
  • [re: Orchard CMS] This caused me scratching my head for days and now I can even feel it's bleeding. The answer however is the simplest. Because it's n ...
  • MVC中有一個處理異常的過濾器 HandleErrorAttribute 1.新建一個類繼承自 HandleErrorAttribute,然後重寫OnException這個方法 只要程式出錯就會執行這個方法。 2.註冊定義好的異常過慮器 打開App_Start文件夾中FilterConfig.cs修 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...