1. 程式人生 > >Android 用官方SDK實現第三方(qq、微信、微博)登入

Android 用官方SDK實現第三方(qq、微信、微博)登入

       最近專案需要做第三方登入,由於以前沒做過,所以也是花了不少時間,走了好多彎路,總算是完成了。依據有福同享有難同當這句話,還有互相學習的原則,還有還有。現在把一些知識點總結一下,供需要者參考,有不足之處還望指點。有兩種方式可實現:一種是用友盟的(它是把qq、微信、微博登陸整合一下),另一種是直接用官方sdk。

 PlatformConfig.setWeixin("wxdc1e388c3822c80b", "3baf1193c85774b3fd9d18447d76cab0");
        //豆瓣RENREN平臺目前只能在伺服器端配置
        PlatformConfig.setSinaWeibo("3921700954", "04b48b094faeb16683c32669824ebdad","http://sns.whalecloud.com");
        PlatformConfig.setYixin("yxc0614e80c9304c11b0391514d09f13bf");
        PlatformConfig.setQQZone("100424468", "c7394704798a158208a74ab60104f0ba");
        PlatformConfig.setTwitter("3aIN7fuF685MuZ7jtXkQxalyi", "MK6FEYG63eWcpDFgRYw4w9puJhzDl0tyuqWjZ3M7XJuuG7mMbO");
        PlatformConfig.setAlipay("2015111700822536");
        PlatformConfig.setLaiwang("laiwangd497e70d4", "d497e70d4c3e4efeab1381476bac4c5e");
        PlatformConfig.setPinterest("1439206");
        PlatformConfig.setKakao("e4f60e065048eb031e235c806b31c70f");
        PlatformConfig.setDing("dingoalmlnohc0wggfedpk");
        PlatformConfig.setVKontakte("5764965","5My6SNliAaLxEm3Lyd9J");
        PlatformConfig.setDropbox("oz8v5apet3arcdy","h7p2pjbzkkxt02a");
        PlatformConfig.setYnote("9c82bf470cba7bd2f1819b0ee26f86c6ce670e9b");

           微信整合有一個大坑,例如我的apk,包名(也就是AndroidManifest.xml中的包名)是com.kingdowin.gosu,你專案中必須有一個包名是com.kingdowin.gosu.wxapi,下面有一個類是WXEntryActivity.java,裡面寫登入微信的程式碼,否則就獲取不到使用者資訊.其實我們也可以把自己的Activity在Manifest.xml中設定  

<activity-alias

android:name="${applicationId}.wxapi.WXEntryActivity"

android:exported="true"

android:targetActivity="自己的Activity" />

友盟登入做好之後,分享就簡單了,可參考上面提供的例子如何實現分享功能。

                 其實友盟也是把各個平臺官方的登入和分享API封裝到自己的SDK中,我們呼叫方便,但是我們也可以選擇自己呼叫封裝各個平臺官方SDK來實現。

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/,下載一個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/,下載一個demo執行一下,把自己的APPKEY替換一下,把程式碼和jar包整合到你的專案中,還需要在manifest.xml中宣告相應的許可權。但是官方demo,沒有授權的介面,這是要鬧哪樣?需要自己加幾行程式碼  

SendAuth.Req req = new SendAuth.Req();  
req.scope = "snsapi_userinfo";  
req.state = "wechat_sdk_demo_test";  
api.sendReq(req);

主要程式碼

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包

最需要需要注意,例如我的apk,包名(也就是AndroidManifest.xml中的包名)是com.kingdowin.gosu,你專案中必須有一個包名是com.kingdowin.gosu.wxapi,下面有一個類是WXEntryActivity.java,裡面寫登入微信的程式碼,否則就獲取不到使用者資訊,記好是必須。如圖

我就是沒有在意才導致浪費了很長時間也沒除錯成功,和友盟的是一樣的,是不是很變態啊,把我本來的包名和類名全都改了,沒辦法呀!但是也可以有對應解決方法

2、

public class WXEntryActivity extends WXCallbackActivity {

}

三、微博開放平臺,地址: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,立馬生效,但是遺憾的是無論如何也不能呼叫微部落格戶端登入,到授權頁面後直接閃退(和友盟的情況一樣),獲取不到使用者資訊,無奈呀,最後只是呼叫網頁版登入可行放在了專案中,有經驗的朋友可以告知一下啊,還有個經常報的錯就是 redirect_uri_dismatch,那是因為你程式碼Constant中的回撥地址和你在開放平臺中註冊的地址不一樣,一般都寫成REDIRECT_URL = "https://api.weibo.com/oauth2/default.html";就行!

效果圖: