android接入原生第三方登錄(微信登錄、QQ登錄、新浪微博登錄)

JSON和HTTP 開源框架使用:Fastjson 和Aysnc-Http


第一步:去對應的平臺上註冊app的相關信息,這一步,可參考我的另外一個篇,關於加入親加通訊雲的文章

    各個平臺註冊應用信息的地址如下:
               新浪微博                 http://open.weibo.com
               騰訊微博                 http://dev.t.qq.com
               QQ空間                      http://connect.qq.com/intro/login/
               微信好友                 http://open.weixin.qq.com
               Facebook      https://developers.facebook.com
               Twitter       https://dev.twitter.com
               人人網                      http://dev.renren.com
               開心網                      http://open.kaixin001.com
               搜狐微博                 http://open.t.sohu.com
               網易微博                 http://open.t.163.com
               豆瓣                           http://developers.douban.com
               有道雲筆記            http://note.youdao.com/open/developguide.html#app
               印象筆記                 https://dev.evernote.com/
               Linkedin      https://www.linkedin.com/secure/developer?newapp=
               FourSquare    https://developer.foursquare.com/
               搜狐隨身看            https://open.sohu.com/
               Flickr        http://www.flickr.com/services/
               Pinterest     http://developers.pinterest.com/
               Tumblr        http://www.tumblr.com/developers
               Dropbox       https://www.dropbox.com/developers
               Instagram     http://instagram.com/developer#
               VKontakte     http://vk.com/dev


新浪微博登錄:

主要流程:APP客戶端發起登錄,會回調在WeiboAuthListener 當中,在這裏面我們可以得到UID(身份唯一標識),得到UID之後,再通過UsersAPI.show(UID,RequestListener )來得到用戶的信息,回調在RequestListener 當中。

有些手機沒有安裝新浪微博客戶端,有些則安裝了客戶端,所以爲了統一,我這裏採用的是沒有安裝客戶端的代碼,通過非SSO授權登錄
1. 官網註冊Appkey  (下載jar包,新浪微博的爲一個WeiboSDK的工程)
2、配置XML:在MainFest文件中加入以下代碼片段
  1. <!-- 微博 -->  
  2.   
  3.   
  4. <!-- 必須註冊在微博授權,分享微博時候用到 -->  
  5. <activity  
  6.     android:name"com.sina.weibo.sdk.component.WeiboSdkBrowser"  
  7.     android:configChanges"keyboardHidden|orientation"  
  8.     android:exported"false"  
  9.     android:windowSoftInputMode="adjustResize" >  
  10. </activity >  
  11.   
  12. <service  
  13.     android:name"com.sina.weibo.sdk.net.DownloadService"  
  14.     android:exported"false" >  
  15. </service >  

