在本文之前请先去官方下载SDK 如果你做了分享那就不需要了;
注:你做了分享的意思 是你在清单文件下面已经注册了所需要的Activity.
官方的文档确实写的很清晰,但是并不太适合我们的快节奏,你只需要将我下面的代码成功写入你的APP 第三方登录就完成了
第三方登录注意问题
一、QQ
1、100044错误 确保签名文件正确
2、修改MD5 签名
原因:签名问题导致。
解决方法:1、检查代码里配置的appid是否正确。2、修改签名。
签名修改操作步骤:对应移动应用的开发者可以进入QQ互联官网https://connect.qq.com/index.html =》应用管理=》移动应用=》关联腾讯开放平台,根据提示关联创建出现问题的移动应用,修改/添加相应的签名或者包名。
注:1、获取对应报错包名所用的签名信息进行修改或者添加。
2、若QQ互联里已有对应的移动应用,可直接改签名;若无对应移动应用,要先关联开放平台创建一个同APP ID的应用进行包名/签名修改或者添加
3、包名、签名需小写,去掉冒号
APP 使用步骤:
在登陆的onCreate执行 1
1、Tencent 注册 mTencent = Tencent.createInstance(Constant.APP_ID_QQ, getApplicationContext());
2、 // 当他点击QQLOGO 你无法确定他到底是要用哪一个账号
mTencent.login(this, "all", mBaseUiListener); 不需要做其他存储判断因为你无法知道他是否要切换其他QQ
/**
* QQ回调的Listener
*/
private BaseUiListener mBaseUiListener = new BaseUiListener();
private class BaseUiListener implements IUiListener {
@Override
public void onComplete(Object o) {
LogUtils.i("QQ授权登录回调");
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); // 这里是将数据传给服务器生成APP对应的账号
// 下面的保存是为了做自动登陆做准备
mTencent.setAccessToken(access_token, expires_in);
mTencent.setOpenId(openid);
( 其实这里这样做没有意义,当你的程序彻底关闭之后mTencent会重现创建,你在其他地方取到的至将会报空,所以可以考虑用微博的方式)
LogUtils.i(o.toString());
}
@Override
public void onError(UiError uiError) {
LogUtils.i(uiError.toString());
}
@Override
public void onCancel() {
LogUtils.i("取消了");
}
}
3、授权登陆之后的接受回调
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) 并调用 微博也要执行这个;
setResult(RESULT_OK);
finish(); 回到跳转到登陆之前的activity 注意 逻辑不好处理的时候用laucher moder singletask
二、微博登陆
在登陆的onCreate执行 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、 /**
* 微博认证授权回调类。
* 1. SSO 授权时,需要在 {@link #onActivityResult} 中调用 {@link SsoHandler#authorizeCallBack} 后,
* 该回调才会被执行。
* 2. 非 SSO 授权时,当授权结束后,该回调就会被执行。
* 当授权成功后,请保存该 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();
/**
* 这个即使帮后台测试用的现在不用
*/
// 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执行 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 的回调activity里面需要判断
}
// 微信回调
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
//然后请求服务器成功之后可以将 微信的数据保存到本地 SharedPreferences pref
// 如果不需要做自动登陆这些可以不做 因为微信的accesstoken 有效为7200
// 需要用 refreshtoken 刷新 其实都是服务器做的 但是没办法我们后台很懒)
// 将openid 给服务器做用户唯一标识即可
LogUtils.i(s);
// 组装s 该url为请求微信接口获取openid access_token == 数据
拿到之后再传给服务器就登录完成了;