轉載請標明原地址:[http://blog.csdn.net/gaolei1201/article/details/44680291](http://blog.csdn.net/gaolei1201/article/details/44680291)
最近項目需要做第三方登錄,由于以前沒做過,所以也是花了一周時間,走了好多彎路,總算是完成了。依據有福同享有難同當這句話,還有互相學習的原則,還有還有。現在把一些知識點總結一下,供需要者參考,有不足之處還望指點。有兩種方式可實現:一種是用友盟的(它是把qq、微信、微博登陸集成一下),另一種是直接用官方sdk。
我開始想用友盟的,首先參考了這篇文章,還帶著demo(veryimportant,例子能說明一切,你懂得),很不錯,別的是在也找不到了,地址:[http://blog.csdn.net/wwj_748/article/details/41117173](http://blog.csdn.net/wwj_748/article/details/41117173)? ?。你首先需要申請友盟的賬號,然后下載需要的SDK,參考文檔,把應用的信息注冊一下,如圖

我在使用老是出現一些莫名其妙的問題,如qq登陸,明明用別人的demo還有自己寫個demo,都能正常運行和獲取到用戶信息,但是集成到自己的項目就不行,獲取不到信息,試了好久都不行,還有就是新浪微博登錄時無法調用客戶端如果把客戶端卸掉網頁版登陸是正常的,但是友盟沒有提供選擇客戶端或是網頁版登錄的選擇,所以新浪微博也是沒辦法正常登錄。只有微信能正常運行,但也沒那么簡單,有一個大坑,例如我的apk,包名(也就是AndroidManifest.xml中的包名)是com.kingdowin.gosu,你項目中必須有一個包名是com.kingdowin.gosu.wxapi,下面有一個類是WXEntryActivity.java,里面寫登錄微信的代碼,否則就獲取不到用戶信息,**記好是必須**。友盟登錄做好之后,分享就簡單了,可參考上面提供的例子如何實現分享功能。
**其實友盟也是吧官方的API封裝了一下,我們完全沒必要用友盟的SDK做登陸和分享功能,多此一舉,且添加不少麻煩。終上所述,我選擇官方SDK。**
首先普及一下準備工作:1、要說明的是qq登陸、微信登錄、微博登錄,都分別要在騰訊公眾平臺、微信公眾平臺、微浪微博公眾平臺申請賬號,提交app信息審核通過才能調用,還有就是微信公眾平臺需要交納每年300的費用才能使用它的登錄分享功能,以及一些其它功能。在申請過程中會讓你填寫自己項目的Android包名和Android簽名(項目包名必須和注冊的包名一致),這是必須的否則登錄不成功。臺會給你APPKEY,APPID等有用信息。簽名工具開放平臺都能下載,我為大家提供一個新浪微博的簽名工具,下載地址:[http://download.csdn.net/detail/gaolei1201/8576635](http://download.csdn.net/detail/gaolei1201/8576635)。平

2、項目必須是簽過名項目也就是發布版,順便給大家介紹一下項目簽名步驟:1.右鍵項目選擇AndroidTools ?2.選擇Export Signed Application Package...3.點擊Next ?4.補充說明KeyCreation過程中,如圖2信息填寫由一條灰線分為上下兩部分,上部分Alias、Password、Confirm、Validity(years)必填,下部分必須至少選填一項,如填寫First and Last Name這項即可,否則回報如圖2錯誤,盡量把信息填完整些。這次創建后以后此項目可重復利用此 keystore,不必每次都創建,看圖1,點擊Useing exiting keystore,然后選擇創建過的keystore即可,然后finish。



?一、QQ開放平臺,地址:[http://open.qq.com/](http://open.qq.com/),下載一個demo,把自己APPID替換一下就行,然后把代碼和jar包集成到你的項目中,需要在manifest.xml中聲明相應的權限和兩個Activity
~~~
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true" >
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="tencent222222" />
<!-- 100380359 100381104 222222 -->
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:configChanges="orientation|keyboardHidden"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar" />
~~~
qq登錄還是比較簡單的。每次qq的login之后需要logout,如果不logout就會出現異常,大家可以試試.微信和微博登露是不需要logout,可連續多次login。有時會出現非官方授權請到應用寶下載,是因為運行時需要簽名包,然后就正常了,但是騰訊貼心的提供一個測試賬號即使不簽名打包也行,還可以調試,就是登錄你注冊基本信息時的Q號,如圖

二、微信開放平臺,地址:[https://open.weixin.qq.com/](https://open.weixin.qq.com/),下載一個demo運行一下,把自己的APPKEY替換一下,把代碼和jar包集成到你的項目中,還需要在manifest.xml中聲明相應的權限。但是官方demo,沒有授權的界面,這是要鬧哪樣?需要自己加幾行代碼 ?
~~~
<span style="font-size:14px;">SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_test";
api.sendReq(req);</span>
~~~
主要代碼
~~~
public class WXEntryActivity extends Activity implements IWXAPIEventHandler{
private IWXAPI api;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.flash_activity);
<span style="color:#3366ff;">api = WXAPIFactory.createWXAPI(this, Property.wxLoginInfo.getAppid(), false);
api.handleIntent(getIntent(), this);</span>
}
@Override
public void onReq(BaseReq arg0) {
// TODO Auto-generated method stub
}
@Override
public void onResp(BaseResp resp) {
Bundle bundle = new Bundle();
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
// 可用以下兩種方法獲得code
// resp.toBundle(bundle);
// Resp sp = new Resp(bundle);
// String code = sp.code;
// 或者
String code = ((SendAuth.Resp) resp).code;}}
~~~
下面還有關鍵的一步是如何通過code獲取openId和accessToken。可訪問此地址:"https://api.weixin.qq.com/sns/oauth2/access_token?" +
"appid="+Constant.WEIXIN_APP_ID(即自己的APPID)+"&secret="+Constant.WEIXIN_APP_SECRET(即自己的APPSECRET)+"&code="+code(即獲取到的code)+"&grant_type=authorization_code"; ?返回的json字符串包括openId和accessToken。
注意:上面是獲取code。現在最新的官方jar包好像不支持獲得code了。直接就能得到token,省略了獲取code 這一步。所以方法不變,大家取的時候直接resp.token就行了。不用再去取code了。但是,但是,這樣直接拿到token了好像按照官方文檔上的方法就不能獲得openid了。自己找不到辦法也找不到相關資料,反正是jar包更新了但是文檔還沒更新,大家弄不成功的話可以先用舊的jar和上面獲取code的方法。點擊[下載舊版jar包](http://download.csdn.net/detail/qq247890212/8401389)
?
最需要需要注意,例如我的apk,包名(也就是AndroidManifest.xml中的包名)是com.kingdowin.gosu,你項目中必須有一個包名是com.kingdowin.gosu.wxapi,下面有一個類是WXEntryActivity.java,里面寫登錄微信的代碼,否則就獲取不到用戶信息,**記好是必須**。如圖

我就是沒有在意才導致浪費了很長時間也沒調試成功,和友盟的是一樣的,是不是很變態啊,把我本來的包名和類名全都改了,沒辦法呀!
三、微博開放平臺,地址:[http://open.weibo.com/](http://open.weibo.com/)。下載個demo替換成自己的APPKEY,然后替換一下自己的,把代碼和jar包集成到你的項目中,在manifest.xml中加入相應的權限和這個activity
~~~
<activity
android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
android:configChanges="keyboardHidden|orientation"
android:exported="false"
android:windowSoftInputMode="adjustResize" >
</activity>
~~~
說起來也是一肚子苦水要倒啊。媽的,開始下載一個官方demo一切都配置好了,還是報 sso package or sign error,抱頭苦死不得其解,后來經過網上查閱資料和分析,可能是下載了一個老版本,有許多人反映老版本會一直報此錯誤。后來經過自己一番研究和實驗,發現了這個地址上的demo還是靠譜的,[https://github.com/sinaweibosdk/weibo_android_sdk](https://github.com/sinaweibosdk/weibo_android_sdk),立馬生效,但是遺憾的是無論如何也不能調用微博客戶端登錄,到授權頁面后直接閃退(和友盟的情況一樣),獲取不到用戶信息,無奈呀,最后只是調用網頁版登錄可行放在了項目中,**有經驗的朋友可以告知一下啊**,還有個經常報的錯就是 redirect_uri_dismatch,那是因為你代碼Constant中的回調地址和你在開放平臺中注冊的地址不一樣,一般都寫成REDIRECT_URL = "https://api.weibo.com/oauth2/default.html";就行!
?效果圖:

[?**第三方登錄做好之后,分享就簡單了,可訪問下篇文章:android 分享功能**](http://blog.csdn.net/gaolei1201/article/details/45873559)
[?項目源碼地址歡迎光臨.............](http://download.csdn.net/detail/gaolei1201/8548121)