前言:
對於大多數的APP都有第三方登陸這個功能,本身也作過幾回,最近又有一個新項目用到了第三方登陸,因此特地總結了一下關於第三方登陸的實現,並拿出來與你們一同分享;html
各大開放平臺註冊帳戶獲取AppKey和AppSecret
Mob開放平臺地址:http://www.mob.com/#/index
QQ開放平臺地址:http://open.qq.com/
新浪微博開放平臺地址:http://open.weibo.com/
微信開放平臺地址:https://open.weixin.qq.com/
百度開放平臺地址:http://apps.bdimg.com/android
注:
1、關於各大開放平臺的開發者用戶註冊和建立應用獲取AppKey、AppSecret我就很少說了,對於你們來講這都so easy;
2、Eclipse在建立應用填寫包名應該是manifest裏面的packpage:
studio的則是build.gradle裏面的applicationId:
通常狀況下,studio的applicationId和manifest下的包名是一致的,可是applicationId是手動改變的,因此注意在建立應用的時候,要使用applicationId。json
新浪微博第三方登陸實現:api
在作新浪微博第三方登陸的時候,參考他們的api文檔,感受他們的api文檔寫的特別的亂,而且下載的Demo運行還報錯,以致於浪費了我大半天的時間,去網上搜了幾篇關於第三方登陸的文章,寫的並不全,時代也比較久遠,而且基本沒有相關Demo下載,有的就是拷貝的新浪微博的開放平臺的原文,我也是醉了…..
因爲時間比較緊迫,因此並無再繼續深究下去。你們應該都知道有許多平臺把例如分享、登陸等功能集成好了,實現功能十分簡單,這一次我是利用的Mob移動開發平臺http://www.mob.com/#/index 實現的新浪微博第三方登陸,感受還不錯實現起來比較簡單。服務器
1、下載Mob平臺的SDK
首先下載SDK,獲得咱們須要的資源微信
SDK地址(http://www.mob.com/#/downloadDetail/ShareSDK/android),下載下來發現沒法解壓(大家能夠試一下),聯繫他們客服,他們說:上傳錯誤,就給我發了一個。我把它和個人Dmeo放在一塊兒,可供下載。
找到ShareSDK for Android包下的QuickIntegrater.jar文件雙擊:
感受還不錯,各大平臺都有,只須要選擇新浪微博就能夠(我感受仍是沒包裝過的比較好,因此另外三種登陸方式沒采用這種方法),解壓以後生成一個Sample文件:
咱們須要把裏面的東西所有拿到咱們的studio項目中,libs、res和src裏面的所有拷貝複製就能夠,studio新建assets的方法和Eclipse不同,因此給你們發個圖:
點擊建立就能夠了,再把assets下的ShareSDK.xml拷貝就去;網絡
其次配置ShareSDK
把ShareSDK拷貝進去以後,咱們須要把ShareSDK.xml文件中關於Mob(ShareSDK)和新浪微博(SinaWeibo)的Appkey、AppSecret和RedirectUrl替換成咱們申請的值,以下圖:
app
把紅箭頭中的ShareSDK中的AppKey換成咱們在Mob後臺申請的AppKey;
紅框框中的SinaWeibo中的AppKey、AppSecret和RedirectUrl換成咱們在新浪微博後臺申請的對應的值;
RedirectUrl這個字段的值就是咱們後臺項目中的應用信息——>高級信息——>OAuth2.0 受權設置中的受權回調頁這個字段,須要咱們填寫一個有效的地址就能夠,例以下圖:ide
注:若是RedirectUrl這個字段不填或填寫不對會報如下錯誤:
測試
2、配置AndroidManifest.xml
添加activity信息
首先是Mob的受權,在程序的入口處添加受權代碼:
//Mob平臺受權 ShareSDK.initSDK(this);
其次直接調用thirdSinaLogin()方法就能夠了:
//-----------------------------------------------------新浪微博受權相關-------------- /** 新浪微博受權、獲取用戶信息頁面 */ private void thirdSinaLogin() { //初始化新浪平臺 Platform pf = ShareSDK.getPlatform(MainActivity.this, SinaWeibo.NAME); pf.SSOSetting(true); //設置監聽 pf.setPlatformActionListener(MainActivity.this); //獲取登錄用戶的信息,若是沒有受權,會先受權,而後獲取用戶信息 pf.authorize(); } /** 新浪微博受權成功回調頁面 */ @Override public void onComplete(Platform platform, int action, HashMap<String, Object> hashMap) { /** res是返回的數據,例如showUser(null),返回用戶信息,對其解析就行 * http://sharesdk.cn/androidDoc/cn/sharesdk/framework/PlatformActionListener.html * */ Message msg = new Message(); msg.what = MSG_ACTION_CCALLBACK; msg.arg1 = 1; msg.arg2 = action; msg.obj = platform; UIHandler.sendMessage(msg, this); } /** 取消受權 */ @Override public void onCancel(Platform platform, int action) { Message msg = new Message(); msg.what = MSG_ACTION_CCALLBACK; msg.arg1 = 3; msg.arg2 = action; msg.obj = platform; UIHandler.sendMessage(msg, this); } /** 受權失敗 */ @Override public void onError(Platform platform, int action, Throwable t) { t.printStackTrace(); t.getMessage(); Message msg = new Message(); msg.what = MSG_ACTION_CCALLBACK; msg.arg1 = 2; msg.arg2 = action; msg.obj = t; UIHandler.sendMessage(msg, this); } @Override public boolean handleMessage(Message msg) { switch(msg.what) { case MSG_TOAST: { String text = String.valueOf(msg.obj); Toast.makeText(MainActivity.this, text, Toast.LENGTH_SHORT).show(); } break; case MSG_ACTION_CCALLBACK: { switch (msg.arg1) { case 1: { // 成功, successful notification //受權成功後,獲取用戶信息,要本身解析,看看oncomplete裏面的註釋 //ShareSDK只保存如下這幾個通用值 Platform pf = ShareSDK.getPlatform(MainActivity.this, SinaWeibo.NAME); Log.e("sharesdk use_id", pf.getDb().getUserId()); //獲取用戶id Log.e("sharesdk use_name", pf.getDb().getUserName());//獲取用戶名稱 Log.e("sharesdk use_icon", pf.getDb().getUserIcon());//獲取用戶頭像 mThirdLoginResult.setText("受權成功"+"\n"+"用戶id:" + pf.getDb().getUserId() + "\n" + "獲取用戶名稱" + pf.getDb().getUserName() + "\n" + "獲取用戶頭像" + pf.getDb().getUserIcon()); //mPf.author()這個方法每一次都會調用受權,出現受權界面 //若是要刪除受權信息,從新受權 //mPf.getDb().removeAccount(); //調用後,用戶就得從新受權,不然下一次就不用受權 } break; case 2: { mThirdLoginResult.setText("登陸失敗"); } break; case 3: { // 取消, cancel notification mThirdLoginResult.setText("取消受權"); } break; } } break; case MSG_CANCEL_NOTIFY: { NotificationManager nm = (NotificationManager) msg.obj; if (nm != null) { nm.cancel(msg.arg1); } } break; } return false; }
最後退出登陸
Platform mPf = ShareSDK.getPlatform(MainActivity.this, SinaWeibo.NAME); //若是要刪除受權信息,從新受權 mPf.getDb().removeAccount();
到這裏關於新浪微博第三方登陸的就基本結束了,咱們獲取到了用戶的id、暱稱、頭像地址等信息,使用惟一值id再結合本身服務器的接口,即可實現第三方登陸了.效果圖以下:
注意:若是你想修改受權的登陸頁面,能夠參考
這個連接裏面的第11條
QQ第三方登陸實現:
注意
1、我不建議你們去看QQ開放平臺關於獲取我的信息那部分的文檔,由於他們的文檔已通過時了,我當時按照文檔作過,可是一直報錯,後來問客服,他告訴我他們的文檔它久遠了,已經不能用了<當時我就醉了、、>,而是給了我一份Demo,我會把Demo放在裏面供你們下載。
2、你們使用的測試機必定要是自動獲取的網絡時間,不然得不到信息,而且也沒有錯誤信息,我研究了半天的時間,也沒找到到底爲何,一問客服才知道,服務器時間和請求時間戳要相同才能夠<我又是醉了、、、>。
3、你們要打包APP再進行測試。
QQ第三方登陸的步驟分爲:
1.先登陸成功獲取token和openid
2.再經過token和openid獲取用戶的信息。
1、導入SDK的jar文件
把這兩個jar文件導入項目中
2、配置AndroidManifest
3、添加代碼
首先在程序入口添加:
剩下的調用loginQQ方法即可以:
代碼有註釋,你們看一下應該很容易明白。
QQ能夠得到如下相關信息:
你們只要response.getString(「字段名」)就能夠獲得數據了:
{ "is_yellow_year_vip": "0", "ret": 0, "figureurl_qq_1": "http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/40", "figureurl_qq_2": "http://q.qlogo.cn/qqapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100", "nickname": "小羅", "yellow_vip_level": "0", "msg": "", "figureurl_1": "http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/50", "vip": "0", "level": "0", "figureurl_2": "http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/100", "is_yellow_vip": "0", "gender": "男", "figureurl": "http://qzapp.qlogo.cn/qzapp/222222/8C75BBE3DC6B0E9A64BD31449A3C8CB0/30" }
最後退出登陸:
mTencent.logout(this);
給你們看一下截圖:
微信第三方登陸
微信平臺仍是作得挺不錯的,你們能夠看一下他們的文檔,只不過咱們須要本身寫網絡請求(衰衰衰衰衰)
微信第三方登陸分爲:
1.獲取code
2.根據code獲取token
3.根據token獲取用戶信息
在第2、三步須要咱們本身去寫網絡請求,我也是醉了。。。。
1、導入SDK的libammsdk.jar文件,我就很少說了
2、配置AndroidManifest
在你的build.gradle的applicationId相應目錄下新建一個wxapi目錄,在該wxapi目錄下新增一個WXEntryActivity類,該類繼承自Activity(例如應用程序build.gradle的applicationId爲com.aohuan.jinghai_lifee,則新添加的類以下圖所示)
並在manifest文件裏面加上exported屬性,設置爲true,例如:
<activity android:name="com.aohuan.jinghai_lifee.wxapi.WXEntryActivity" android:exported="true" android:label="@string/app_name" > </activity>
3、添加代碼
/** -------------------------微信第三方登陸---------------------- */ /** * * 微信平臺應用受權登陸接入代碼示例 * * */ private void regToWx(){ // 經過WXAPIFactory工廠,得到IWXAPI的實例 api = WXAPIFactory.createWXAPI(MainActivity.this, AllApk.WEIXIN_APP_ID, true); // 將應用的appid註冊到微信 api.registerApp(AllApk.WEIXIN_APP_ID); } //獲取微信訪問getCode private void getCode(){ final SendAuth.Req req = new SendAuth.Req(); req.scope = "snsapi_userinfo"; req.state = "carjob_wx_login"; api.sendReq(req); } /** -------------------------微信第三方登陸結束-------------------- */
首先在onCreate()方法裏面調用regToWx()方法實現微信平臺的註冊;
其次第一步獲取code
調用getCode()方法發送獲取code的請求,接受code則是在WXEntryActivity這個類裏面的onResp():
第二步使用AsyncTask獲取token:
/** 微信登陸第二步:獲取token */ class AsynctaskToken extends AsyncTask<Object , Object , Object> { @Override protected Object doInBackground(Object... params) { HttpGet httpRequest = new HttpGet(params[0].toString()); try{ HttpClient httpClient = new DefaultHttpClient(); HttpResponse httpResponse = httpClient.execute(httpRequest); if(httpResponse.getStatusLine().getStatusCode() == HttpStatus.SC_OK){ BaseActivity.log("請求我的信息成功"); String strResult = EntityUtils.toString(httpResponse.getEntity()); return strResult; } else{ BaseActivity.log("請求我的信息失敗"); return "請求出錯"; } } catch(ClientProtocolException e){ } catch (IOException e) { e.printStackTrace(); } return null; } @Override protected void onCancelled() { super.onCancelled(); } @Override protected void onPostExecute(Object o) { super.onPostExecute(o); Object obj = null; try { obj = JsonUtil.toObjectByJson(o.toString(), WeiXinLoginGetTokenBean.class); } catch (IOException e) { e.printStackTrace(); } WeiXinLoginGetTokenBean bean = (WeiXinLoginGetTokenBean)obj; BaseActivity.log("獲取token成功:\n" + "token:"+bean.getAccess_token()+"\nopenid"+bean.getOpenid()); String url = "https://api.weixin.qq.com/sns/userinfo?"+"access_token="+bean.getAccess_token()+"&openid="+bean.getOpenid(); new AsynctaskInfo().execute(url); } @Override protected void onProgressUpdate(Object... values) { super.onProgressUpdate(values); } }
第三步獲取用戶信息:
微信第三方登陸就結束了,相對來講不算太複雜:
注:測試微信登陸的時候,也須要打包測試,不然得不到數據;
百度第三方登陸
百度第三方登陸,相對來講就比較簡單了
第一步:導入Baidu-Frontia-Full-Debug-2.0.6.jar包
第二步:配置AndroidManifest.xml
添加android:name=」com.baidu.frontia.ForntiaApplication」
第三步:添加代碼
在程序入口初始化Fronta」
註冊百度:
主要代碼直接調用baiduLogin()方法就能夠:
退出登陸調用baiduExit()方法就能夠:
百度登陸,挺簡單的吧
1.四種登陸方式已經整理好了,若是有什麼地方寫錯了或者漏掉的,請查看個人Demo或者提出來。
2.因爲這是第一次寫博客,因此確定有寫的很差的地方,你們有什麼意見能夠提出來,相互交流溝通,共同進步。
3.因爲個人源代碼裏面涉及到客戶的信息,因此AppKey、AppSecret等信息,被我刪掉了,若是想看個人Demo效果,須要修改小部分個人代碼:
第一:把我com.aohuan.jinghai_lifee.wxapi換成你的applicationId(對應的包名).wxapi
第二:修改ShareSDK.xml裏面對應的信息:
第三:修改manifest.xml裏面對應的信息:
第四:修改AllApk裏面對應的信息:
這樣就能夠了!!!