`
近乎sns
  • 浏览: 12416 次
  • 性别: Icon_minigender_2
  • 来自: 青岛
文章分类
社区版块
存档分类
最新评论

基于第三方微信授权登录的iOS代码分析

iOS 
阅读更多

微信已经深入到每一个APP的缝隙,最常用的莫过分享和登录了,接下来就以代码的形式来展开微信登录的相关说明,至于原理级别的oauth2.0认证体系请参考微信开放平台的相关说明和图示 https://open.weixin.qq.com/

微信登录授权开发

1,到微信开发平台注册相关APP,现在是等待审核成功后才能获取到对应的key和secret;获取成功后需要单独申请开通登录和支付接口,如图


 

2,和QQ类似,需要填写Url Schemes,如demo中的wxd930ea5d5a258f4f ,然后引入相应framework;

3,在AppDelegate中注册和实现授权后的回调函数,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
//向微信注册  
  [WXApi registerApp:kWXAPP_ID withDescription:@"weixin"];  
   
//授权后回调 WXApiDelegate  
-(void)onResp:(BaseReq *)resp  
{  
   /* 
    ErrCode ERR_OK = 0(用户同意) 
    ERR_AUTH_DENIED = -4(用户拒绝授权) 
    ERR_USER_CANCEL = -2(用户取消) 
    code    用户换取access_token的code,仅在ErrCode为0时有效 
    state   第三方程序发送时用来标识其请求的唯一性的标志,由第三方程序调用sendReq时传入,由微信终端回传,state字符串长度不能超过1K 
    lang    微信客户端当前语言 
    country 微信用户当前国家信息 
    */      
    SendAuthResp *aresp = (SendAuthResp *)resp;  
    if (aresp.errCode== 0) {  
        NSString *code = aresp.code;  
        NSDictionary *dic = @{@"code":code};  
    }  
}  
 
//和QQ,新浪并列回调句柄
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation  
{  
    return [TencentOAuth HandleOpenURL:url] ||  
    [WeiboSDK handleOpenURL:url delegate:self] ||  
    [WXApi handleOpenURL:url delegate:self];;  
}  
   
- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url  
{  
    return [TencentOAuth HandleOpenURL:url] ||  
    [WeiboSDK handleOpenURL:url delegate:self] ||  
    [WXApi handleOpenURL:url delegate:self];;  
}

4,微信登录授权比较复杂,相比QQ,新浪多了几步,简单说就是需要三步,第一步,获取code,这个用来获取token,第二步,就是带上code获取token,第三步,根据第二步获取的token和openid来获取用户的相关信息;

下面用代码来实现:

第一步:code

1
2
3
4
5
6
7
8
9
10
11
12
- (IBAction)weixinLogin:(id)sender  
{  
    [self sendAuthRequest];  
}  
   
-(void)sendAuthRequest  
{  
    SendAuthReq* req =[[SendAuthReq alloc ] init];  
    req.scope = @"snsapi_userinfo,snsapi_base";  
    req.state = @"0744" ;  
    [WXApi sendReq:req];  
}

这里获取后会调用之前在AppDelegate里面的对应oauthResp回调,获得得到的code。

第二步:token和openid

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-(void)getAccess_token  
{  
       
    NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/oauth2/access_token?appid=%@&secret=%@&code=%@&grant_type=authorization_code",kWXAPP_ID,kWXAPP_SECRET,self.wxCode.text];  
       
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
        NSURL *zoneUrl = [NSURL URLWithString:url];  
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];  
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];  
        dispatch_async(dispatch_get_main_queue(), ^{  
            if (data) {  
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];  
              /* 
               
               "access_token" = "OezXcEiiBSKSxW0eoylIeJDUKD6z6dmr42JANLPjNN7Kaf3e4GZ2OncrCfiKnGWiusJMZwzQU8kXcnT1hNs_ykAFDfDEuNp6waj-bDdepEzooL_k1vb7EQzhP8plTbD0AgR8zCRi1It3eNS7yRyd5A"; 
               "expires_in" = 7200; 
               openid = oyAaTjsDx7pl4Q42O3sDzDtA7gZs; 
               "refresh_token" = "OezXcEiiBSKSxW0eoylIeJDUKD6z6dmr42JANLPjNN7Kaf3e4GZ2OncrCfiKnGWi2ZzH_XfVVxZbmha9oSFnKAhFsS0iyARkXCa7zPu4MqVRdwyb8J16V8cWw7oNIff0l-5F-4-GJwD8MopmjHXKiA"; 
               scope = "snsapi_userinfo,snsapi_base"; 
               
               */  
                   
                self.access_token.text = [dic objectForKey:@"access_token"];  
                self.openid.text = [dic objectForKey:@"openid"];  
                 
            }  
        });  
    });  
}

利用GCD来获取对应的token和openID.

第三步:userinfo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
-(void)getUserInfo  
{  
       
    NSString *url =[NSString stringWithFormat:@"https://api.weixin.qq.com/sns/userinfo?access_token=%@&openid=%@",self.access_token.text,self.openid.text];  
       
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{  
        NSURL *zoneUrl = [NSURL URLWithString:url];  
        NSString *zoneStr = [NSString stringWithContentsOfURL:zoneUrl encoding:NSUTF8StringEncoding error:nil];  
        NSData *data = [zoneStr dataUsingEncoding:NSUTF8StringEncoding];  
        dispatch_async(dispatch_get_main_queue(), ^{  
            if (data) {  
                NSDictionary *dic = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil];  
                /* 
                 
                 city = Haidian; 
                 country = CN; 
                 language = "zh_CN"; 
                 nickname = "xxx"; 
                 openid = oyAaTjsDx7pl4xxxxxxx; 
                 privilege =     ( 
                 ); 
                 province = Beijing; 
                 sex = 1; 
                 unionid = oyAaTjsxxxxxxQ42O3xxxxxxs; 
                 
                 */  
                   
                self.nickname.text = [dic objectForKey:@"nickname"];  
                self.wxHeadImg.image = [UIImage imageWithData:[NSData dataWithContentsOfURL:[NSURL URLWithString:[dic objectForKey:@"headimgurl"]]]];  
   
            }  
        });  
   
    });  
}

执行到这一步就算完成了整个授权登录的功能,能把昵称和头像显示出来,剩下的就是及时刷新你的token,详情可参考开发文档。

下面是登录成功后的QQ,新浪微博,微信的真机运行成功截图:





评价:微信的开发文档相比容易理解和调试,虽然没有demo,但是文档比较详细,所以可以在一定程度上减轻了开发的困难,但是相比之下微信的授权步骤比较麻 烦,需要三步才能彻底获取用户信息,这点没有QQ和新浪微博简洁,需要有一定的阅读和代码功底,希望能给大家带来帮助。
不忘初心

 

  • 大小: 121.7 KB
  • 大小: 31.4 KB
分享到:
评论

相关推荐

    微信授权登录demo源码

    微信授权登录是微信开放平台提供的一种服务,允许第三方应用通过用户授权的方式获取微信用户的个人信息,以便进行特定功能的实现,如用户身份验证、个性化服务等。这个“微信授权登录demo源码”是一个简单的示例,...

    swift-iOS微信微博QQfacebook第三方登录授权并获得昵称和头像。

    在iOS应用开发中,集成第三方登录服务如微信、微博、QQ和Facebook,可以极大地提升用户体验,简化用户注册和登录流程。这些社交平台提供了开放API,允许开发者通过SDK实现快速授权和数据获取。以下是对这个主题的...

    swift-KTTKWeChat这是一个仿微信客户端的iOS项目

    项目可能使用UIImage和UIImageView进行图像显示,而Core Graphics或第三方库如Kingfisher用于图片的加载、缓存和处理。 ### 7. 消息推送与通知 iOS的UserNotifications框架可以用于实现远程推送通知,使用户即使在...

    IOS第三方登录

    在iOS应用开发中,集成第三方登录服务已经成为一种常见的实践,为用户提供更加便捷的登录体验。标题"iOS第三方登录"指的是在iOS应用中整合如微信、QQ、微博等社交平台的登录方式,允许用户通过自己的社交账号快速...

    微信登录及lib库

    1. **OAuth2.0授权框架**:微信登录基于OAuth2.0协议,这是一个广泛用于授权的开放标准,允许第三方应用在用户许可的情况下访问其存储在另一服务提供商上的特定信息。 2. **微信开放平台**:开发者需要在微信开放...

    swift-Swift基础知识点网络请求数据解析UI微信授权登录等等

    - **XML解析**:尽管JSON更常见,但有时也会遇到XML数据,Swift社区提供了第三方库如SWXMLHash来处理XML。 - **数据库集成**:SQLite或Core Data可用于持久化本地数据,Swift封装了易于使用的API。 4. **UI设计**...

    swift-LWWXTool微信登录注册分享到朋友圈支付等功能封装

    在Swift编程语言中,开发iOS应用时,与第三方平台如微信进行集成是非常常见的需求。`LWWXTool`是一个专为Swift设计的工具类库,它封装了微信的登录、注册、分享到朋友圈以及支付等功能,极大地简化了开发者的工作...

    swift-iOS版微信小助手(防撤回修改微信运动群管理好友请求管理)

    除了Swift基础库,项目还可能引入第三方库,如Alamofire进行网络请求,SwiftyJSON简化JSON处理,MBProgressHUD展示加载进度等。良好的代码组织和依赖管理(如CocoaPods或Carthage)是项目稳定运行的关键。 总结,这...

    微信扫码登录.zip

    微信扫码登录是一种常见的第三方登录方式,它允许用户通过微信账号快速授权登录到其他应用程序或网站,无需创建新的账户和记忆额外的密码。这种方式为用户提供了一种便捷的登录体验,同时也帮助开发者吸引了更多的...

    微信ipad协议6.7.1 含授权端

    对于开发者而言,理解并掌握微信iPad协议6.7.1有助于他们开发基于微信的第三方应用或工具,或是进行更深度的定制化开发。而普通用户则可以通过运行授权端来确保自己的微信使用体验,避免因未授权而引发的问题。因此...

    IOS 微信朋友圈代码 仿朋友圈

    4. **网络请求与API接口**:为了模拟朋友圈中的数据获取和发送,开发者可能使用了URLSession或者第三方库如Alamofire来处理网络请求,与服务器进行数据交互。 5. **JSON解析**:接收到的数据通常是JSON格式,因此...

    微信登录demo

    1. **微信开放平台**:微信提供了开放平台,允许第三方开发者接入其API,实现各种功能,如用户授权登录、分享内容、支付等。微信登录Demo就是基于这个开放平台进行开发的。 2. **OAuth2.0授权协议**:微信登录采用...

    收钱吧微信收款Delphi安卓源代码网上发布

    微信支付提供了SDK和API接口,允许第三方应用接入其支付系统。开发者需要注册成为微信支付的开发者,获取必要的API密钥和证书,然后在Delphi代码中正确配置这些参数。通过调用微信的接口,应用可以实现扫码支付、...

    微信分享完整demo

    1. 微信开放平台:微信提供了开放平台,允许第三方开发者注册并获取appid,以便在自己的应用中接入微信的各种服务,如分享、登录等。appid是应用在微信平台上的唯一标识,如同应用的身份证。 2. SDK集成:amm_sdk_...

    最新游戏扫码登录源码(Safari+微信).zip

    - **Safari的隐私策略**:Safari有严格的隐私设置,可能影响第三方登录的实现,比如阻止第三方cookie,开发者需要找到替代方案。 3. **微信登录API**: 微信提供了一套开放平台接口,用于集成微信登录功能。...

    最新版第三方qq登录源码

    QQ登录通常基于OAuth2.0协议,这是一种开放标准授权框架,允许用户让第三方应用在无需获取用户密码的情况下,获取用户的特定信息。在QQ登录过程中,应用会引导用户跳转到QQ的授权页面,用户同意后,应用会收到一个...

    Delphi XE10调用微信接口

    微信提供了一套开放的API接口,允许开发者将其功能集成到第三方应用中,如分享、登录、支付等。这些接口通常基于 HTTP/HTTPS 协议,需要开发者进行认证和签名处理。 3. **准备工作** 在开始调用微信接口前,你...

    第三方登录

    本项目"第三方登录"是一个基于sharesdk实现的示例,旨在展示如何集成这些社交平台的登录接口,以实现快速登录功能。 首先,让我们详细了解一下sharesdk。sharesdk是一个由中国分享网络技术有限公司开发的社交分享和...

    高仿微信登入界面

    4. **网络请求**:登录界面通常需要连接服务器进行身份验证,因此需要掌握网络请求技术,如使用URLSession进行HTTP/HTTPS请求,或者使用第三方库如Alamofire简化网络请求。 5. **JSON解析**:服务器返回的数据通常...

    基于python+appium的android微信自动添加好友及爬取其朋友圈的爬虫.zip

    “python”标签确认了主要编程语言为Python,Python因其简洁明了的语法和丰富的第三方库而常被用于爬虫开发。 “毕业设计”标签表明这个项目可能是某个学生的毕业作品,它可能涵盖了软件设计、实现、测试等完整流程...

Global site tag (gtag.js) - Google Analytics