3、java代碼中登錄
  1. //註冊成功之後的APPKEY  
  2.    public static final String SINA_APPKEY = "2651314935";  
  3.   //註冊成功之後的REDIRECT_URL  
  4.    public static final String SINA_REDIRECT_URL = "https://api.weibo.com/oauth2/default.html" ;  
  5.    public static final String SINA_SCOPE = "all";  
  6.       /** 注意:SsoHandler 僅當 SDK 支持 SSO 時有效 */  
  7.    private SsoHandler mSsoHandler;  
  8.    private AuthInfo mAuthInfo;  
  9.    private Oauth2AccessToken mAccessToken;  
  10.   
  11.    mAuthInfo = new AuthInfo(LoginActivity. this,  
  12.                            APPConstants. SINA_APPKEY, APPConstants.SINA_REDIRECT_URL ,  
  13.                            APPConstants. SINA_SCOPE);  
  14.                 mSsoHandler = new SsoHandler(LoginActivity. this, mAuthInfo);  
  15.                 mSsoHandler.authorize( new AuthListener());  
  16.   
  17.   
  18.   
  19.    /******************************** 微博回調 ***********************************************/  
  20.    /** 
  21.     * 微博認證授權回調類。 1. SSO 授權時,需要在 {@link #onActivityResult} 中調用 
  22.     * {@link SsoHandler#authorizeCallBack} 後, 該回調纔會被執行。 2. 非 SSO 
  23.     * 授權時,當授權結束後,該回調就會被執行。 當授權成功後,請保存該 access_token、expires_in、uid 等信息到 
  24.     * SharedPreferences 中。 
  25.     */  
  26.    public class AuthListener implements WeiboAuthListener {  
  27.   
  28.           @Override  
  29.           public void onComplete(Bundle values) {  
  30.                 // 從 Bundle 中解析 Token  
  31.                 mAccessToken = Oauth2AccessToken.parseAccessToken(values);  
  32.                 if ( mAccessToken.isSessionValid()) {  
  33.                      MyProgressDialog. showDialogWithFalse(LoginActivity.this"登陸",  
  34.                                   "正在獲取用戶信息" );  
  35.                       thirdUser = new ThirdUserInfo();  
  36.                       thirdUser.setThirdID( mAccessToken.getUid());  //mAccessToken.getUid() ,獲取到UID,作爲身份的唯一標示  
  37.                      UsersAPI mUsersAPI = new UsersAPI(LoginActivity.this,APPConstants.SINA_APPKEY , mAccessToken );  
  38.                       long uid = Long.parseLong(mAccessToken.getUid());  
  39.                      mUsersAPI.show(uid, mListener); //獲取用戶基本信息  
  40.                } else {  
  41.                       // 以下幾種情況,您會收到 Code:  
  42.                       // 1. 當您未在平臺上註冊的應用程序的包名與簽名時;  
  43.                       // 2. 當您註冊的應用程序包名與簽名不正確時;  
  44.                       // 3. 當您在平臺上註冊的包名和簽名與您當前測試的應用的包名和簽名不匹配時。  
  45.                       // String code = values.getString("code");  
  46.                }  
  47.          }  
  48.   
  49.           @Override  
  50.           public void onCancel() {  
  51.          }  
  52.   
  53.           @Override  
  54.           public void onWeiboException(WeiboException e) {  
  55.   
  56.          }  
  57.    }  
  58.     
  1. //獲取用戶信息的回調  
  2. private RequestListener mListener = new RequestListener() {  
  3.        @Override  
  4.        public void onComplete(String response) {  
  5.              if (!TextUtils. isEmpty(response)) {  
  6.                    // 調用 User#parse 將JSON串解析成User對象,所有的用戶信息全部在這裏面  
  7.                   User user = User. parse(response);  
  8.                    thirdUser.setNickName(user. name); // 暱稱  
  9.                    thirdUser.setIcon(user. avatar_hd); // 頭像  
  10.                    thirdUser.setGender(user. gender.equals( "m") ? "男" : "女" );  
  11.                   ThirdUserVerify. verifyUser(LoginActivity.this, thirdUser, 2);  
  12.             }  
  13.       }  
  14.   
  15.        @Override  
  16.        public void onWeiboException(WeiboException e) {  
  17.             MyProgressDialog. closeDialog();  
  18.             ErrorInfo info = ErrorInfo. parse(e.getMessage());  
  19.             ToastUtil. showShort(LoginActivity.this, info.toString());  
  20.       }  
  21. };  
  22.   
  23. @Override  
  24. protected void onActivityResult( int requestCode, int resultCode, Intent data) {  
  25.        super.onActivityResult(requestCode, resultCode, data);  
  26.        if ( mSsoHandler != null) {  
  27.              mSsoHandler.authorizeCallBack(requestCode, resultCode, data);  
  28.       }  
  29. }  

微信登錄

先說一下主主要流程:客戶端發起登錄--在WXEntryActivity的onResp(BaseResp arg0)方法中進行回調,會得到一個code.通過這個code調用一個接口獲取到token和OpenID的值,之後再通過token以及openID調用獲取用戶信息的接口-來獲取用戶的數據

1、註冊APPKEY
2、配置xml文件,在MainFest文件中添加以下代碼: 
<!-- 因爲微信的回調是必須寫一個wxapi.WXEntryActivity的類。回調在此類,前面的包名爲項目的包名-->
        <activity  
            android:name= "com.spapa.papapaiming.wxapi.WXEntryActivity" 
            android:exported= "true" />

3、發起登陸 (我在我的application類中,定義了一個static 的 IWXAPI)
  1. BaseApplication. mIwapi = WXAPIFactory.createWXAPI( LoginActivity. this, APPConstants.WX_APPID, true );  
  2.  BaseApplication. mIwapi.registerApp(APPConstants. WX_APPID);  
  3.  SendAuth.Req req = new SendAuth.Req();  
  4.  req. scope = "snsapi_userinfo";  
  5.  req. state = "wechat_sdk_demo_test";  
  6.  BaseApplication. mIwapi.sendReq(req);//執行完畢這句話之後,會在WXEntryActivity回調  


