需求:应用需要接入第三方的登录,这里以微信为例。
前提:申请了应用的appID,就是在微信平台注册了应用,并且拥有的权限。
准备:1.应用bundle Identifier
2.appID (在微信平台注册后,会返回)
3.App Secret(也是在微信平台有返回)
步骤:
一、导入微信相关的SDK,可到官网上下载:https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319164&token=&lang=zh_CN,
1.导入微信SDK
2.添加相关的依赖库
这里注意一下:libWechatSDK.a一定要依赖进来,否则会报错:
上面报错原因之一就有可能是因为依赖库中没有导入libWechatSDK.a这个库。
3.添加URLScheme
ps:如果点击授权登录没反应,那可能是因为这里没有配置URLScheme
4.info文件的配置
二、代码接入:
这里创建了一个WXLoginShare类来处理第三方登录的一些操作。
1.在pch文件中
2.在AppDelegate.h类
3.WXLoginShare类中.h文件
WXLoginShare类中.m文件
#import "WXLoginShare.h"
@implementation WXLoginShare
+(WXLoginShare *)shareInstance{
static WXLoginShare *loginShare = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
loginShare = [[WXLoginShare alloc]init];
});
return loginShare;
}
// 注册ID
-(void)wxLoginShareRegisterApp{
[WXApi registerApp:APP_ID_SHARE];
}
// 微信登录
-(void)WXLogin{
SendAuthReq *req = [[SendAuthReq alloc]init];
req.scope = @"snsapi_userinfo";
req.state = @"ViewController";
req.openID = APP_ID_SHARE;
[WXApi sendReq:req];
}
-(void)onReq:(BaseReq *)req{
NSLog(@"微信的回调方法---");
}
-(void)onResp:(BaseResp *)resp{
NSLog(@"微信的回调方法222---");
// 微信登录
//**resp.errCode 0 允许授权登录 -2用户取消
if ([resp isKindOfClass:[SendAuthResp class]]) {
if (resp.errCode == 0) {
SendAuthResp *aresp = (SendAuthResp *)resp;
[self getAccessTokenWithCode:aresp.code];
NSLog(@"微信的回调方法333---%@",aresp);
return;
}
}
}
// * 获取access_token
- (void)getAccessTokenWithCode:(NSString *)code
{
NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",APP_ID_SHARE,APP_SECRET_SHARE,code];
NSLog(@"urlString = %@",urlString);
NSURL *url = [NSURL URLWithString:urlString];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
if (data)
{
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"dict = %@",dict);
/*
"access_token" = "yDYlmcI4Td1s1zrqjA6v_a0ptx7wEJaKfgr65OMbBecvO4iBYyLujsfHxu82DSGxYqssbMSyiZbHI3XYC2tAJg"; //
"expires_in" = 7200;
openid = o9TVB1Co3947nBNB51XfQLB7CLSg;
"refresh_token" = "-icY6qNcesIqrRY8CXhtDH9kiXrFxdf59GNusPfpk221X-pSCDFDnIKDnAMPGClwqSERrtuyj_dan4vkPBxTfg";
scope = "snsapi_userinfo";
unionid = o4E2Q1fAj84mf3ziOqrVzjWbxH7I;
*/
if ([dict objectForKey:@"errcode"])
{// 如果这里有值,说明授权失败
// 授权失败(用户取消/拒绝)
if ([self.delegate respondsToSelector:@selector(wxLoginShareFail:)]) {
[self.delegate wxLoginShareFail:dict];
}
}else{
[self getUserInfoWithAccessToken:[dict objectForKey:@"access_token"] andOpenId:[dict objectForKey:@"openid"]];
}
}
});
});
}
//* 获取用户信息
- (void)getUserInfoWithAccessToken:(NSString *)accessToken andOpenId:(NSString *)openId
{
// 存入本地
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
[defaults setObject:accessToken forKey:WX_REFRESH_TOKEN];
[defaults setObject:openId forKey:OPENID];
[defaults synchronize];
NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openId];
NSLog(@"urlString = %@",urlString);
NSURL *url = [NSURL URLWithString:urlString];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
if (data)
{
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
NSLog(@"dict = %@",dict);
/**
*city = Foshan;
country = CN;
headimgurl = "http://wx.qlogo.cn/mmopen/vi_32/oXUy91CibcGpekG7sOB7O0icpxq7B3kv4oZyia3AA1mPPjH9qAbA8tG1Xx6WNE03vNwhyibhA7LKSBia0t5qc9dSeow/0";
language = "zh_CN";
nickname = "\U5929\U9053\U916c\U52e4";
openid = o9TVB1Co3947nBNB51XfQLB7CLSg;
privilege = (
);
province = Guangdong;
sex = 1; unionid = o4E2Q1fAj84mf3ziOqrVzjWbxH7I;
*
*/
if ([dict objectForKey:@"errcode"])
{
//AccessToken失效
[self getAccessTokenWithRefreshToken:[[NSUserDefaults standardUserDefaults]objectForKey:WX_REFRESH_TOKEN]];
}else{
if ([_delegate respondsToSelector:@selector(wxLoginShareSuccess:)]) {
[_delegate wxLoginShareSuccess:dict];
}
}
}
});
});
}
// * 刷新access_token
- (void)getAccessTokenWithRefreshToken:(NSString *)refreshToken
{
NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%@&grant_type=refresh_token&refresh_token=%@",@"wx29c1153063de230b",refreshToken];
NSLog(@"urlString = %@",urlString);
NSURL *url = [NSURL URLWithString:urlString];
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
NSString *dataStr = [NSString stringWithContentsOfURL:url encoding:NSUTF8StringEncoding error:nil];
NSData *data = [dataStr dataUsingEncoding:NSUTF8StringEncoding];
dispatch_async(dispatch_get_main_queue(), ^{
if (data)
{
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];
if ([dict objectForKey:@"errcode"])
{
//授权过期
}else{
//重新使用AccessToken获取信息
NSString *token = [[NSUserDefaults standardUserDefaults]objectForKey:WX_REFRESH_TOKEN];
NSString *openID = [[NSUserDefaults standardUserDefaults]objectForKey:OPENID];
if([dict objectForKey:@"access_token"] && [dict objectForKey:@"access_token"]!=nil){
token = [dict objectForKey:@"access_token"];
}
if([dict objectForKey:@"openid"] && [dict objectForKey:@"openid"]!=nil){
openID = [dict objectForKey:@"openid"];
}
[self getUserInfoWithAccessToken:token andOpenId:openID];
}
}
});
});
}
@end
三、在点击登录的地方