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

在本文之前请先去官方下载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 == 数据

拿到之后再传给服务器就登录完成了;

你可能感兴趣的:(QQ 微信 新浪微博 第三方登录最快速)