iOS 微信和QQ授權(quán)登錄實(shí)現(xiàn)

(一)微信登錄
微信登陸的環(huán)境配置我就不詳細(xì)說明了浪读,按照官方的文檔應(yīng)該能解決
這是微信官方發(fā)說明:
1昔榴、目前移動應(yīng)用上微信登錄只提供原生的登錄方式,需要用戶安裝微信客戶端才能配合使用碘橘。
2互订、對于Android應(yīng)用,建議總是顯示微信登錄按鈕痘拆,當(dāng)用戶手機(jī)沒有安裝微信客戶端時仰禽,請引導(dǎo)用戶下載安裝微信客戶端。
3纺蛆、對于iOS應(yīng)用吐葵,考慮到iOS應(yīng)用商店審核指南中的相關(guān)規(guī)定桥氏,建議開發(fā)者接入微信登錄時,先檢測用戶手機(jī)是否已安裝微信客戶端(使用sdk中isWXAppInstalled函數(shù) )凤藏,對未安裝的用戶隱藏微信登錄按鈕揖庄,只提供其他登錄方式(比如手機(jī)號注冊登錄刃跛、游客登錄等)。

1.微信登錄的時候首先給微信發(fā)送一個SendAuthReq然后讓微信授權(quán)
- (void)WXLogin {
    if ([WXApi isWXAppInstalled]) {
        //構(gòu)造SendAuthReq結(jié)構(gòu)體
        SendAuthReq* req =[[SendAuthReq alloc ] init] ;
//我寫了這個下面幾個字段检号,但是授權(quán)還是獲取用戶基本信息齐苛,官方demo能獲取的比較多 snsapi_userinfo寫這個就可以
        req.scope = @"snsapi_message,snsapi_userinfo,snsapi_friend,snsapi_contact";
        req.state = @"App" ;
        req.openID = @"這個地方寫你申請的APPID";
        //第三方向微信終端發(fā)送一個SendAuthReq消息結(jié)構(gòu)
        [WXApi sendReq:req];
    } else {
        [Tool showHUDWithString:@"請先安裝微信"];
    }
}
2.當(dāng)微信授權(quán)之后桂塞,返回我們的App的時候會走回調(diào)函數(shù)
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp {
     if ([resp isKindOfClass:[SendAuthResp class]]) {
        if (_delegate
            && [_delegate respondsToSelector:@selector(managerDidRecvAuthResponse:)]) {
//這個SendAuthResp會儲存我們需要的信息阁危,我們拿到這個之后進(jìn)行操作,這個地方我的是和官方demo一樣寫了一個代理(抄襲官方的)
            SendAuthResp *authResp = (SendAuthResp *)resp;
            [_delegate managerDidRecvAuthResponse:authResp];
        }
    }
}
3.實(shí)現(xiàn)代理(我是在登錄頁面實(shí)現(xiàn)代理方法)
/*
 實(shí)現(xiàn)代理擂煞,獲取授權(quán)token趴乡,和刷新授權(quán)token(注意兩個token是不一樣的)蝗拿,openid 以及我們需要的信息
*/
- (void)managerDidRecvAuthResponse:(SendAuthResp *)response {
    CODE = response.code;

//微信提醒讓我們最好把APPID和APPSecret放在服務(wù)器哀托,防止泄露造成不必要的麻煩
參數(shù)說明:
APPID:我們在微信開發(fā)平臺申請的APPID
SECRET:我們在微信開放平臺申請的APPSecret
CODE:微信授權(quán)后獲取的code
//請求的url  不需要改變仓手,只需要把參數(shù)換成你們的就行
    NSString *urlStr = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",APPID,SECRET,CODE];
    [Tool getWithPath:urlStr params:nil success:^(id json) {
        NSLog(@"%@",json);
        NSDictionary *dic = (NSDictionary *)json;
//授權(quán)token
        UserDefaultsSave(dic[@"access_token"], kWXToken);
//刷新授權(quán)token
        UserDefaultsSave(dic[@"refresh_token"], kWXRefreshToken);
//openid
        UserDefaultsSave(dic[@"openid"], kWXOpenid);
//刷新授權(quán)Token
        [self refreshToken]俗或;
//獲取用戶信息
        [self getUserWXMessage]岁忘; 
    } failure:^(NSError *error) {
        NSLog(@"%@",error);
    }];
}
//刷新授權(quán)Token
- (void)refreshToken {
    NSLog(@"%@",UserDefaultsGet(kWXToken));
//請求的url  不需要改變,只需要把參數(shù)換成你們的就行
    NSString *urlStr = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%@&grant_type=refresh_token&refresh_token=%@",APPID,UserDefaultsGet(kWXRefreshToken)];
//注意:這個地方使用的是刷新授權(quán)token而不是token
    [Tool getWithPath:urlStr params:nil success:^(id json) {
        NSLog(@"%@",json);
    } failure:^(NSError *error) {
        NSLog(@"%@",error);
    }];
}
//獲取用戶信息
- (void)getUserWXMessage {
//    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
//請求的url  不需要改變帅腌,只需要把參數(shù)換成你們的就行
    NSString *urlStr = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",UserDefaultsGet(kWXToken), UserDefaultsGet(kWXOpenid)];
//注意:這個地方使用的是token 
    [Tool getWithPath:urlStr params:nil success:^(id json) {
        NSLog(@"%@",json);
//這個字典里邊就是儲存用戶的信息速客,可以在這個地方獲取到用戶信息
        NSDictionary *dic = (NSDictionary *)json;
        [self OAuthLoginWithopenID:dic[@"openid"] NickName:dic[@"nickname"] PhotoUrl:dic[@"headimgurl"] Type:@"WX"];
      
    } failure:^(NSError *error) {
        NSLog(@"%@",error);
    }];
}

