(一)微信登录
微信登陆的环境配置我就不详细说明了,按照官方的文档应该能解决
这是微信官方发说明:
1、目前移动应用上微信登录只提供原生的登录方式,需要用户安装微信客户端才能配合使用。
2、对于Android应用,建议总是显示微信登录按钮,当用户手机没有安装微信客户端时,请引导用户下载安装微信客户端。
3、对于iOS应用,考虑到iOS应用商店审核指南中的相关规定,建议开发者接入微信登录时,先检测用户手机是否已安装微信客户端(使用sdk中isWXAppInstalled函数 ),对未安装的用户隐藏微信登录按钮,只提供其他登录方式(比如手机号注册登录、游客登录等)。
1.微信登录的时候首先给微信发送一个SendAuthReq然后让微信授权
- (void)WXLogin {
if ([WXApi isWXAppInstalled]) {
//构造SendAuthReq结构体
SendAuthReq* req =[[SendAuthReq alloc ] init] ;
//我写了这个下面几个字段,但是授权还是获取用户基本信息,官方demo能获取的比较多 snsapi_userinfo写这个就可以
req.scope = @"snsapi_message,snsapi_userinfo,snsapi_friend,snsapi_contact";
req.state = @"App" ;
req.openID = @"这个地方写你申请的APPID";
//第三方向微信终端发送一个SendAuthReq消息结构
[WXApi sendReq:req];
} else {
[Tool showHUDWithString:@"请先安装微信"];
}
}
2.当微信授权之后,返回我们的App的时候会走回调函数
#pragma mark - WXApiDelegate
- (void)onResp:(BaseResp *)resp {
if ([resp isKindOfClass:[SendAuthResp class]]) {
if (_delegate
&& [_delegate respondsToSelector:@selector(managerDidRecvAuthResponse:)]) {
//这个SendAuthResp会储存我们需要的信息,我们拿到这个之后进行操作,这个地方我的是和官方demo一样写了一个代理(抄袭官方的)
SendAuthResp *authResp = (SendAuthResp *)resp;
[_delegate managerDidRecvAuthResponse:authResp];
}
}
}
3.实现代理(我是在登录页面实现代理方法)
/*
实现代理,获取授权token,和刷新授权token(注意两个token是不一样的),openid 以及我们需要的信息
*/
- (void)managerDidRecvAuthResponse:(SendAuthResp *)response {
CODE = response.code;
//微信提醒让我们最好把APPID和APPSecret放在服务器,防止泄露造成不必要的麻烦
参数说明:
APPID:我们在微信开发平台申请的APPID
SECRET:我们在微信开放平台申请的APPSecret
CODE:微信授权后获取的code
//请求的url 不需要改变,只需要把参数换成你们的就行
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;
//授权token
UserDefaultsSave(dic[@"access_token"], kWXToken);
//刷新授权token
UserDefaultsSave(dic[@"refresh_token"], kWXRefreshToken);
//openid
UserDefaultsSave(dic[@"openid"], kWXOpenid);
//刷新授权Token
[self refreshToken];
//获取用户信息
[self getUserWXMessage];
} failure:^(NSError *error) {
NSLog(@"%@",error);
}];
}
//刷新授权Token
- (void)refreshToken {
NSLog(@"%@",UserDefaultsGet(kWXToken));
//请求的url 不需要改变,只需要把参数换成你们的就行
NSString *urlStr = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%@&grant_type=refresh_token&refresh_token=%@",APPID,UserDefaultsGet(kWXRefreshToken)];
//注意:这个地方使用的是刷新授权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 不需要改变,只需要把参数换成你们的就行
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 环境配置我就说了,直接说登录
@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];
//调起QQ登录
[_tencentOAuth authorize:permissions localAppId:appid inSafari:NO];
}
QQ登录的代理方法
// 登录成功后的回调
- (void)tencentDidLogin {
//这个地方需要注意,登录成功之后我们需要在这个地方调用getUserInfo,获取用户信息
if (_tencentOAuth.accessToken.length > 0) {
// 获取用户信息
QQOpenID = _tencentOAuth.openId;
[_tencentOAuth getUserInfo];
} else {
NSLog(@"登录不成功 没有获取accesstoken");
}
}
// 登录失败后的回调
- (void)tencentDidNotLogin:(BOOL)cancelled{
}
// 登录时网络有问题的回调
- (void)tencentDidNotNetWork{
}
//获取QQ用户信息
- (void)getUserInfoResponse:(APIResponse*) response {
在这个地方我们可以获取授权用户的信息
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(@"获取用户信息失败");
}
}
结束了