QQ 微信 新浪微博 第三方登錄最快速

在本文之前請先去官方下載SDK ?如果你做了分享那就不需要了;

注:你做了分享的意思 是你在清單文件下面已經(jīng)注冊了所需要的Activity.

官方的文檔確實寫的很清晰,但是并不太適合我們的快節(jié)奏,你只需要將我下面的代碼成功寫入你的APP 第三方登錄就完成了

第三方登錄注意問題

一、QQ

1、100044錯誤 確保簽名文件正確

2、修改MD5 簽名

原因:簽名問題導(dǎo)致。

解決方法:1、檢查代碼里配置的appid是否正確。2、修改簽名。

簽名修改操作步驟:對應(yīng)移動應(yīng)用的開發(fā)者可以進入QQ互聯(lián)官網(wǎng)https://connect.qq.com/index.html? ? =》應(yīng)用管理=》移動應(yīng)用=》關(guān)聯(lián)騰訊開放平臺,根據(jù)提示關(guān)聯(lián)創(chuàng)建出現(xiàn)問題的移動應(yīng)用,修改/添加相應(yīng)的簽名或者包名。

注:1、獲取對應(yīng)報錯包名所用的簽名信息進行修改或者添加。

2、若QQ互聯(lián)里已有對應(yīng)的移動應(yīng)用,可直接改簽名;若無對應(yīng)移動應(yīng)用,要先關(guān)聯(lián)開放平臺創(chuàng)建一個同APP ID的應(yīng)用進行包名/簽名修改或者添加

3、包名、簽名需小寫,去掉冒號

APP 使用步驟:

在登陸的onCreate執(zhí)行 1

1、Tencent 注冊? mTencent = Tencent.createInstance(Constant.APP_ID_QQ, getApplicationContext());

2、 // 當(dāng)他點擊QQLOGO 你無法確定他到底是要用哪一個賬號

mTencent.login(this, "all", mBaseUiListener); 不需要做其他存儲判斷因為你無法知道他是否要切換其他QQ

/**

* QQ回調(diào)的Listener

*/

private BaseUiListener mBaseUiListener = new BaseUiListener();

private class BaseUiListener implements IUiListener {

@Override

public void onComplete(Object o) {

LogUtils.i("QQ授權(quán)登錄回調(diào)");

String access_token = ((JSONObject) o).optString("access_token");

String openid = ((JSONObject) o).optString("openid");

String expires_in = ((JSONObject) o).optString("expires_in");

//? ? ? ? ? ? TestLogin(s,2);

thirdPartLogin(access_token, openid, 2); // 這里是將數(shù)據(jù)傳給服務(wù)器生成APP對應(yīng)的賬號

// 下面的保存是為了做自動登陸做準(zhǔn)備

mTencent.setAccessToken(access_token, expires_in);

mTencent.setOpenId(openid);

( 其實這里這樣做沒有意義,當(dāng)你的程序徹底關(guān)閉之后mTencent會重現(xiàn)創(chuàng)建,你在其他地方取到的至將會報空,所以可以考慮用微博的方式)

LogUtils.i(o.toString());

}

@Override

public void onError(UiError uiError) {

LogUtils.i(uiError.toString());

}

@Override

public void onCancel() {

LogUtils.i("取消了");

}

}

3、授權(quán)登陸之后的接受回調(diào)

super.onActivityResult(requestCode, resultCode, data);

switch (type){

case TYPE_QQ:

mTencent.onActivityResultData(requestCode, resultCode, data, mBaseUiListener);

return;

case TYPE_WEIBO:

if (mSsoHandler != null) {

mSsoHandler.authorizeCallBack(requestCode, resultCode, data);

}

return;

//? ? ? ? ? ? default:

//? ? ? ? ? ? ? ? AppContext.getApp().showToastCenterShort("try again later");

}

4、(請求服務(wù)器登陸成功之后將信息填到APP) 并調(diào)用 微博也要執(zhí)行這個;

setResult(RESULT_OK);

finish(); 回到跳轉(zhuǎn)到登陸之前的activity? 注意 邏輯不好處理的時候用laucher moder singletask

二、微博登陸

在登陸的onCreate執(zhí)行 1

1、 mWeiboShareAPI = WeiboShareSDK.createWeiboAPI(getApplicationContext(), Constant.APP_KEY_SINA);

mWeiboShareAPI.registerApp();

2、點擊了微博登錄按鈕

mAuthInfo = new AuthInfo(LoginActivity.this, Constant.APP_KEY_SINA, Constant.REDIRECT_URL, Constant.SCOPE);

mSsoHandler = new SsoHandler(LoginActivity.this, mAuthInfo);