(二)QQ登錄

QQ 環(huán)境配置我就說了溺职,直接說登錄
@property (nonatomic, strong) TencentOAuth *tencentOAuth;
- (void)QQLoad {
//我們需要獲得信息
    NSArray* permissions = [NSArray arrayWithObjects:
                            kOPEN_PERMISSION_GET_USER_INFO,
                            kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,
                            kOPEN_PERMISSION_ADD_ALBUM,
                            kOPEN_PERMISSION_ADD_ONE_BLOG,
                            kOPEN_PERMISSION_ADD_SHARE,
                            kOPEN_PERMISSION_ADD_TOPIC,
                            kOPEN_PERMISSION_CHECK_PAGE_FANS,
                            kOPEN_PERMISSION_GET_INFO,
                            kOPEN_PERMISSION_GET_OTHER_INFO,
                            kOPEN_PERMISSION_LIST_ALBUM,
                            kOPEN_PERMISSION_UPLOAD_PIC,
                            kOPEN_PERMISSION_GET_VIP_INFO,
                            kOPEN_PERMISSION_GET_VIP_RICH_INFO,
                            nil];
    NSString *appid = @"這個地方寫申請的APPID";
    _tencentOAuth = [[TencentOAuth alloc] initWithAppId:appid andDelegate:self];
//調(diào)起QQ登錄
    [_tencentOAuth authorize:permissions localAppId:appid inSafari:NO];
}
QQ登錄的代理方法
// 登錄成功后的回調(diào)
- (void)tencentDidLogin {
//這個地方需要注意浪耘,登錄成功之后我們需要在這個地方調(diào)用getUserInfo塑崖,獲取用戶信息
    if (_tencentOAuth.accessToken.length > 0) {
        // 獲取用戶信息
        QQOpenID = _tencentOAuth.openId;
        [_tencentOAuth getUserInfo];
        
    } else {
        NSLog(@"登錄不成功 沒有獲取accesstoken");
    }
}
// 登錄失敗后的回調(diào)
- (void)tencentDidNotLogin:(BOOL)cancelled{
    
}
// 登錄時網(wǎng)絡(luò)有問題的回調(diào)
- (void)tencentDidNotNetWork{
    
}

//獲取QQ用戶信息
- (void)getUserInfoResponse:(APIResponse*) response {
  在這個地方我們可以獲取授權(quán)用戶的信息
    if (response && response.retCode == URLREQUEST_SUCCEED) {
        NSDictionary *dic = [response jsonResponse];
        [self OAuthLoginWithopenID:QQOpenID NickName:dic[@"nickname"] PhotoUrl:dic[@"figureurl_qq_2"] Type:@"QQ"];
    } else {
        NSLog(@"獲取用戶信息失敗");
    }
}
結(jié)束了
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末澜躺,一起剝皮案震驚了整個濱河市抒蚜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌通铲,老刑警劉巖器贩,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蛹稍,死亡現(xiàn)場離奇詭異,居然都是意外死亡拗慨,警方通過查閱死者的電腦和手機(jī)奉芦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門声功,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人其爵,你說我怎么就攤上這事伸蚯。” “怎么了摇幻?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵绰姻,是天一觀的道長瑞眼。 經(jīng)常有香客問我,道長银酗,這世上最難降的妖魔是什么徒像? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任锯蛀,我火速辦了婚禮,結(jié)果婚禮上旁涤,老公的妹妹穿的比我還像新娘迫像。我一直安慰自己闻妓,他們只是感情好掠械,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布猾蒂。 她就那樣靜靜地躺著,像睡著了一般舔箭。 火紅的嫁衣襯著肌膚如雪案糙。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天奢讨,我揣著相機(jī)與錄音,去河邊找鬼拿诸。 笑死扒袖,一個胖子當(dāng)著我的面吹牛季率,可吹牛的內(nèi)容都是我干的描沟。 我是一名探鬼主播,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼泞遗,長吁一口氣:“原來是場噩夢啊……” “哼史辙!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起晦毙,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤耙蔑,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垃环,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡遂庄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年涛目,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片估蹄。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡沫换,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出讯赏,到底是詐尸還是另有隱情,我是刑警寧澤系枪,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布磕谅,位于F島的核電站,受9級特大地震影響当犯,放射性物質(zhì)發(fā)生泄漏割疾。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望侵佃。 院中可真熱鬧奠支,春花似錦、人聲如沸迈螟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽季春。三九已至,卻和暖如春耘拇,著一層夾襖步出監(jiān)牢的瞬間宇攻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工挣棕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人洛心。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓词身,卻偏偏與公主長得像番枚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子葫笼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容