Demo源碼(記得給個(gè)star哦)
騰訊openSDK授權(quán)登錄功能使用的是OAuth2.0協(xié)議约急,建議先仔細(xì)閱讀該協(xié)議OAuth Grant Types其中Authorization Code驗(yàn)證模式的詳細(xì)內(nèi)容俏蛮,對(duì)后續(xù)會(huì)有很大幫助娃圆。
言歸正傳椭豫,QQ授權(quán)登錄的大概流程如下:
申請(qǐng)接入QQ互聯(lián)開(kāi)放平臺(tái)荤崇,獲取APP ID和APP Key;
集成iOS Open SDK荆残,并配置工程翎承;
初始化TencentOAuth對(duì)象,配合真機(jī)聯(lián)調(diào)望薄;
拉起手機(jī)QQ應(yīng)用進(jìn)行驗(yàn)證疟游,并獲得Authorization Code;
注意:以上4個(gè)步驟由移動(dòng)前端完成痕支,下面步驟建議放在服務(wù)器后端實(shí)現(xiàn)
通過(guò)Authorization Code獲取Access Token颁虐;
通過(guò)Access Token獲取用戶的OpenId和UnionId;
通過(guò)Access Token和OpenId來(lái)獲取當(dāng)前QQ用戶信息卧须。
第一步:申請(qǐng)接入QQ互聯(lián)開(kāi)放平臺(tái)
首先確保你在QQ互聯(lián)(開(kāi)放平臺(tái))上注冊(cè)另绩、通過(guò)開(kāi)發(fā)者審核儒陨,并創(chuàng)建對(duì)應(yīng)的移動(dòng)應(yīng)用并審核通過(guò),到開(kāi)放平臺(tái)->應(yīng)用管理->移動(dòng)應(yīng)用->查看笋籽,至于如何配置就不在這里贅述了蹦漠。通過(guò)審核的應(yīng)用會(huì)提供兩個(gè)字段:APP ID、APP Key车海,記錄下來(lái)備用:
開(kāi)放平臺(tái)配置1.png
第二步:集成TencentOpenApi SDK
將從開(kāi)放平臺(tái)下載的iOS_SDK笛园,解壓縮后將TencentOpenAPI.framework文件集成到你當(dāng)前的工程中,并添加SDK依賴的系統(tǒng)庫(kù):
CoreGraphics.framework
CoreTelephony.framework
Foundation.framework
libc++.tbd
libiconv.tbd
libsqlite3.tbd
Security.framework
SystemConfiguration.framework
WebKit.framework
第三步:配置URL Scheme
當(dāng)分享結(jié)束后從QQ應(yīng)用回到原生App是通過(guò)URL Scheme跳轉(zhuǎn)的侍芝,配置方法如下:
打開(kāi)Xcode選擇project → Info → URL Types → 點(diǎn)擊”+“新增
Identifier固定填寫:tencentopenapi研铆,URL Schemes填寫tencen+APP ID(例如APP ID為101957543,則填寫:tencent101957543)
Xcode配置1.png
第四步:配置LSApplicationQueriesSchemes
找到info.plist州叠,右擊選擇open as → source code
將下面代碼添加進(jìn)去:
<key>LSApplicationQueriesSchemes</key><array><string>tim</string><string>mqq</string><string>mqqapi</string><string>mqqbrowser</string><string>mttbrowser</string><string>mqqOpensdkSSoLogin</string><string>mqqopensdkapiV2</string><string>mqqopensdkapiV4</string><string>mqzone</string><string>mqzoneopensdk</string><string>mqzoneopensdkapi</string><string>mqzoneopensdkapi19</string><string>mqzoneopensdkapiV2</string><string>mqqapiwallet</string><string>mqqopensdkfriend</string><string>mqqopensdkavatar</string><string>mqqopensdkminiapp</string><string>mqqopensdkdataline</string><string>mqqgamebindinggroup</string><string>mqqopensdkgrouptribeshare</string><string>tencentapi.qq.reqContent</string><string>tencentapi.qzone.reqContent</string><string>mqqthirdappgroup</string><string>mqqopensdklaunchminiapp</string><string>mqqopensdkproxylogin</string><string>mqqopensdknopasteboard</string></array>
第五步:初始化TencentOAuth對(duì)象棵红,配合真機(jī)聯(lián)調(diào)
#defineAPP_ID? ? ? ? ? @"101234567"http://填寫開(kāi)放平臺(tái)上的APP ID#defineUNIVERSAL_LINK? @"https://help.wechat/qq_conn/101234567"http://填寫開(kāi)放平臺(tái)上的Universal LinkTencentOAuth*tencentOAuth=[[TencentOAuth alloc]initWithAppId:APP_ID enableUniveralLink:YES universalLink:UNIVERSAL_LINK delegate:self];if(tencentOAuth){//調(diào)試時(shí)開(kāi)啟Log,上線記得注釋該方法[QQApiInterface startLogWithBlock:^(NSString*logStr){NSLog(@"%@",logStr);}]NSLog(@"Tencent openSDK初始化成功");}
在宏定義APP_ID中填寫你在QQ開(kāi)放平臺(tái)上申請(qǐng)應(yīng)用的APP ID咧栗,注意當(dāng)前工程的Bundle ID必須與其對(duì)應(yīng)逆甜,如果你使用的SDK版本大于3.3.7,你還需要填寫對(duì)應(yīng)Universal Link
真機(jī)運(yùn)行一下致板,如果控制臺(tái)打印輸出了Tencent openSDK初始化成功繼續(xù)下一步交煞;
否則請(qǐng)檢查手機(jī)是否已安裝QQ應(yīng)用,并且更新到最新版本可岂。
第六步:拉起手機(jī)QQ應(yīng)用進(jìn)行驗(yàn)證错敢,并獲得Authorization Code
//發(fā)起授權(quán)登錄請(qǐng)求if([QQApiInterface isQQInstalled]&&[QQApiInterface isQQSupportApi]){if([QQApiInterface isQQInstalled]&&[QQApiInterface isQQSupportApi]){NSArray*permissions=@[kOPEN_PERMISSION_GET_USER_INFO,kOPEN_PERMISSION_GET_SIMPLE_USER_INFO];_tencentOAuth.authShareType=AuthShareType_QQ;//使用QQ應(yīng)用(若要選擇TIM,替換為:AuthShareType_TIM)_tencentOAuth.authMode=kAuthModeServerSideCode;//授權(quán)方式使用Server Side Code[_tencentOAuth authorize:permissions];}else{NSLog(@"當(dāng)前設(shè)備未安裝QQ應(yīng)用或版本過(guò)低");}
在獲取用戶授權(quán)之前缕粹,首先必須清楚自己需要用戶的哪些信息,SDK提供多種選擇可以根據(jù)自己的需要請(qǐng)求用戶不同信息的授權(quán)纸淮,盡量不要取太多避免被用戶拒絕平斩。
下面實(shí)現(xiàn)回調(diào):
#pragmamark - TencentLoginDelegate// 成功后的回調(diào)-(void)tencentDidLogin{NSLog(@"授權(quán)登錄成功");//注意,區(qū)分兩種授權(quán)模式://1.Server Side Code Mode:NSString*code=[_tencentOAuth getServerSideCode];NSLog(@"Authorization Code:%@",code);//2.Client Side Token Mode:NSString*token=[_tencentOAuth accessToken];NSLog(@"Access Token:%@",token);}// 失敗后的回調(diào)-(void)tencentDidNotLogin:(BOOL)cancelled{NSLog(@"QQ登錄失敗");}// 網(wǎng)絡(luò)有問(wèn)題的回調(diào)-(void)tencentDidNotNetWork{NSLog(@"QQ登錄時(shí)網(wǎng)絡(luò)有問(wèn)題");}
在這里要注意以下幾點(diǎn):
不要弄混淆授權(quán)登錄的回調(diào)(TencentLoginDelegate)和分享的回調(diào)(QQApiInterfaceDelegate)咽块;
SDK提供了兩種授權(quán)方式:Server Side Code 和 Client Side Token
2.1Server Side Code:使用的是OAuth 2.0協(xié)議內(nèi)的Authorization Code登錄模式(和微信登錄一樣)绘面,因此作為移動(dòng)前端到成功獲取code為止,因?yàn)楹竺鎯?nèi)容涉及到Access Token侈沪、Refresh Token揭璃、Secret密鑰等較為私密的信息,為了避免用戶數(shù)據(jù)泄漏的風(fēng)險(xiǎn)亭罪,接將下來(lái)的工作建議交由后端來(lái)完成瘦馍;
2.2Client Side Token:可以由前端直接獲取Access Token、OpenID应役、UnionID情组,但要注意Token的有效期燥筷、緩存、刷新等需要由前端自行判斷并完成院崇。
本人更為推薦使用Server Side Code授權(quán)方式肆氓,移動(dòng)前端只保留APP ID,不直接接觸Token和UnionID相關(guān)信息底瓣,且不存儲(chǔ)APP KEY谢揪,即使有人截獲Authorization Code也無(wú)法正常使用
第七步:由Authorization Code獲取Access Token(后端實(shí)現(xiàn))
注意:這里的Authorization Code 是 Server Side Code
準(zhǔn)備三樣?xùn)|西:
APP ID(見(jiàn)第一步,應(yīng)用接入QQ互聯(lián)開(kāi)放平臺(tái)后獲得)
APP KEY(見(jiàn)第一步捐凭,應(yīng)用接入QQ互聯(lián)開(kāi)放平臺(tái)后獲得)
Authorization Code(見(jiàn)第六步键耕,由移動(dòng)前端獲得)
將上面三個(gè)字段分別填入如下地址,發(fā)送請(qǐng)求:
返回結(jié)果示例:
{"access_token":"3A567BE8C98EF0D71B95CA11ADACC2B3","expires_in":"7776000","refresh_token":"E6D5497F1CDAE8D528CFEC988EA973B6"}
第八步:由Access Token獲取OpenID和UnionID(后端實(shí)現(xiàn))
使用上一步獲得的access_token作為入?yún)⒏逃l(fā)送請(qǐng)求:
https://graph.qq.com/oauth2.0/me?access_token=[Access_Token]&unionid=1&fmt=json
返回結(jié)果示例:
{"client_id":"101923149","openid":"6B50CBEB0C52B64A468C320CAAF647F9","unionid":"UID_E3E32E487F4792895756E050BC2521D8"}
注意:
unionid主要用來(lái)獲取用戶的基本信息屈雄,如果需要進(jìn)行賬號(hào)綁定請(qǐng)使用unionid;
獲取unionid來(lái)區(qū)分用戶的唯一性(只要在相同QQ互聯(lián)平臺(tái)賬號(hào)下官套,同一個(gè)QQ號(hào)即使不同在應(yīng)用上獲取到的UnionID是相同的)酒奶;
獲取unionid需要到QQ互聯(lián)開(kāi)放平臺(tái)進(jìn)行開(kāi)通,到開(kāi)放平臺(tái)→ 應(yīng)用管理 → 移動(dòng)應(yīng)用 → 查看 → 應(yīng)用接口奶赔,查看unionid接口狀態(tài)是否為”已獲取“惋嚎。
QQ開(kāi)放平臺(tái)獲取unionid.png
第九步:由OpenID獲取和用戶信息
使用上一步得到的OpenID作為入?yún)ⅲl(fā)送請(qǐng)求:
返回結(jié)果示例:
{"ret":0,"msg":"","is_lost":0,"nickname":"王海洋","gender":"男","gender_type":1,"province":"江蘇","city":"蘇州","year":"1981","constellation":"","figureurl":"http://qzapp.qlogo.cn/qzapp/101923149/6B50CBEB0C52B64A468C320CAAF647F9/30","figureurl_1":"http://qzapp.qlogo.cn/qzapp/101923149/6B50CBEB0C52B64A468C320CAAF647F9/50","figureurl_2":"http://qzapp.qlogo.cn/qzapp/101923149/6B50CBEB0C52B64A468C320CAAF647F9/100","figureurl_qq_1":"http://thirdqq.qlogo.cn/g?b=oidb&k=lXE9UzSHuU469ftuzpZicIw&s=40&t=1488770244","figureurl_qq_2":"http://thirdqq.qlogo.cn/g?b=oidb&k=lXE9UzSHuU469ftuzpZicIw&s=100&t=1488770244","figureurl_qq":"http://thirdqq.qlogo.cn/g?b=oidb&k=lXE9UzSHuU469ftuzpZicIw&s=100&t=1488770244","figureurl_type":"0","is_yellow_vip":"0","vip":"0","yellow_vip_level":"0","level":"0","is_yellow_year_vip":"0"}
如果本文對(duì)你有所幫助記得點(diǎn)個(gè)贊哈