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