4.WXEntryActivity類(回調類)
  1. public class WXEntryActivity extends Activity implements IWXAPIEventHandler {  
  2.       private Bundle bundle;  
  3.       //這個實體類是我自定義的實體類,用來保存第三方的數據的實體類  
  4.       private ThirdUserInfo info= null;  
  5.       @Override  
  6.       protected void onCreate(Bundle savedInstanceState) {  
  7.              super.onCreate(savedInstanceState);  
  8.             AppManager. getAppManager().addActivity(WXEntryActivity. this);  
  9.             BaseApplication. mIwapi.handleIntent(getIntent(), WXEntryActivity.this);  //必須調用此句話  
  10.       }  
  11.   
  12.       @Override  
  13.       protected void onNewIntent(Intent intent) {  
  14.              super.onNewIntent(intent);  
  15.             BaseApplication. mIwapi.handleIntent(intent, WXEntryActivity.this);//必須調用此句話  
  16.       }  
  17.   
  18.       @Override  
  19.       public void onReq(BaseReq req) {  
  20.             System. out.println();  
  21.       }  
  22.         
  23.         
  24.   
  25.       /** 
  26.       * Title: onResp 
  27.       * 
  28.       *           API:https://open.weixin.qq.com/ cgi- bin/showdocument ?action=dir_list&t=resource/res_list&verify=1&id=open1419317853 &lang=zh_CN 
  29.       * Description:在此處得到Code之後調用https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code 
  30.       *  獲取到token和openID。之後再調用https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID 獲取用戶個人信息 
  31.       *  
  32.       * @param arg0 
  33.       * @see com.tencent.mm.sdk.openapi.IWXAPIEventHandler#onResp(com.tencent.mm.sdk.openapi.BaseResp) 
  34.        */  
  35.       @Override  
  36.       public void onResp(BaseResp arg0) {  
  37.              bundle=getIntent().getExtras();  
  38.             SendAuth.Resp resp = new SendAuth.Resp( bundle);  
  39.           //獲取到code之後,需要調用接口獲取到access_token  
  40.              if (resp. errCode == BaseResp.ErrCode. ERR_OK) {     
  41.                   String code = resp. token;  
  42.                    if(BaseApplication. isWxLogin){  
  43.                         getToken(code);  
  44.                   } else{  
  45.                         WXEntryActivity. this.finish();  
  46.                   }  
  47.             } else{  
  48.                   WXEntryActivity. this.finish();  
  49.             }  
  50.   
  51.       }  
  52.           //這個方法會取得accesstoken  和openID  
  53.       private void getToken(String code){  
  54.             MyProgressDialog. showDialog(WXEntryActivity.this"登陸""正在獲取用戶信息" );  
  55.             HttpBase. get("https://api.weixin.qq.com/sns/oauth2/access_token?appid=wxd7673d08f6c1963d&secret=223d726f966031f30125d0e4e7d4aed3&code=" +code+"&grant_type=authorization_code" , new JsonHttpResponseHandler(){  
  56.                    @Override  
  57.                    public void onSuccess( int statusCode, JSONObject response) {  
  58.                          super.onSuccess(statusCode, response);  
  59.                          info = new ThirdUserInfo();  
  60.                          info.setThirdID(response.optString( "openid"));  
  61.                         getUserInfo(response.optString( "access_token"),response.optString( "openid"));  
  62.                   }  
  63.                    @Override  
  64.                    public void onFailure( int statusCode, Throwable e,  
  65.                               JSONObject errorResponse) {  
  66.                          // TODO Auto-generated method stub  
  67.                          super.onFailure(statusCode, e, errorResponse);  
  68.                         MyProgressDialog. closeDialog();  
  69.                         HttpBase. onFailureTips(WXEntryActivity.this, errorResponse);  
  70.                   }  
  71.             });  
  72.       }  
  73.         
  74.           //獲取到token和openID之後,調用此接口得到身份信息  
  75.       private void getUserInfo(String token,String openID){  
  76.             HttpBase. get("https://api.weixin.qq.com/sns/userinfo?access_token=" +token+"&openid=" +openID, new JsonHttpResponseHandler(){  
  77.                    @Override  
  78.                    public void onSuccess( int statusCode, JSONObject response) {  
  79.                          super.onSuccess(statusCode, response);  
  80.                          info.setNickName(response.optString( "nickname"));  
  81.                          info.setGender(response.optInt( "sex")==1"男""女");  
  82.                          info.setIcon(response.optString( "headimgurl"));  
  83.                         ThirdUserVerify. verifyUser(WXEntryActivity.this, info, 3);  
  84. //                      AppManager.getAppManager().finishActivity(LoginActivity.class);  
  85.                   }  
  86.                    @Override  
  87.                    public void onFailure( int statusCode, Throwable e,  
  88.                               JSONObject errorResponse) {  
  89.                          super.onFailure(statusCode, e, errorResponse);  
  90.                         MyProgressDialog. closeDialog();  
  91.                         HttpBase. onFailureTips(WXEntryActivity.this, errorResponse);  
  92.                   }  
  93.             });  
  94.       }  
  95. }  


QQ登錄

