当前位置: > > > Swift - QQ授权登录,并获取个人信息(用户资料)

Swift - QQ授权登录,并获取个人信息(用户资料)

(本文代码已升级至Swift3)

现在很多APP或者网站都支持使用QQ帐号进行登录。本文演示如何实现QQ的第三方登录,以及登录后的获取用户的个人信息。

1,腾讯开放平台注册,以及SDK的配置
可以参考我原来写的这篇文章:Swift - 腾讯官方SDK的配置及使用(分享到QQ空间、分享到好友)
按照文章中的1,2,3步骤进行操作。

注意:如果应用未上线,这时需要在你的应用中的"应用调试者"设置调试账号才能使用,不然登录授权的时候就会报登录授权失败110406错误。

2,登录授权,并获取用户资料信息
(1)点击“登录并获取用户资料”按钮

(2)程序会自动跳转到QQ,显示登录页面(页面上会显示需要的授权)

(3)登录成功后又会自动返回原来的APP。本样例中我们在登录成功后,获取用户信息并打印出来

附:返回参数说明

参数名称 描述
ret 返回码。详见公共返回码说明#OpenAPI V3.0 返回码
msg 如果错误,返回错误信息。
is_lost 判断是否有数据丢失。如果应用不使用cache,不需要关心此参数。

0或者不返回:没有数据丢失,可以缓存。
1:有部分数据丢失或错误,不要缓存。

nickname 昵称。
gender 性别。
country 国家(当pf=qzone、pengyou或qplus时返回)。
province 省(当pf=qzone、pengyou或qplus时返回)。
city 市(当pf=qzone、pengyou或qplus时返回)。
figureurl 头像URL。详见:前端页面规范#6. 关于用户头像的获取和尺寸说明
openid 用户QQ号码转化得到的ID(当pf=qplus时返回)。
qq_level 用户QQ等级(当pf=qplus时返回)。
qq_vip_level 用户QQ会员等级(当pf=qplus时返回)。
qplus_level 用户Q+等级(当pf=qplus时返回)。
is_yellow_vip 是否为黄钻用户(0:不是; 1:是)。

(当pf=qzone、pengyou或qplus时返回)

is_yellow_year_vip 是否为年费黄钻用户(0:不是; 1:是)。

(当pf=qzone、pengyou或qplus时返回)

yellow_vip_level 黄钻等级,目前最高级别为黄钻8级(如果是黄钻用户才返回此参数)。

(当pf=qzone、pengyou或qplus时返回)

is_yellow_high_vip 是否为豪华版黄钻用户(0:不是; 1:是)。

(当pf=qzone、pengyou或qplus时返回)

is_blue_vip 是否为蓝钻用户(0:不是; 1:是)。

(当pf=qqgame或3366时返回)

is_blue_year_vip 是否为年费蓝钻用户(0:不是; 1:是)。

(当pf=qqgame或3366时返回)

blue_vip_level 蓝钻等级(如果是蓝钻用户才返回此参数)。

(当pf=qqgame或3366时返回)

3366_level 3366用户的大等级。

(当pf=3366时返回)

3366_level_name 3366用户的等级名,如小游游、小游仙。

(当pf=3366时返回)

3366_grow_level 3366用户的成长等级。

(当pf=3366时返回)

3366_grow_value 3366用户的成长值。

(当pf=3366时返回)

is_super_blue_vip 是否是豪华蓝钻。

(当pf=qqgame或3366时返回)


(4)样例代码:
import UIKit

class ViewController: UIViewController, TencentSessionDelegate{
    
    var _tencentOAuth:TencentOAuth!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        _tencentOAuth = TencentOAuth.init(appId: "1105212016", andDelegate: self)
    }
    
    //登录按钮点击
    @IBAction func login(_ sender: AnyObject) {
        //设置权限列表
        let permissions = ["get_user_info","get_simple_userinfo"];
        //登陆
        _tencentOAuth.authorize(permissions)
    }
    
    //登陆完成调用
    func tencentDidLogin() {
        if !_tencentOAuth.accessToken.isEmpty {
            print("----------------------------------------")
            print("登录成功!")
            print("openId:\(_tencentOAuth.openId)",
                "accessToken:\(_tencentOAuth.accessToken)",
                "expirationDate:\(_tencentOAuth.expirationDate)")
            print("开始获取用户资料")
            _tencentOAuth.getUserInfo()
        }else {
            print("登录失败!没有获取到accessToken")
        }
    }
    
    /**
     * 登录失败后的回调
     */
    func tencentDidNotLogin(_ cancelled:Bool) {
        if cancelled {
            print("用户取消登录!")
        }else{
            print("登录失败!")
        }
    }
    
    /**
     * 登录时网络有问题的回调
     */
    func tencentDidNotNetWork() {
        print("没有网络,无法登录!")
    }
    
    /**
     * 取得用户信息的回调
     */
    func getUserInfoResponse(_ response: APIResponse!) {
        print("----------------------------------------")
        print("用户资料获取成功:")
        print(response.jsonResponse)
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}

3,退出登录
要退出登录、取消授权。只需要调用 TencentOAuth 对象的 logout() 方法即可。
_tencentOAuth.logout(self)

源码下载:hangge_1070.zip
评论6
  • 6楼
    2017-04-06 10:19
    秋风凉

    我把源码下载后进行测试是可以调用手机qq登录,但是自己的app却没调用,反复比对了设置信息和代码,但是没找到问题,请问有可能是那里出了错误?

    站长回复

    我检查了下,所有相关的配置确实都写在文章里了,不太清楚你那边是为什么调用不到手机QQ。

  • 5楼
    2017-04-02 11:36
    秋风凉

    请问怎么调用手机qq快速登录啊? 这个我试的只能网页登录

    站长回复

    如果手机上装了QQ,这个就是调用手机QQ进行授权登录的。

  • 4楼
    2017-02-15 15:16
    Roofe

    class ViewController: UIViewController, TencentSessionDelegate
    出现Type 'ViewController"does not conform to protocol 'TencentLoginDelegate'错误, 怎么解决

    谢谢

    站长回复

    这篇文章写的比较早,我把代码更新成Swift3的了,你可以再看下。

  • 3楼
    2016-05-15 15:07
    刘刘

    微信登录是不是也类似的?还有微博。。

    站长回复

    其实还是有区别的,毕竟他们提供的接口都不一样。

  • 2楼
    2016-03-16 11:20
    qlcx35@gmail.com

    我这里登录完成后,openid那些内容都能打印出来,
    但tencentDidLogin这个方法为什么一直没回调呢,

    麻烦有空帮想想,是哪里有问题,跪谢

    站长回复

    我这边又测试了下,是没问题的。我也想不出你这种情况是什么原因造成的。

  • 1楼
    2016-03-11 08:48
    ck

    不错不错,顶

    站长回复

    谢谢支持