在本文之前請先去官方下載SDK ?如果你做了分享那就不需要了;
注:你做了分享的意思 是你在清單文件下面已經(jīng)注冊了所需要的Activity.
官方的文檔確實寫的很清晰垦细,但是并不太適合我們的快節(jié)奏趾访,你只需要將我下面的代碼成功寫入你的APP 第三方登錄就完成了
第三方登錄注意問題
一解虱、QQ
1、100044錯誤 確保簽名文件正確
2、修改MD5 簽名
原因:簽名問題導致墨坚。
解決方法:1、檢查代碼里配置的appid是否正確。2泽篮、修改簽名盗尸。
簽名修改操作步驟:對應移動應用的開發(fā)者可以進入QQ互聯(lián)官網(wǎng)https://connect.qq.com/index.html? ? =》應用管理=》移動應用=》關聯(lián)騰訊開放平臺,根據(jù)提示關聯(lián)創(chuàng)建出現(xiàn)問題的移動應用帽撑,修改/添加相應的簽名或者包名泼各。
注:1、獲取對應報錯包名所用的簽名信息進行修改或者添加亏拉。
2扣蜻、若QQ互聯(lián)里已有對應的移動應用,可直接改簽名及塘;若無對應移動應用莽使,要先關聯(lián)開放平臺創(chuàng)建一個同APP ID的應用進行包名/簽名修改或者添加
3、包名笙僚、簽名需小寫芳肌,去掉冒號
APP 使用步驟:
在登陸的onCreate執(zhí)行 1
1、Tencent 注冊? mTencent = Tencent.createInstance(Constant.APP_ID_QQ, getApplicationContext());
2肋层、 // 當他點擊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授權登錄回調(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ù)傳給服務器生成APP對應的賬號
// 下面的保存是為了做自動登陸做準備
mTencent.setAccessToken(access_token, expires_in);
mTencent.setOpenId(openid);
( 其實這里這樣做沒有意義亿笤,當你的程序徹底關閉之后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责嚷、授權登陸之后的接受回調(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、(請求服務器登陸成功之后將信息填到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("進入了微博重新授權");
3爆班、 /**
* 微博認證授權回調(diào)類。
* 1. SSO 授權時辱姨,需要在 {@link #onActivityResult} 中調(diào)用 {@link SsoHandler#authorizeCallBack} 后柿菩,
* 該回調(diào)才會被執(zhí)行。
* 2. 非 SSO 授權時雨涛,當授權結束后枢舶,該回調(diào)就會被執(zhí)行。
* 當授權成功后替久,請保存該 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("請重新登錄");
}
}
三蚯根、微信登陸
問題:
微信登錄點擊之后會有一個響應時間 所以你需要在點擊之后將他設置為不可以點擊后众;
在登陸的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
//然后請求服務器成功之后可以將 微信的數(shù)據(jù)保存到本地? SharedPreferences pref
// 如果不需要做自動登陸這些可以不做? 因為微信的accesstoken 有效為7200
// 需要用 refreshtoken 刷新? 其實都是服務器做的 但是沒辦法我們后臺很懶)
//? 將openid 給服務器做用戶唯一標識即可
LogUtils.i(s);
// 組裝s 該url為請求微信接口獲取openid access_token == 數(shù)據(jù)
拿到之后再傳給服務器就登錄完成了;