“QQ登錄”使用戶(hù)能使用QQ賬號(hào)一鍵登錄接入網(wǎng)站,大大降低了注冊(cè)、登錄的門(mén)檻。借助龐大的QQ用戶(hù)群,給第三方網(wǎng)站帶來(lái)更多新用戶(hù)。已登錄用戶(hù)還可以將在第三方網(wǎng)站發(fā)布、分享的信息即時(shí)同步到QQ空間,使網(wǎng)站內(nèi)容通過(guò)好友關(guān)系得到進(jìn)一步的傳播。
騰訊社區(qū)開(kāi)放平臺(tái).NET SDK是基于騰訊社區(qū)開(kāi)放平臺(tái)的OAuth登錄文檔和API文檔 使用C#開(kāi)發(fā)的.NET 4.0的一個(gè)庫(kù),目前完整實(shí)現(xiàn)了騰訊社區(qū)開(kāi)放平臺(tái)的所有接口。可以加快你的社區(qū)接入到騰訊社區(qū)開(kāi)放平臺(tái),免去大量的重復(fù)的調(diào)試開(kāi)發(fā)的時(shí)間,所以我是以New BSD協(xié)議創(chuàng)建的開(kāi)源項(xiàng)目,各位有同樣需求的各位同仁參與建設(shè)著一個(gè)項(xiàng)目,項(xiàng)目的托管地址是http://qqconnect.codeplex.com/。
騰訊社區(qū)開(kāi)放平臺(tái).NET SDK使得你調(diào)用騰訊社區(qū)開(kāi)放平臺(tái)的REST接口非常容易,你只需要到http://connect.opensns.qq.com/apply 申請(qǐng)到必須的consumer key和consumer secret,在你的申請(qǐng)通過(guò)了騰訊社區(qū)開(kāi)放平臺(tái)的審核后就可以得到。這個(gè)酷的主要特性如下:
- 封裝好了騰訊社區(qū)開(kāi)放平臺(tái)的OAuth協(xié)議訪問(wèn)騰訊社區(qū)開(kāi)放平臺(tái)的REST接口
- 和騰訊社區(qū)開(kāi)放平臺(tái)的接口保持同步(目前只有一個(gè)接口,將來(lái)肯定會(huì)不斷增加)
這個(gè)庫(kù)使用Visual Studio 2010和C# 3.0構(gòu)建的,主要擴(kuò)展和使用到下面的開(kāi)源庫(kù):
- DotnetOpenauth:DotNetOpenAuth 是一個(gè) C# 開(kāi)發(fā)包,用以實(shí)現(xiàn) OpenID 2.0 的提供者、中繼方(Relying Party)、OAuth使用者和OAuth服務(wù)提供者;同時(shí)支持 InfoCard Selector 。OAuth協(xié)議客戶(hù)端的實(shí)現(xiàn)上參考了這個(gè)項(xiàng)目的代碼。
- Jayrock:Jayrock是一個(gè)LGPL的開(kāi)源的軟件,實(shí)現(xiàn)了JSON和JSON-RPC,支持微軟ASP.NET框架。具體可以參考文章:Jayrock: JSON and JSON-RPC for .NET
上面我們從高層次了解了這個(gè)SDK的實(shí)現(xiàn)原理,下面我們介紹如何使用這個(gè)SDK來(lái)和騰訊社區(qū)開(kāi)放平臺(tái)進(jìn)行交互。SDK主要有兩個(gè)需要關(guān)注的類(lèi)QzoneSDK.Context.QzoneContext
和 QzoneSDK.Qzone。
首先我們結(jié)合【QQ登錄】OAuth登錄文檔來(lái)說(shuō)明。Qzone OAuth總體處理流程里共有七個(gè)步驟,從下面的總體流程圖中可以看到:
左側(cè):為第三方網(wǎng)站需要做的事情。在每個(gè)綠色的方框里,標(biāo)明了第三方應(yīng)該調(diào)用的接口,接口主要功能及邏輯見(jiàn)Qzone OAuth接口說(shuō)明。
右側(cè):為Qzone接收到第三方應(yīng)用發(fā)過(guò)來(lái)的請(qǐng)求后做的事情。第三方請(qǐng)求的發(fā)送地址以及應(yīng)包含的參數(shù)在接下來(lái)的單步詳解中進(jìn)行了說(shuō)明
通過(guò)類(lèi)QzoneSDK.Context.QzoneContext帶上你申請(qǐng)的oauth_consumer_key (對(duì)應(yīng)Qzone的appid)和oauth_consumer_secret (對(duì)應(yīng)Qzone的appkey)到騰訊社區(qū)開(kāi)放平臺(tái)獲取到Request Token,然后把tokenKey和tokensecret保存到Session里,后續(xù)需要使用。示例代碼如下:
string key = ConfigurationManager.AppSettings["ConsumerKey"];
string secret = ConfigurationManager.AppSettings["ConsumerSecret"];
var context = new QzoneSDK.Context.QzoneContext(key, secret);
var callbackUrl = "http://localhost/account/QQCallback";
var requestToken = context.GetRequestToken(callbackUrl);
Session["requesttokenkey"] = requestToken.TokenKey;
Session["requesttokensecret"] = requestToken.TokenSecret;
var authenticationUrl = context.GetAuthorizationUrl(requestToken, callbackUrl);
return Redirect(authenticationUrl);
用戶(hù)在騰訊社區(qū)開(kāi)放平臺(tái)上授權(quán)使用后會(huì)導(dǎo)向到你的網(wǎng)站,也就是上圖的第三步,在門(mén)上述的callback 的頁(yè)面上就可以獲取上圖第四步的參數(shù),利用上述獲得的參數(shù)調(diào)用QzoneSDK.Qzone進(jìn)行第五步調(diào)用,就可以獲得AccessToken,這個(gè)AccessToken,目前access_token(及其secret)是長(zhǎng)期有效的,和某一個(gè)openid對(duì)應(yīng),目前可以支持線下獲取該openid的信息。
if (Request.QueryString["oauth_vericode"] != null)
{
var requestTokenKey = Session["requesttokenkey"].ToString();
var requestTokenSecret = Session["requesttokensecret"].ToString();
var verifier = Request.QueryString["oauth_vericode"];
string key = ConfigurationManager.AppSettings["ConsumerKey"];
string secret = ConfigurationManager.AppSettings["ConsumerSecret"];
QzoneSDK.Qzone qzone = new QzoneSDK.Qzone(key, secret, requestTokenKey, requestTokenSecret, verifier);
var access = qzone.OAuthTokenKey;
var currentUser = qzone.GetCurrentUser();
var user = (BasicProfile)JsonConvert.Import(typeof(BasicProfile),currentUser);
}
上述代碼還演示調(diào)用騰訊開(kāi)放社區(qū)目前唯一的一個(gè)API ( get_user_info),通過(guò)Jayrock庫(kù)將Json數(shù)據(jù)轉(zhuǎn)換為庫(kù)中定義的用戶(hù)登錄數(shù)據(jù)的實(shí)體BasicProfile。
項(xiàng)目的下載地址:http://qqconnect.codeplex.com/releases/view/65042
項(xiàng)目文檔:騰訊社區(qū)開(kāi)放平臺(tái)教程.pdf