由于需要接入微信三方登录,顺便给大家分享下接入的经验;获取参数,下载SDK就不在此啰嗦了,直接上代码。
1.首先应该初始化SDK
//程序启动后初始化微信SDK
[WXApi registerApp:@“appkey”];
2.发起授权请求
SendAuthReq* req =[[SendAuthReq alloc ] init];
req.scope = @"snsapi_userinfo" ;
req.state = @"demo" ;
//第三方向微信终端发送一个SendAuthReq消息结构
[WXApi sendReq:req];
3.在AppDelegate中实现跳转应用的方法
//iOS9使用
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url options:(NSDictionary*)options
{
return [WXApi handleOpenURL:url delegate:self];;
}
4.实现代理方法
-(void) onReq:(BaseReq*)req
{
NSLog(@"req = %@",req);
}
/*! @brief 发送一个sendReq后,收到微信的回应
*
* 收到一个来自微信的处理结果。调用一次sendReq后会收到onResp。
* 可能收到的处理结果有SendMessageToWXResp、SendAuthResp等。
* @param resp具体的回应内容,是自动释放的
*/
-(void) onResp:(BaseResp*)resp
{
NSLog(@"resp = %@",resp);
SendAuthResp *authResp = resp;
if ([authResp.state isEqualToString:@"demo"]) {
NSString *url = [NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",@“Appkey”,@“AppSecret”,authResp.code];
LMHttpRequest *noticeRequest = [[LMHttpRequest alloc] initWithUrl:url];
//通过authResp.code获取access_token
__weak typeof(self) weakSelf = self;
[noticeRequest asynGetRequest:url finish:^(LMHttpRequest *request) {
[weakSelf wechatAuthoFinish:request];
} failed:^{
NSLog(@"网络失败");
}];
}
}
-(void)wechatAuthoFinish:(LMHttpRequest *)wechatRequest
{
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:wechatRequest.downloadData options:NSJSONReadingAllowFragments error:nil];
NSLog(@"dict = %@",dict);
if ([dict objectForKey:@"errcode"])
{
//获取失败
}else{
NSString *openid = [dict objectForKey:@"openid"];
NSString *expires_in = [dict objectForKey:@"expires_in"];
NSString *access_token = [dict objectForKey:@"access_token"];
NSString *refresh_token = [dict objectForKey:@"refresh_token"];
//用户唯一标识
NSString *unionid = [dict objectForKey:@"unionid"];
//此处可以对获取的信息进行进一步处理
}
}
5.获取用户信息
- (void)getUserInfoWithAccessToken:(NSString *)accessToken andOpenId:(NSString *)openId
{
NSString *urlString =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openId];
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"])
{
//AccessToken失效
}else{
//获取需要的数据
}
}
});
}
6.刷新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=%@",@"appkey",refreshToken];
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获取信息
}
}
});
});
}