mSsoHandler.authorize(new AuthListener());//WEB/客戶端二選一

mSsoHandler.authorizeClientSso(new AuthListener());

LogUtils.e("進入了微博重新授權(quán)");

3、 /**

* 微博認證授權(quán)回調(diào)類。

* 1. SSO 授權(quán)時,需要在 {@link #onActivityResult} 中調(diào)用 {@link SsoHandler#authorizeCallBack} 后,

* 該回調(diào)才會被執(zhí)行。

* 2. 非 SSO 授權(quán)時,當(dāng)授權(quán)結(jié)束后,該回調(diào)就會被執(zhí)行。

* 當(dāng)授權(quán)成功后,請保存該 access_token、expires_in、uid 等信息

*/

class AuthListener implements WeiboAuthListener {

@Override

public void onComplete(Bundle bundle) {

mAccessToken = Oauth2AccessToken.parseAccessToken(bundle);

LogUtils.i(bundle.toString());

AccessTokenKeeper.writeAccessToken(getApplicationContext(),mAccessToken);

LogUtils.i("===phoneNum=="+ mAccessToken.toString());

if (mAccessToken.isSessionValid()) {

thirdPartLogin(mAccessToken.getToken(),mAccessToken.getUid(),3);

//? ? ? ? ? ? ? ? RequestBody body = new FormBody.Builder().add("access_token",mAccessToken.getToken()).build();

/**

* 這個即使幫后臺測試用的現(xiàn)在不用

*/

//? ? ? ? ? ? ? ? OKhttpUtils.post(getActivity(), "https://api.weibo.com/oauth2/get_token_info", body, new OKhttpUtils.DataCallback() {

//? ? ? ? ? ? ? ? ? ? @Override

//? ? ? ? ? ? ? ? ? ? public void onFailure(Call call, IOException e) {

//

//? ? ? ? ? ? ? ? ? ? }

//

//? ? ? ? ? ? ? ? ? ? @Override

//? ? ? ? ? ? ? ? ? ? public void onSuccess(Call call, String json, JSONObject obj) throws JSONException {

//? ? ? ? ? ? ? ? ? ? ? ? ? ? LogUtils.e(json);

//? ? ? ? ? ? ? ? ? ? }

//? ? ? ? ? ? ? ? });

}

}

@Override

public void onWeiboException(WeiboException e) {

AppContext.getApp().showToastCenterShort(e.toString());

}

@Override

public void onCancel() {

AppContext.getApp().showToastCenterShort("請重新登錄");

}

}

三、微信登陸

問題:

微信登錄點擊之后會有一個響應(yīng)時間 所以你需要在點擊之后將他設(shè)置為不可以點擊;

在登陸的onCreate執(zhí)行 1

1. mIWXAPI = WXAPIFactory.createWXAPI(this, Constant.APP_ID_WX);

mIWXAPI.registerApp(Constant.APP_ID_WX);

2. 點擊微信按鈕登陸

private void goWx() {

type =TYPE_WECHAT;

SendAuth.Req req = new SendAuth.Req();

req.scope = "snsapi_userinfo";

req.state = Constant.APP_WX_STATE;

mIWXAPI.sendReq(req);

finish();

// 這里finish 在wx 的回調(diào)activity里面需要判斷

}

// 微信回調(diào)

SendAuth.Resp newResp = (SendAuth.Resp) resp;

L.e("resp 111: " + JSON.toJSONString(resp));

//獲取微信傳回的code

String code = newResp.code;

String state = newResp.state;

if (!Constant.APP_WX_STATE.equals(state) && newResp.getType() != 1) { // type 1為登陸 2為分享

return;

}

LogUtils.i(newResp.getType() + "");

String s = String.format(Locale.CANADA, Constant.APP_WX_CALL, Constant.APP_ID_WX

, Constant.APP_WX_APPSECRET, code);

//? ? public static final String APP_WX_CALL ="https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&secret=%s&code=%s&grant_type=authorization_code";

// 該url為請求微信接口獲取openid access_token

//然后請求服務(wù)器成功之后可以將 微信的數(shù)據(jù)保存到本地? SharedPreferences pref

// 如果不需要做自動登陸這些可以不做? 因為微信的accesstoken 有效為7200

// 需要用 refreshtoken 刷新? 其實都是服務(wù)器做的 但是沒辦法我們后臺很懶)

//? 將openid 給服務(wù)器做用戶唯一標(biāo)識即可

LogUtils.i(s);

// 組裝s 該url為請求微信接口獲取openid access_token == 數(shù)據(jù)

拿到之后再傳給服務(wù)器就登錄完成了;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容