1、註冊APPKEY
2、配置xml文件:
  1.    <!-- QQ -->  
  2. <activity  
  3.     android:name"com.tencent.tauth.AuthActivity"  
  4.     android:launchMode"singleTask"  
  5.     android:noHistory"true" >  
  6.     <intent-filter >  
  7.         <action android:name ="android.intent.action.VIEW" />  
  8.   
  9.         <category android:name ="android.intent.category.DEFAULT" />  
  10.         <category android:name"android.intent.category.BROWSABLE" />  
  11.   
  12.         <data android:scheme ="1104406273" />  
  13.     </intent-filter >  
  14. </activity >  
  15. <activity  
  16.     android:name"com.tencent.connect.common.AssistActivity"  
  17.     android:configChanges="orientation|keyboardHidden|screenSize"  
  18.     android:theme"@android:style/Theme.Translucent.NoTitleBar" />  
  1.   
  1. <span style="white-space:pre">    </span>  
  1.   


  1. //初始化Tencent   
  2. public Tencent mTencent = Tencent.createInstance(APPConstants. QQ_APPID,LoginActivity.this);   
  3.     // QQ發起登陸  
  4.       mTencent.login(LoginActivity. this"all"new IUiListener() {   
  5.   
  6.                                @Override  
  7.                                public void onCancel() {  
  8.                                       
  9.                               }  
  10.   
  11.                                @Override  
  12.                                public void onComplete(Object arg0) {     
  13.                     //登陸成功的回調,在此處可以獲取用戶信息  
  14.                                     MyProgressDialog. showDialogWithFalse(LoginActivity.this"登陸""正在獲取用戶信息" );  
  15.                                     initOpenidAndToken((JSONObject) arg0);  
  16.                                     updateUserInfo();  
  17.                               }  
  18.   
  19.                                @Override  
  20.                                public void onError(UiError arg0) {  
  21.                                       
  22.                               }  
  23.   
  24.                         });  
  25.   
  26. /** 
  27.        * @Title: initOpenidAndToken 
  28.        * @Description: 初始化OPENID以及TOKEN身份驗證。 
  29.        * @param @param jsonObject 
  30.        * @return void 
  31.        * @throws 
  32.        */  
  33.       private void initOpenidAndToken (JSONObject jsonObject) {  
  34.              thirdUser = new ThirdUserInfo();  
  35.              try {  
  36.                   //這裏的Constants類,是 com.tencent.connect.common.Constants類,下面的幾個參數也是固定的  
  37.                   String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN );  
  38.                   String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN );  
  39.         //OPENID,作爲唯一身份標識  
  40.                   String openId = jsonObject.getString(Constants.PARAM_OPEN_ID );    
  41.                    if (!TextUtils. isEmpty(token) && !TextUtils.isEmpty(expires)&& !TextUtils. isEmpty(openId)) {  
  42.                     //設置身份的token  
  43.                          mTencent.setAccessToken(token, expires);    
  44.                          mTencent.setOpenId(openId);  
  45.                          thirdUser.setThirdID(openId);  
  46.                   }  
  47.                   } catch (Exception e) {  
  48.             }  
  49.       }  
  50.   
  51.       /** 
  52.        * @Title: updateUserInfo 
  53.        * @Description: 在回調裏面可以獲取用戶信息數據了 
  54.        * @param 
  55.        * @return void 
  56.        * @throws 
  57.        */  
  58.       private void updateUserInfo() {  
  59.              if ( mTencent != null && mTencent.isSessionValid()) {  
  60.                    UserInfo mInfo = new UserInfo(LoginActivity. this,  mTencent.getQQToken());  
  61.                   mInfo.getUserInfo(listener);  
  62.                   IUiListener listener = new IUiListener() {  
  63.   
  64.                          @Override  
  65.                          public void onError(UiError e) {  
  66.                               MyProgressDialog. closeDialog();  
  67.                         }  
  68.   
  69.                          // 用戶的信息回調在此處  
  70.                          @Override  
  71.                          public void onComplete( final Object response) {  
  72.                                // 返回Bitmap對象。  
  73.                                try {  
  74.                                     JSONObject obj = new JSONObject(response.toString());  
  75.                                      thirdUser.setNickName(obj.optString( "nickname"));  
  76.                                      thirdUser.setIcon(obj.optString( "figureurl_qq_2"));  
  77.                                      thirdUser.setGender(obj.optString( "gender"));  
  78.                                     ThirdUserVerify. verifyUser(LoginActivity.this,thirdUser, 1);  
  79.                               } catch (JSONException e) {  
  80.                                     e.printStackTrace();  
  81.                               }  
  82.                         }  
  83.   
  84.                          @Override  
  85.                          public void onCancel() {  
  86.                               MyProgressDialog. closeDialog();  
  87.                         }  
  88.                   };  
  89.            
  90.             }  
  91.       } 

發佈了11 篇原創文章 · 獲贊 4 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章