weixin登录

 

iOS 微信第三方登录的简单实现 

标签: ios第三方登录微信
  5082人阅读  评论(0)  收藏  举报
  分类:

一、下载微信SDK

微信开放平台 https://open.weixin.qq.com


二、导入SDK

导入SDK,并添加依赖库

               

三、配置URL scheme

在Xcode中,选择你的工程设置项,选中“TARGETS”一栏,在“info”标签栏的“URL type“添加“URL scheme”为你所注册的应用程序id(如下图所示),此步为配置应用间的跳转

      


四、开始编写代码


1、在Appdelegate.h中引用微信文件,声明遵循代理。

[objc]  view plain  copy
  1. #import <UIKit/UIKit.h>  
  2. #import "WXApi.h"  
  3.   
  4. @interface AppDelegate : UIResponder <UIApplicationDelegate,WXApiDelegate>  
  5.   
  6. @property (strongnonatomicUIWindow *window;  
  7.   
  8. @end  

2、注册SDK

要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id。(在 AppDelegate 的 didFinishLaunchingWithOptions 函数中向微信注册id)。

[objc]  view plain  copy
  1. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  
  2.     // Override point for customization after application launch.  
  3.       
  4.     [WXApi registerApp:@"这里填写你的AppID"];  
  5.       
  6.     return YES;  
  7. }  


3、重写AppDelegate的handleOpenURL和openURL方法

[objc]  view plain  copy
  1. //和QQ,新浪并列回调句柄  
  2. - (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation  
  3. {  
  4.     return [WXApi handleOpenURL:url delegate:self];  
  5. }  
  6.   
  7. - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
  8. {  
  9.     return [WXApi handleOpenURL:url delegate:self];  
  10. }  


4、调用微信API,调用微信登录

scope : 应用授权作用域,如获取用户个人信息则填写snsapi_userinfo

state : 用于保持请求和回调的状态,授权请求后原样带回给第三方。该参数可用于防止csrf攻击(跨站请求伪造攻击),建议第三方带上该参数,可设置为简单的随机数加session进行校验(非必填)

[objc]  view plain  copy
  1. - (void)wechatLoginButtonPressed  
  2. {  
  3.     NSLog(@"%s",__func__);  
  4.       
  5.     //构造SendAuthReq结构体  
  6.     SendAuthReq* req =[[SendAuthReq alloc] init];  
  7.     req.scope = @"snsapi_userinfo" ;  
  8.     req.state = @"123" ;  
  9.     //第三方向微信终端发送一个SendAuthReq消息结构  
  10.     [WXApi sendReq:req];  
  11. }  

5、在Appdelegate中实现微信的代理,获取微信返回的code,这里我使用了通知的方法来调用登录controller中的相应才做,也可以使用代理、KVO等方式来实现。

[objc]  view plain  copy
  1. //授权后回调 WXApiDelegate  
  2. -(void)onResp:(BaseReq *)resp  
  3. {  
  4.     /* 
  5.      ErrCode ERR_OK = 0(用户同意) 
  6.      ERR_AUTH_DENIED = -4(用户拒绝授权) 
  7.      ERR_USER_CANCEL = -2(用户取消) 
  8.      code    用户换取access_token的code,仅在ErrCode为0时有效 
  9.      state   第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K 
  10.      lang    微信客户端当前语言 
  11.      country 微信用户当前国家信息 
  12.      */  
  13.   
  14.     if ([resp isKindOfClass:[SendAuthResp class]]) //判断是否为授权请求,否则与微信支付等功能发生冲突  
  15.     {  
  16.         SendAuthResp *aresp = (SendAuthResp *)resp;  
  17.         if (aresp.errCode== 0)  
  18.         {  
  19.             NSLog(@"code %@",aresp.code);  
  20.             [[NSNotificationCenter defaultCenter] postNotificationName:@"wechatDidLoginNotification" object:self userInfo:@{@"code":aresp.code}];  
  21.         }  
  22.     }  
  23. }  

相对应注册通知方法:

[objc]  view plain  copy
  1. //跳转到主界面  
  2. [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(wechatDidLoginNotification:) name:@"wechatDidLoginNotification" object:nil];  

记得在dealloc方法中移除通知,避免发生冲突:

[objc]  view plain  copy
  1. - (void)dealloc  
  2. {  
  3.     [[NSNotificationCenter defaultCenter] removeObserver:self name:@"wechatDidLoginNotification" object:nil];  
  4. }  

微信登录认证后获取用户的个人信息比较麻烦,需要三个步骤:

(1)获取微信登录code

(2)根据code获取accessToken和openId

(3)根据accessToken和openId获取用户信息


具体步骤:

刚刚我们已经在appdelegate中微信的代理中获取到了code,下面直接来进行第二步,根据code获取accessToken和openId:

参照微信开放平台官方文档:

          

[objc]  view plain  copy
  1. - (void)getWechatAccessTokenWithCode:(NSString *)code  
  2. {  
  3.     NSString *url =[NSString stringWithFormat:  
  4.       @"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",  
  5.         WechatAppKey,WechatSecrectKey,code];  
  6.       
  7.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  8.         NSURL *zoneUrl = [NSURL URLWithString:url];  
  9.         NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];  
  10.         NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];  
  11.         dispatch_async(dispatch_get_main_queue(), ^{  
  12.               
  13.             if (data)  
  14.             {  
  15.                 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data   
  16.                                                                     options:NSJSONReadingMutableContainers error:nil];  
  17.                   
  18.                 NSLog(@"%@",dic);  
  19.                 NSString *accessToken = dic[@"access_token"];  
  20.                 NSString *openId = dic[@"openid"];  
  21.                   
  22.                 [self getWechatUserInfoWithAccessToken:accessToken openId:openId];  
  23.             }  
  24.         });  
  25.     });  
  26. }  

现在已经获取了微信的accessToken和openId,就可以请求相应的微信接口了。

参照文档,我们使用以下接口:

          


使用这个接口就可以获取用户信息了,然后调用自己的方法进行登录,这里可以使用openId当做账号,他是每个微信用户唯一对应的id

[objc]  view plain  copy
  1. - (void)getWechatUserInfoWithAccessToken:(NSString *)accessToken openId:(NSString *)openId  
  2. {  
  3.     NSString *url =[NSString stringWithFormat:  
  4.                     @"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",accessToken,openId];  
  5.       
  6.     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
  7.         NSURL *zoneUrl = [NSURL URLWithString:url];  
  8.         NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];  
  9.         NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];  
  10.         dispatch_async(dispatch_get_main_queue(), ^{  
  11.               
  12.             if (data)  
  13.             {  
  14.                 NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data   
  15.                                                                     options:NSJSONReadingMutableContainers error:nil];  
  16.                   
  17.                 NSLog(@"%@",dic);  
  18.                   
  19.                 NSString *openId = [dic objectForKey:@"openid"];  
  20.                 NSString *memNickName = [dic objectForKey:@"nickname"];  
  21.                 NSString *memSex = [dic objectForKey:@"sex"];  
  22.                   
  23.                 [self loginWithOpenId:openId memNickName:memNickName memSex:memSex];  
  24.             }  
  25.         });  
  26.           
  27.     });  
  28. }  

至此,就实现了简单的微信登录


效果图:

                      


欢迎交流:japhoo@163.com


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值