(一)微信登錄
微信登陸的環(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é)束了