在本文之前請先去官方下載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ù)器就登錄完成了;