qq登录_qq登录界面 - CSDN
  • QQ登录功能实现

    千次阅读 2018-08-30 14:47:49
    原因:公司的注册与登录不再像以前那样子使用自定义的账号密码登录了,要改成方便的微信扫码登录与QQ登录了 教程开始 需要用到的网址: https://connect.qq.com/index.html QQ互联网站 ...

    原因:公司的注册与登录不再像以前那样子使用自定义的账号密码登录了,要改成方便的微信扫码登录与QQ登录了

    教程开始

    需要用到的网址:

    1. https://connect.qq.com/index.html QQ互联网站

    2. http://wiki.connect.qq.com/%E4%BD%BF%E7%94%A8authorization_code%E8%8E%B7%E5%8F%96access_token API文档

    准备工作:

    1. 登录你的QQ互联后台

    2. 创建网站应用

    3. 弄个开发者认证吧,没有开发者认证啥都做不了

    4. 应用基本信息

    5. 填写网络地址(网站域名),填写网站回调域,这里的网站回调域就是具体到QQ登录功能的地址(TP5 例: 域名/模块/控制器/方法)

    6. 查看应用接口中有没有 get_user_info(API)接口

    正式开发

    1. 发送获取CODE参数请求,浏览器打开网址

    https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=appid&redirect_uri=redirect_uri

    参数 是否必须 说明
    response_type code 固定参数
    client_id APPID 创建应用后所获得
    redirect_uri 网站回调域

    2. 获取CODE参数

    参数 说明
    code 获取ACCESS_TOKEN需要的参数

    3. 发送获取ACCESS_TOKEN的请求

    这里需要写CURL方法获取数据

    //php curl(GET)请求
    public function curlGet($url){
        if(empty($url)){
            return false;
        }
        $output = '';
    
        $ch = curl_init();
        $str =$url;
        curl_setopt($ch, CURLOPT_URL, $str);
        curl_setopt ( $ch, CURLOPT_RETURNTRANSFER, true );
        $output = curl_exec($ch);
        return $output;
    }
    

    https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=appid&client_secret=appkey&code=$codeInfo[code]&redirect_uri=redirect_uri

    参数 是否必须 说明
    grant_type refresh_token 固定参数
    client_id APPID
    client_secret APPKEY(创建应用所产生的APPKEY)
    code 上一步所获取的code
    redirect_uri 网站回调域

    4. 获取ACCESS_TOKEN参数

    这里腾讯返回的数据是一个字符串需要我们写一个自定义函数来获取参数,以下是本人写的一个方法

    /**
     * @name 解析地址栏参数
     * @auth Sam
     * @param $str
     * @return array|bool
     */
    public function formateUrlParam($str)
    {
        if(empty($str) || !is_string($str)){
            return false;
        }
    
        $arr = explode('&',$str);
    
        $keyValue = array();
        $newArr = array();
        foreach($arr as $k=>$v){
            $keyValue = explode('=',$v);
    
            $newArr[$keyValue[0]] = $keyValue[1];
    
            $keyValue = array();
    
        }
    
        return $newArr;
    }
    
    参数 说明
    access_token 授权令牌,Access_Token
    expires_in 该access token的有效期,单位为秒
    refresh_token 在授权自动续期步骤中,获取新的Access_Token时需要提供的参数

    5. 发送获取OPENID请求

    https://graph.qq.com/oauth2.0/me?access_token=access_token

    参数 是否必须 说明
    access_token access_token

    6. 获取OPENID参数

    这里返回的数据也是一串字符串,但与上面格式又不同,所以需要自己自定义函数获取参数

    //获得用户openID
    $openId = $this->curlGet("https://graph.qq.com/oauth2.0/me?access_token=$accToken[access_token]");
    
    $openId = trim($openId,"callback( ");
    
    $openId = explode(')',$openId); 
    $openId = trim($openId[0],' ');
    
    
    $openId = json_decode($openId,true);
    

    7. 发送获取用户信息请求

    https://graph.qq.com/user/get_user_info?access_token=access_token&oauth_consumer_key=appid&openid=openid

    参数 是否必须 说明
    access_token access_token
    oauth_consumer_key APPID
    openid OPENID

    8. 获取用户信息

    参数 说明
    ret 返回码
    msg 对应错误信息
    is_lost 是否丢失
    nickname QQ呢称
    gender 性别
    province 省份
    city 城市
    year 年份
    figureurl 30X30的头像图片地址
    figureurl_1 50X50的头像图片地址
    figureurl_2 100X100的头像图片地址
    figureurl_qq_1 40X40的头像图片地址
    figureurl_qq_2 100X100的头像图片地址
    is_yellow_vip 黄钻用户
    vip 黄钻用户
    yellow_vip_level 黄钻等级
    level 黄钻等级
    is_yellow_year_vip 是否为年费黄钻用户

    结语

    坑爹腾讯,两次返回的数据格式都不同,每次都要自己写函数,觉得做API开发最好的就是阿里了,几乎没有难度

    原链接:

    https://my.oschina.net/u/3554366/blog/1507092

    展开全文
  • 实现qq登录

    2019-07-02 23:58:59
    //html页面 引入qq图标 <td> <a href="#" onclick="toLogin()"><img src="http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/img/Connect_logo_4.png" alt=""></a></td> //js页面 ...

    //html页面   引入qq图标

    <td>
    <a href="#" οnclick="toLogin()"><img src="http://qzonestyle.gtimg.cn/qzone/vas/opensns/res/img/Connect_logo_4.png" alt=""></a></td>

    //js页面

    function toLogin()
    {
    var A=window.open("{:url('qlogin/login')}","TencentLogin","width=450,height=320,menubar=0,scrollbars=1,resizable=1,status=1,titlebar=0,toolbar=0,location=1");
    }

    //php页面 实现qq登录
    public function login(){
    Loader::import("Connect.API.qqConnectAPI");
    $qc=new \QC();
    $qc->qq_login();
    }

    //回调函数 返回用户信息

    public function callback(){
    Loader::import("Connect.API.qqConnectAPI");
    $qc=new \QC();
    $call=$qc->qq_callback();
    $openid=$qc->get_openid();
    Session::init([
    'expire'=>60*60*12
    ]);
    Session::set("token",$call);
    $url="https://graph.qq.com/user/get_user_info?access_token=".$call."&oauth_consumer_key=101533118&openid=".$openid;
    $list=file_get_contents($url);
    $content=json_decode($list,true);
    print_r($content);
    $str='';
    $str .='<p>当前显示昵称为:'.$content['nickname'].'</p>';
    $str .='<p>当前显示城市为:'.$content['city'].'</p>';
    $str .='<p>当前显示性别为:'.$content['gender'].'</p>';
    $str .='<p>当前显示头像为:<img src="'.$content['figureurl_1'].'"></p>';
    echo $str;
    }
     

     

    转载于:https://www.cnblogs.com/chaihtml/p/10128085.html

    展开全文
  • 实现一个简易仿qq登录界面,要求实现: 1) 登录界面有帐号、密码文本和编辑框,登录和退出按钮。在程序中维护一个帐号密码的数组,用以判断正确登录与否。如果登录成功,则进入qq主界面,否则清空帐号和密码编辑框,...
  • QQ登录的实现方式

    千次阅读 2017-09-27 15:36:40
    标签: iOS第三方登录QQ登录增量授权第三方登录QQ详解 2016-06-17 18:06 16989人阅读 评论(3) 收藏 举报  分类: Object_c(53)  IOS高级知识总结(102)  版权声明:本文为博主原创...
     

    iOS开发之第三方登录QQ -- 史上最全最新第三方登录QQ方式实现 

    标签: iOS第三方登录QQ登录增量授权第三方登录QQ详解
     16989人阅读 评论(3) 收藏 举报
     分类:
     

    目录(?)[+]

    项目地址 :  https://github.com/zhonggaorong/QQLoginDemo/tree/master

    最新版本的qq登录实现步骤实现:


    1. 首先,你需要去向腾讯申请账号。 地址:点击打开链接

    2. 下载最新的SDK   地址: SDK下载

    SDK内容如下:


    1. doc: 为说明文档, 方法参数说明。

    2.sample 这个是简单的demo

     3. TencentOpenApi_IOS_Bundle.bundle   资源文件包

    4. TencentOpenApi.framework     核心开发框架

    接下来就进入正题:

     1. 项目配置,手把手教学:

       1. 新建一个工程。 
       2. 把TencentOpenApi.framework 和  TencentOpenApi_IOS_Bundle.bundle  拖入工程。 
       3. 配置项目。

       3.1 添加依赖库:


    3.2 在工程配置中的“Build Settings”一栏中找到“Linking”配置区,给“Other Linker Flags”配置项添加属性值“-fobjc-arc”






    3.3 URLScheme 配置:


     3.4 针对ios9以后,需要添加白名单。 

    在info.plist文件中加入 LSApplicationQueriesSchemes 


    对应的info.plist 的source code 为

    [objc] view plain copy
    1. <key>LSApplicationQueriesSchemes</key>  
    2.     <array>  
    3.         <string>mqqapi</string>  
    4.         <string>mqq</string>  
    5.         <string>mqqOpensdkSSoLogin</string>  
    6.         <string>mqqconnect</string>  
    7.         <string>mqqopensdkdataline</string>  
    8.         <string>mqqopensdkgrouptribeshare</string>  
    9.         <string>mqqopensdkfriend</string>  
    10.         <string>mqqopensdkapi</string>  
    11.         <string>mqqopensdkapiV2</string>  
    12.         <string>mqqopensdkapiV3</string>  
    13.         <string>mqzoneopensdk</string>  
    14.         <string>wtloginmqq</string>  
    15.         <string>wtloginmqq2</string>  
    16.         <string>mqqwpa</string>  
    17.         <string>mqzone</string>  
    18.         <string>mqzonev2</string>  
    19.         <string>mqzoneshare</string>  
    20.         <string>wtloginqzone</string>  
    21.         <string>mqzonewx</string>  
    22.         <string>mqzoneopensdkapiV2</string>  
    23.         <string>mqzoneopensdkapi19</string>  
    24.         <string>mqzoneopensdkapi</string>  
    25.         <string>mqzoneopensdk</string>  
    26.     </array>  

     3.5  针对iOS9默认使用https,现在先还原成http请求方式。

      在Info.plist中添加NSAppTransportSecurity类型Dictionary

     在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES    

          第一步:在plist中添加NSAppTransportSecurity项,此项为NSDictionary

          第二步:在NSAppTransportSecurity下添加   NSAllowsArbitraryLoads类型为Boolean,value为YES


    4. 开始码代码了, 最欢乐的时刻:

     1. 在刚刚新建的项目中 appdelegate.m, 添加代码:

              1.引入头文件 : 

              

    [objc] view plain copy
    1. #import <TencentOpenAPI/QQApiInterface.h>  
    2. #import <TencentOpenAPI/TencentOAuth.h>  

       2. 并遵循代理

    [objc] view plain copy
    1. @interface AppDelegate ()<QQApiInterfaceDelegate>  
    2. @end  

      3. 在添加跳转的请求方法

          

    [objc] view plain copy
    1. -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{  
    2.     /** 
    3.      处理由手Q唤起的跳转请求 
    4.      \param url 待处理的url跳转请求 
    5.      \param delegate 第三方应用用于处理来至QQ请求及响应的委托对象 
    6.      \return 跳转请求处理结果,YES表示成功处理,NO表示不支持的请求协议或处理失败 
    7.      */  
    8.     [QQApiInterface handleOpenURL:url delegate:self];  
    9.     return [TencentOAuth HandleOpenURL:url];  
    10. }  
    11.   
    12.   
    13. /** 
    14.  处理来至QQ的请求 
    15.  */  
    16. - (void)onReq:(QQBaseReq *)req{  
    17.     NSLog(@" ----req %@",req);  
    18. }  
    19.   
    20. /** 
    21.  处理来至QQ的响应 
    22.  */  
    23. - (void)onResp:(QQBaseResp *)resp{  
    24.      NSLog(@" ----resp %@",resp);  
    25. }  
    26.   
    27. /** 
    28.  处理QQ在线状态的回调 
    29.  */  
    30. - (void)isOnlineResponse:(NSDictionary *)response{  
    31.   
    32. }  

    现在就是具体的登录controller.m了。


    授权相关的字段

    [objc] view plain copy
    1. /** 发表一条说说到QQ空间(<b>需要申请权限</b>) */  
    2. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_TOPIC;  
    3.   
    4. /** 发表一篇日志到QQ空间(<b>需要申请权限</b>) */  
    5. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ONE_BLOG;  
    6.   
    7. /** 创建一个QQ空间相册(<b>需要申请权限</b>) */  
    8. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_ALBUM;  
    9.   
    10. /** 上传一张照片到QQ空间相册(<b>需要申请权限</b>) */  
    11. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_UPLOAD_PIC;  
    12.   
    13. /** 获取用户QQ空间相册列表(<b>需要申请权限</b>) */  
    14. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_LIST_ALBUM;  
    15.   
    16. /** 同步分享到QQ空间、腾讯微博 */  
    17. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_ADD_SHARE;  
    18.   
    19. /** 验证是否认证空间粉丝 */  
    20. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_CHECK_PAGE_FANS;  
    21.   
    22. /** 获取登录用户自己的详细信息 */  
    23. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_INFO;  
    24.   
    25. /** 获取其他用户的详细信息 */  
    26. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_OTHER_INFO;  
    27.   
    28. /** 获取会员用户基本信息 */  
    29. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_INFO;  
    30.   
    31. /** 获取会员用户详细信息 */  
    32. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_VIP_RICH_INFO;  
    33.   
    34. /** 获取用户信息 */  
    35. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_USER_INFO;  
    36.   
    37. /** 移动端获取用户信息 */  
    38. FOUNDATION_EXTERN NSString *const kOPEN_PERMISSION_GET_SIMPLE_USER_INFO;  


    直接上源码, 源码里面有注释,一看就明白了


    [objc] view plain copy
    1. //  
    2. //  ViewController.m  
    3. //  QQLoginDemo  
    4. //  
    5. //  Created by 张国荣 on 16/6/17.  
    6. //  Copyright © 2016年 BateOrganization. All rights reserved.  
    7. //  
    8.   
    9. #import "ViewController.h"  
    10.   
    11. #import <TencentOpenAPI/TencentOAuth.h>  
    12. #import <TencentOpenAPI/TencentApiInterface.h>  
    13.   
    14. #define APP_ID @"你的appid"  
    15. @interface ViewController ()<TencentSessionDelegate>  
    16. {  
    17.     TencentOAuth *_tencentOAuth;  
    18.     NSMutableArray *_permissionArray;   //权限列表  
    19. }  
    20. @end  
    21.   
    22. @implementation ViewController  
    23.   
    24. - (void)viewDidLoad {  
    25.     [super viewDidLoad];  
    26.       
    27.     self.view.backgroundColor = [UIColor whiteColor];  
    28. }  
    29.   
    30.   
    31. - (IBAction)loginAction:(id)sender {  
    32.     _tencentOAuth=[[TencentOAuth alloc]initWithAppId:APP_ID andDelegate:self];  
    33.       
    34.     //设置权限数据 , 具体的权限名,在sdkdef.h 文件中查看。  
    35.     _permissionArray = [NSMutableArray arrayWithObjects: kOPEN_PERMISSION_GET_SIMPLE_USER_INFO,nil];  
    36.       
    37.     //登录操作  
    38.     [_tencentOAuth authorize:_permissionArray inSafari:NO];  
    39. }  
    40.   
    41. /** 
    42.  * 登录成功后的回调 
    43.  */  
    44. - (void)tencentDidLogin{  
    45.       
    46.     /** Access Token凭证,用于后续访问各开放接口 */  
    47.     if (_tencentOAuth.accessToken) {  
    48.           
    49.         //获取用户信息。 调用这个方法后,qq的sdk会自动调用  
    50.         //- (void)getUserInfoResponse:(APIResponse*) response  
    51.         //这个方法就是 用户信息的回调方法。  
    52.           
    53.         [_tencentOAuth getUserInfo];  
    54.     }else{  
    55.       
    56.         NSLog(@"accessToken 没有获取成功");  
    57.     }  
    58.       
    59. }  
    60.   
    61. /** 
    62.  * 登录失败后的回调 
    63.  * \param cancelled 代表用户是否主动退出登录 
    64.  */  
    65. - (void)tencentDidNotLogin:(BOOL)cancelled{  
    66.     if (cancelled) {  
    67.         NSLog(@" 用户点击取消按键,主动退出登录");  
    68.     }else{  
    69.         NSLog(@"其他原因, 导致登录失败");  
    70.     }  
    71. }  
    72.   
    73. /** 
    74.  * 登录时网络有问题的回调 
    75.  */  
    76. - (void)tencentDidNotNetWork{  
    77.     NSLog(@"没有网络了, 怎么登录成功呢");  
    78. }  
    79.   
    80.   
    81. /** 
    82.  * 因用户未授予相应权限而需要执行增量授权。在用户调用某个api接口时,如果服务器返回操作未被授权,则触发该回调协议接口,由第三方决定是否跳转到增量授权页面,让用户重新授权。 
    83.  * \param tencentOAuth 登录授权对象。 
    84.  * \param permissions 需增量授权的权限列表。 
    85.  * \return 是否仍然回调返回原始的api请求结果。 
    86.  * \note 不实现该协议接口则默认为不开启增量授权流程。若需要增量授权请调用\ref TencentOAuth#incrAuthWithPermissions: \n注意:增量授权时用户可能会修改登录的帐号 
    87.  */  
    88. - (BOOL)tencentNeedPerformIncrAuth:(TencentOAuth *)tencentOAuth withPermissions:(NSArray *)permissions{  
    89.       
    90.     // incrAuthWithPermissions是增量授权时需要调用的登录接口  
    91.     // permissions是需要增量授权的权限列表  
    92.     [tencentOAuth incrAuthWithPermissions:permissions];  
    93.     return NO// 返回NO表明不需要再回传未授权API接口的原始请求结果;  
    94.     // 否则可以返回YES  
    95. }  
    96.   
    97. /** 
    98.  * [该逻辑未实现]因token失效而需要执行重新登录授权。在用户调用某个api接口时,如果服务器返回token失效,则触发该回调协议接口,由第三方决定是否跳转到登录授权页面,让用户重新授权。 
    99.  * \param tencentOAuth 登录授权对象。 
    100.  * \return 是否仍然回调返回原始的api请求结果。 
    101.  * \note 不实现该协议接口则默认为不开启重新登录授权流程。若需要重新登录授权请调用\ref TencentOAuth#reauthorizeWithPermissions: \n注意:重新登录授权时用户可能会修改登录的帐号 
    102.  */  
    103. - (BOOL)tencentNeedPerformReAuth:(TencentOAuth *)tencentOAuth{  
    104.     return YES;  
    105. }  
    106.   
    107. /** 
    108.  * 用户通过增量授权流程重新授权登录,token及有效期限等信息已被更新。 
    109.  * \param tencentOAuth token及有效期限等信息更新后的授权实例对象 
    110.  * \note 第三方应用需更新已保存的token及有效期限等信息。 
    111.  */  
    112. - (void)tencentDidUpdate:(TencentOAuth *)tencentOAuth{  
    113.     NSLog(@"增量授权完成");  
    114.     if (tencentOAuth.accessToken  
    115.         && 0 != [tencentOAuth.accessToken length])  
    116.     { // 在这里第三方应用需要更新自己维护的token及有效期限等信息  
    117.         // **务必在这里检查用户的openid是否有变更,变更需重新拉取用户的资料等信息** _labelAccessToken.text = tencentOAuth.accessToken;  
    118.     }  
    119.     else  
    120.     {  
    121.         NSLog(@"增量授权不成功,没有获取accesstoken");  
    122.     }  
    123.   
    124. }  
    125.   
    126. /** 
    127.  * 用户增量授权过程中因取消或网络问题导致授权失败 
    128.  * \param reason 授权失败原因,具体失败原因参见sdkdef.h文件中\ref UpdateFailType 
    129.  */  
    130. - (void)tencentFailedUpdate:(UpdateFailType)reason{  
    131.       
    132.     switch (reason)  
    133.     {  
    134.         case kUpdateFailNetwork:  
    135.         {  
    136.             //            _labelTitle.text=@"增量授权失败,无网络连接,请设置网络";  
    137.             NSLog(@"增量授权失败,无网络连接,请设置网络");  
    138.             break;  
    139.         }  
    140.         case kUpdateFailUserCancel:  
    141.         {  
    142.             //            _labelTitle.text=@"增量授权失败,用户取消授权";  
    143.             NSLog(@"增量授权失败,用户取消授权");  
    144.             break;  
    145.         }  
    146.         case kUpdateFailUnknown:  
    147.         default:  
    148.         {  
    149.             NSLog(@"增量授权失败,未知错误");  
    150.             break;  
    151.         }  
    152.     }  
    153.   
    154.       
    155. }  
    156.   
    157. /** 
    158.  * 获取用户个人信息回调 
    159.  * \param response API返回结果,具体定义参见sdkdef.h文件中\ref APIResponse 
    160.  * \remarks 正确返回示例: \snippet example/getUserInfoResponse.exp success 
    161.  *          错误返回示例: \snippet example/getUserInfoResponse.exp fail 
    162.  */  
    163. - (void)getUserInfoResponse:(APIResponse*) response{  
    164.     NSLog(@" response %@",response);  
    165. }  
    166.   
    167. - (void)didReceiveMemoryWarning {  
    168.     [super didReceiveMemoryWarning];  
    169.     // Dispose of any resources that can be recreated.  
    170. }  
    171.   
    172. @end  
    展开全文
  • 安卓QQ登录第三方详解

    千次阅读 热门讨论 2018-10-20 19:20:14
    前言:以前做登录时都是使用mob等第三方平台,后来看见腾讯自己的SDK实现起来也非常的简介,以此做记录。 1、效果图: 登录前: 登录后: 2、腾讯SDK下载链接: http://wiki.open.qq.com/wiki/mobile/SDK下载 ...

    前言:以前做登录时都是使用mob等第三方平台,后来看见腾讯自己的SDK实现起来也非常的简介,以此做记录。

    1、效果图:
    登录前:
    在这里插入图片描述

    登录后:
    在这里插入图片描述

    2、腾讯SDK下载链接:

    http://wiki.open.qq.com/wiki/mobile/SDK下载
    在这里插入图片描述

    解压后依次打开opensdk_lite+demo>libs,找到open_sdk_r6008_lite.jar
    并复制到如下图目录下,并右键Add As Library
    在这里插入图片描述

    腾讯QQ APP ID的获取 注册网址:https://open.tencent.com/
    点开管理中心找到即可(应用不需要审核上架)
    在这里插入图片描述

    3、登录界面

    public class TestActivity extends AppCompatActivity {
    
        private static final String TAG = "TestActivity";
        //QQ包名
        private static final String PACKAGE_QQ = "com.tencent.mobileqq";
        //微信包名
        private static final String PACKAGE_WEIXIN = "com.tencent.mm";
        //新浪微博包名
        private static final String PACKAGE_WEIBO = "com.sina.weibo";
    
        //展示个人信息
        private TextView infoText, infoName;
        private ImageView infoIcon;
        //初始化腾讯服务
        private Tencent mTencent;
    
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_test);
    
            //腾讯AppId(替换你自己App Id)、上下文
            mTencent = Tencent.createInstance("1107123456", this);
    
            infoText = this.findViewById(R.id.text_info);
            infoIcon = this.findViewById(R.id.info_icon);
            infoName = this.findViewById(R.id.info_name);
            //登录点击事件
            findViewById(R.id.button_login).setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    //注意:此段非必要,如果手机未安装应用则会跳转网页进行授权
                    if (!hasApp(TestActivity.this, PACKAGE_QQ)) {
                        Toast.makeText(TestActivity.this, "未安装QQ应用",
                                Toast.LENGTH_SHORT).show();
                        return;
                    }
                    //如果session无效,就开始做登录操作
                    if (!mTencent.isSessionValid()) {
                        loginQQ();
                    }
                }
            });
        }
    
        /**
         * QQ登录
         */
        private IUiListener listener;
    
        private void loginQQ() {
            listener = new IUiListener() {
                @Override
                public void onComplete(Object object) {
    
                    Log.e(TAG, "登录成功: " + object.toString() );
    
                    JSONObject jsonObject = (JSONObject) object;
                    try {
                        //得到token、expires、openId等参数
                        String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);
                        String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);
                        String openId = jsonObject.getString(Constants.PARAM_OPEN_ID);
    
                        mTencent.setAccessToken(token, expires);
                        mTencent.setOpenId(openId);
                        Log.e(TAG, "token: " + token);
                        Log.e(TAG, "expires: " + expires);
                        Log.e(TAG, "openId: " + openId);
    
                        //获取个人信息
                        getQQInfo();
                    } catch (Exception e) {
                    }
                }
    
                @Override
                public void onError(UiError uiError) {
                    //登录失败
                    Log.e(TAG, "登录失败" + uiError.errorDetail);
                    Log.e(TAG, "登录失败" + uiError.errorMessage);
                    Log.e(TAG, "登录失败" + uiError.errorCode + "");
    
                }
    
                @Override
                public void onCancel() {
                    //登录取消
                    Log.e(TAG, "登录取消");
    
                }
            };
            //context上下文、第二个参数SCOPO 是一个String类型的字符串,表示一些权限
            //应用需要获得权限,由“,”分隔。例如:SCOPE = “get_user_info,add_t”;所有权限用“all”
            //第三个参数事件监听器
            mTencent.login(this, "all", listener);
            //注销登录
            //mTencent.logout(this);
        }
    
        /**
         * 获取QQ个人信息
         */
        private void getQQInfo() {
            //获取基本信息
            QQToken qqToken = mTencent.getQQToken();
            UserInfo info = new UserInfo(this, qqToken);
            info.getUserInfo(new IUiListener() {
                @Override
                public void onComplete(Object object) {
                    try {
                        Log.e(TAG, "个人信息:" + object.toString());
                        infoText.setText(object.toString());
                        //头像
                        String avatar = ((JSONObject) object).getString("figureurl_2");
                        GlideUtils.showGlide(TestActivity.this, avatar, infoIcon);
                        String nickName = ((JSONObject) object).getString("nickname");
                        infoName.setText(nickName);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }
                }
    
                @Override
                public void onError(UiError uiError) {
                }
    
                @Override
                public void onCancel() {
                }
            });
        }
    
        /**
         * 回调必不可少,官方文档未说明
         */
        @Override
        protected void onActivityResult(int requestCode, int resultCode, Intent data) {
            super.onActivityResult(requestCode, resultCode, data);
            //腾讯QQ回调
            Tencent.onActivityResultData(requestCode, resultCode, data, listener);
            if (requestCode == Constants.REQUEST_API) {
                if (resultCode == Constants.REQUEST_LOGIN) {
                    Tencent.handleResultData(data, listener);
                }
            }
        }
    
        /**
         * true 安装了相应包名的app
         */
        private boolean hasApp(Context context, String packName) {
            boolean is = false;
            List<PackageInfo> packages = context.getPackageManager()
                    .getInstalledPackages(0);
            for (int i = 0; i < packages.size(); i++) {
                PackageInfo packageInfo = packages.get(i);
                String packageName = packageInfo.packageName;
                if (packageName.equals(packName)) {
                    is = true;
                }
            }
            return is;
        }
    }
    
    

    对应布局文件

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_horizontal"
        android:orientation="vertical"
        android:padding="10dp"
        tools:context=".activity.TestActivity">
    
        <ImageView
            android:id="@+id/info_icon"
            android:src="@mipmap/ic_launcher"
            android:layout_width="150dp"
            android:layout_height="150dp" />
    
        <TextView
            android:gravity="center"
            android:id="@+id/info_name"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp" />
    
        <TextView
            android:layout_marginBottom="10dp"
            android:layout_marginTop="10dp"
            android:id="@+id/text_info"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="14sp" />
    
        <Button
            android:id="@+id/button_login"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="QQ登录" />
    </LinearLayout>
    

    4、扩展:代码中图片加载框架

        //图片加载
        implementation 'com.github.bumptech.glide:glide:4.7.1'
    

    格式化个人信息:网址:https://www.bejson.com/

    在这里插入图片描述

    展开全文
  • Android实现QQ登录

    2020-09-03 11:26:32
    1:进入QQ官网搭建环境 ...2:点击登录按钮拉取QQ mTencent = Tencent.createInstance("官网创建项目的id", LoginActivity.this); case R.id.img_qq://QQ登录 if (!mTencent.isSessionValid()) { mTencent.login(Lo
  • QQ登录界面实现

    2020-09-08 07:51:15
    Java实现QQ登录界面 QQ登录界面也是界面的一种,在实现界面时我们需要一些界面开发包,如: package – 一个项目中给代码分类 系统库: java.awt – 早期的界面开发包 保留使用元素类 javax.swing – 升级之后的...
  • 腾讯开放平台实现QQ登录

    千次阅读 2018-04-27 07:52:10
    现在的第三方登录很普遍如QQ,微博,微信,今天我们就来实现如何接入QQ登录到我们的项目中 要想使用QQ登录我们需要到腾讯开放平台注册账号获取开发者资格地址:http://open.qq.com/ 注册完成后点击我们右上角的...
  • 网站实现QQ登录功能

    千次阅读 2017-12-31 23:37:21
    一般网站要先做个用户注册的功能页面,但我的网站名气不大,不需要要求用户注册,所以直接使用... 如何使用JS_SDK让网站拥有QQ登录的功能,官网的这篇文章写得还算完整:http://connect.qq.com/intro/login/jss
  • QQ空间登录

    2020-07-25 23:33:35
    实测可用,内含滑块验证算法,还不错的源码。
  • 今天就来研究一下QQ登录API的使用。  首先说一下,腾讯提供了许多个的开放平台。差不多每个大的产品都提供了开放平台,比如微信、QQ邮箱,财付通等。这里面有2个比较易混的,一个是QQ互联,一个是腾讯开发平台。...
  • PHP调用QQ互联接口实现QQ登录网站

    千次阅读 2018-07-28 19:57:52
    调用QQ登录接口,首先要到QQ互联完善开发者认证信息,并通过审核,然后创建一个网站应用,获得APP ID和APP Key,通过审核后即可调用基本接口get_user_info(获得用户信息),实现QQ登录网站功能。 废话不多,上...
  • 移动应用接入网页QQ登录

    千次阅读 2018-10-23 14:07:17
    移动应用接入网页QQ登录 在以前应用接入 Android/IOS SDK 后, 如果用户手机没有安装客户端 , 可以直接使用网页授权登录.但是现在腾讯关闭了网页授权登录,转为提示用户.这样的体验很不好! 但是发现 QQ 音乐 、QQ...
  • 使用JSSDK实现网站的QQ登录

    千次阅读 2018-01-07 23:48:06
    使用JSSDK实现网站的QQ登录 进入QQ互联官网:https://connect.qq.com/index.html 进行开发者注册并审核认证【实名认证】:首先使用QQ账号登录上述的QQ互联官网;接着填写开发者审核认证资料,需提交:开发者类型...
  • 移动 App 接入 QQ 登录/分享流程

    万次阅读 2018-09-29 19:45:35
    移动 App 接入 QQ 登录/支付流程 这里先要提两个平台,腾讯开放平台和 QQ 互联平台: (一)腾讯开放平台 官网地址:https://open.tencent.com/ 介绍:腾讯开放平台是腾讯对开发者公开的一个服务平台,腾讯...
  • 网站接入QQ登录(java sdk版)

    千次阅读 2018-10-28 00:10:36
    网站接入qq登录详细教程: 到qq互联平台(https://connect.qq.com/)申请开发者资格,提交资料等待审核通过(必须) 在应用管理界面创建应用,填写网站信息,因为只是测试,所以此处信息可以随便写 注意,网站回...
  • 第三方登录(QQ登录)开发流程详解

    万次阅读 2017-03-06 11:36:12
    第三方登录(QQ登录)开发流程详解  近排由于工作的繁忙,已经一个星期没写博文做分享了,接下来我对网站接入第三方登录----QQ登录的实现逻辑做一个详细的讲解。  对于整个流程的详细文档可以到QQ互联...
  • 安卓应用调用QQ登录接口

    千次阅读 2018-11-01 21:52:42
    安卓应用调用QQ登录接口 注册成为开发者并提交APP审核 先在QQ互联网站注册成为开发者,进行邮箱验证 此时你填写完信息后只是保存到腾讯服务器了,而没有提交审核,你个人信息状态显示未提交审核,提交审核,并等待...
  • android QQ登录与分享

    千次阅读 2018-04-11 10:44:20
    android QQ登录与分享 android QQ登录与分享是我们一个很常见的功能,除了微信登录、QQ登录、还有微博登录,外加上分享,今天就分享一下android的QQ分享与登录,我这里H5开发的和webview配合使用场景,不过就算是...
  • MVC模式(简单模拟QQ登录界面)

    千次阅读 2017-06-03 15:45:12
    QQ登录界面有这样一个选项:记住账号. 这个账号保存在本地的配置文件中,下次登录的时候,用户就不需要重新输入密码, 那么这个功能是如何实现的呢?下面用C#给出模拟功能的实现,旨在阐述一个重要的设计模式: MVC...
1 2 3 4 5 ... 20
收藏数 158,925
精华内容 63,570
关键字:

qq登录