ShareSDK第三方登录获取QQ和微信的unionid ShareSDK 退出第三方登录和登录分享里面的一些注意事项


https://blog.csdn.net/github_2011/article/details/54316008

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/github_2011/article/details/54316008
 
  
 
  
 
  
 
  
 
  
unionid 
的获取
 
  
unionid 
的获取很简单 
:
 
  
 
  
 
  
 
  
String unionid = 
 
  
weChat
.getDb().get("unionid");
 
  
 
  
 
  
unionid 
的获取
 
  
unionid
, 其实 QQ 也有
 
  
 
  
 
  
 
  
qq
.getDb().exportData();//获取到db里面所有的内容
我们下面来看看,exportData里面都有什么内容:
 
  


其实exportData是一个json数据,格式化后如下图所示:

 

我们发现里面并没有unionid,那我们怎么获得QQ的unionid呢 ?

天无绝人之路,有一个接口可以获取QQ的unionid,需要QQ的token作为参数,token我们是可以拿到的,上图选中的就是token

 

  • 接口:
  • https://graph.qq.com/oauth2.0/me  
  • 请求方式:GET  
  • 请求参数:  
  • access_token QQ的token  
  • unionid 传1即可

代码如下 :

/**

     * 获取QQ的unionid

     * @param plat

     */

    private void getQQUnionid(Platform plat) {

        Request request = new Request(Request.Method.GET, "https://graph.qq.com/oauth2.0/me?access_token=" + plat.getDb().getToken() + "&unionid=1", new Response.ErrorListener() {

            @Override

            public void onErrorResponse(VolleyError error) {}}) {

            @Override

            protected Response parseNetworkResponse(NetworkResponse response) {

                byte[] data = response.data;

                String s = new String(data);

 

                String[] split = s.split(":");

                s = split[split.length - 1];

                split = s.split("\"");

                s = split[1];

                unionid = s;

                return Response.success(s, HttpHeaderParser.parseCacheHeaders(response));

            }

            @Override

            protected void deliverResponse(Object response) {

            }

            @Override

            public int compareTo(Object another) {

                return 0;

            }

        };

        NetworkManager.addRequest(request);

    }

通过 String s = new String(data);

我们可以得到返回的字符串信息如下:

返回的并不是json数据,但幸运的是里面有unionid,我通过字符串切割的方法把它取了出来。

--------------------- 

作者:github_2011 

来源:CSDN 

原文:https://blog.csdn.net/github_2011/article/details/54316008 

版权声明:本文为博主原创文章,转载请附上博文链接!

 

ShareSDK 退出第三方登录和登录分享里面的一些注意事项

https://www.jianshu.com/p/895b94f8da0d

2018.8.17 微信登录时,授权一次过后会返回refresh_token ,为用户授权第三方应用的长效凭证,refresh_token拥有较长的有效期(30天),当refresh_token失效的后,需要用户重新授权。期间就算是取消授权(用ShareSDK提供的取消授权)也不会出现确定授权界面而是会直接返回用户信息。

这几天在做有关第三方登录和分享相关的内容,然后出现了各种问题有一些网上可以解决,但是有一个怎么也没有查到。

这儿我遇到最大的问题是 怎样让用户在登录第三方后退出,也就是用户每一次第三方登录都能到授权界面!

其实就一句代码就能实现,就是取消分享平台的授权。其中后面的参数是平台类型。

这儿是退出QQ第三方登陆


[ShareSDK cancelAuthorize:SSDKPlatformTypeQQ]; 

给效果图,程序还在编写阶段所以很丑不要介意。


 
退出登录GIF.gif

其中我点击登录过后再点击退出,就会再次进入授权界面。如果点击退出再点击登录就会直接返回用户信息给我,这与我们的需求是不同的。

这儿我们通常结合[ShareSDK hasAuthorized:SSDKPlatformTypeQQ],来判断用户是否退出第三方登录。

比如:判断QQ是否退出第三方登录


[ShareSDK cancelAuthorize:SSDKPlatformTypeQQ];

BOOL isAuthorizedWithQQ = [ShareSDK hasAuthorized:SSDKPlatformTypeQQ]; if (!isAuthorizedWithQQ) { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"退出成功" message:@"" preferredStyle: UIAlertControllerStyleAlert]; UIAlertAction *a = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { }]; [alert addAction:a]; [self presentViewController:alert animated:true completion:nil]; } else { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"退出失败" message:@"" preferredStyle: UIAlertControllerStyleAlert]; UIAlertAction *a = [UIAlertAction actionWithTitle:@"取消" style:UIAlertActionStyleDestructive handler:^(UIAlertAction * _Nonnull action) { }]; [alert addAction:a]; [self presentViewController:alert animated:true completion:nil]; } 

根据返回的BooL进行判断

其实我们想要同样的效果 可以在调起第三方登录的时候,取消响应平台的授权再调起第三方登录。这时候就会想退出登录怎么办,我们用第三方的话只是给用户一个快捷登录注册一个接口,我们自己的后台服务器同样也有用户的数据。我们只需要把自己后台服务器登录状态改为未登录状态。
效果图……

 
微信第三方登录.gif

调起的时候

[ShareSDK cancelAuthorize:SSDKPlatformTypeWechat]; //这儿就是取消授权 [ShareSDK getUserInfo:SSDKPlatformTypeWechat onStateChanged:^(SSDKResponseState state, SSDKUser *user, NSError *error) { if (state == SSDKResponseStateSuccess) { //获取用户的信息 (可以上传到自己后台服务器上/本地缓存) } }]; 

退出登录

CHECK_NETWORK_STATUS 
REFRESHSATR 
NSDictionary *dic = @{@"id":USERID,@"type":@"1"}; //我这儿就是自己的后台退出登录 [NetworkingRequest POST:LOGOUT_URL parameters:dic sucess:^(id responseObject) { REFRESHSTOP if ([responseObject[@"code"] integerValue] == 1) { PRMOPT(@"退出登陆成功"); LOGOUT; [[NSNotificationCenter defaultCenter]postNotificationName:@"logOut" object:nil]; BACK; } if ([responseObject[@"code"] integerValue] == 106) { PRMOPT(@"退出登陆失败"); } } failure:^(NSError *error) { REFRESHSTOP if (error.code == -1001) { PRMOPT(@"请求超时"); return ; } if (error.code == - 1004 ){ PRMOPT(@"服务器连接失败"); return; } PRMOPT(@"退出登陆失败"); }]; 

我们在配置QQ的第三方登陆和分享URL Schemes的时候,容易犯了一个小错误。

QQ登陆的Schemes是以tencent + APPId 这儿的Id是你在QQ开发者平台上申请的。

而QQ分享时Schemes 却需要QQ+转换成16进制的APPId。

而其他的好像就没有 比如微博就是wb + APPId

当然微信直接就是申请的APPId



作者:吃货_X
链接:https://www.jianshu.com/p/895b94f8da0d
來源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM