简介
在我们的应用中,一般都有三方登录这个功能,对于这个常用的功能,我们一般会有如下处理方式
- 导入三方sdk,按照文档开发
- 使用如ShareSDK类三方组件来实现
ShareSDK
官方Demo: ThirdPartyLoginDemo
这个参照官方文档一步步的来,也是非常的简单.主要分为两步,
第一步,授权,第二步,获取用户资料
授权:
Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME);
weibo.setPlatformActionListener(paListener);
weibo.authorize();
//移除授权
//weibo.removeAccount(true);
调用authorize方法,会弹出一个基于ShareSDKUIShell的授权页面,填写账号和密码以后,会执行授权操作。这个方法的操作回调paListener并不实际带回什么数据,只是通过回调告知外部成功或者失败。
同时,这里也是需要修改assets目录下的ShareSDK.xml
获取用户资料:
上面只是完成了授权操作,但是并不会带回 实际的数据,那么一般我们都是需要带回用户的第三方信息的,那么这里就不是调用authorize()
,而是showUser(null)
Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME);
weibo.setPlatformActionListener(paListener);
weibo.showUser(null);//获取用户资料
这里传递了一个paListener
.授权回调,在回调中封装了用户的相关资料信息,拿到了用户信息后就好办了.
void onComplete(Platform platform, int action, HashMap<String, Object> res);
void onError(Platform platform, int action, Throwable t);
void onCancel(Platform platform, int action);
注意事项
- SSO (Single Sign-On)
SSO授权方式,简单来说就是优先使用目标平台客户端来完成授权。
Platform weibo = ShareSDK.getPlatform(SinaWeibo.NAME);
weibo.SSOSetting(false); //设置false表示使用SSO授权方式
- 自定义授权界面
当看到上面的powered by ShareSDK的时候,有些产品是需要去掉的,那么怎么办呢,答案在这里:
bbs.mob.com/thread-114-1-1.html
- 删除授权信息
在使用ShareSDK三方登陆 的时候,会先判断是否已经完成授权,若已经完成授权,则会直接登陆,这时候如果用户想要切换一个账号.那么就只有清空数据了,这时候就可以用一个方法来清除用户授权信息
Platform qzone = ShareSDK.getPlatform(this, QZone.NAME);
qzone.removeAccount();
官方sdk
除了使用ShareSDK之外,使用官方sdk实现三方登陆也是很不错的选择.
根据官方文档的介绍一步步的来
- 首先到[QQ互联]创建应用获取
appid
和appkey
- 下载SDK,将jar导入项目.
- 修改
Manifest
清单文件. - 调用登陆接口,获取用户数据.
// Tencent类是SDK的主要实现类,开发者可通过Tencent类访问腾讯开放的OpenAPI。
// 其中APP_ID是分配给第三方应用的appid,类型为String。
mTencent = Tencent.createInstance(APP_ID, this.getApplicationContext());
// 1.4版本:此处需新增参数,传入应用程序的全局context,可通过activity的getApplicationContext方法获取
//login ,BaseUiListener 回调中获取token
mTencent.login(activity, "all", new BaseUiListener(activity))
//根据token,获取用户信息
UserInfo userInfo = new UserInfo(context, mTencent.getQQToken());
userInfo.getUserInfo(new BaseUiListener(activity));
注意事项,QQ登录中需要先获取Token,然后根据Token获取UserInfo,并且需要重写onActivityResult方法才能回调
微博
- 在微博开放平台创建应用,并获取
appid
- 下载sdk,将
jar
包和so
文件导入工程 - 调用登陆接口,获取用户数据
// 快速授权时,请不要传入 SCOPE,否则可能会授权不成功
AuthInfo mAuthInfo = new AuthInfo(activity, wbAppKey, wbRedirectUrl, wbScope);
mSsoHandler = new SsoHandler(activity, mAuthInfo);
//login,AuthListener回调
mSsoHandler.authorize(new AuthListener());
//根据token,获取用户信息
UsersAPI mUserAPI = new UsersAPI(activity, wbAppKey, mAccessToken);
long uid = Long.parseLong(mAccessToken.getUid());// 获取openid
mUserAPI.show(uid, mListener);
注意事项,微博sso登录需要重写onActivityResult方法
微信
- 在微信官方平台创建应用,获取appid
- 下载sdk,并导入jar包,
- 新建
wxapi/WXEntryActivity
,微信登陆回调类 - 编辑
Manifest
添加回调Activity - 编写代码微信授权
// 微信相关
public static IWXAPI api;
// 注册到微信
private void rigistWeixin() {
api = WXAPIFactory.createWXAPI(this,Constants.APP_ID);
api.registerApp(Constants.APP_ID);
}
// 微信登陆请求
private void weiXinLogin() {
//判断微信是否安装
if (api.isWXAppInstalled() && api.isWXAppSupportAPI()) {
SendAuth.Req req = new SendAuth.Req();
req.scope = "snsapi_userinfo";
req.state = "wechat_sdk_demo_Drug A-Z";
api.sendReq(req);//第三方发送消息给微信。
} else {
UIUtil.showToastSafe("没有安装微信");
}
}
//获取微信用户信息
/**
* 授权登录,成功后会回调该方法
*/
@Override public void onResp(BaseResp resp) {
switch (resp.errCode) {
case BaseResp.ErrCode.ERR_OK:
if (resp.getType() == TYPE_LOGIN) {
if (resp instanceof SendAuth.Resp) {
final String code = ((SendAuth.Resp) resp).code;
ThreadManager.getShortPool().execute(new Runnable() {
@Override public void run() {
WeixinTokenModel accessToken =
WechatApiService.getAccessToken(LoginBlock.getInstance().getWechatAppId(),
LoginBlock.getInstance().getWechatAppSecret(), code);
if (null != sILoginCallback) sILoginCallback.tokeCallBack(accessToken);
if (null != accessToken) {
WeixinInfoModel wechatUserInfo =
WechatApiService.getWechatUserInfo(accessToken.access_token,
accessToken.openid);
if (null != sILoginCallback) sILoginCallback.infoCallBack(wechatUserInfo);
}
}
});
}
}
break;
case BaseResp.ErrCode.ERR_USER_CANCEL:
//取消
if (resp.getType() == TYPE_LOGIN) {
if (resp instanceof SendAuth.Resp && null != sILoginCallback) {
sILoginCallback.onCancel();
}
}
break;
case BaseResp.ErrCode.ERR_AUTH_DENIED:
// 拒绝
default:
//失败
if (resp.getType() == TYPE_LOGIN) {
if (resp instanceof SendAuth.Resp && null != sILoginCallback) {
sILoginCallback.onError(new Exception(resp.errStr));
}
}
break;
}
finish();
}
封装
最后,根据上面SDK封装的ShareLoginPay,包含三方登录,三方分享和三方支付,只需要配置一下 appid等基本信息即可,
//微信登录为例
private LoginManager mLoginManager = LoginManager.INSTANCE;
mLoginManager.loginClass(WeiXinLogin.class).loginCallback(new ILoginCallback() {
@Override public void tokeCallBack(Object o) {
final WeixinTokenModel tokenModel = (WeixinTokenModel) o;
runOnUiThread(new Runnable() {
@Override public void run() {
Toast.makeText(MainActivity.this, tokenModel.toString(), Toast.LENGTH_SHORT).show();
}
});
}
@Override public void infoCallBack(Object o) {
final WeixinInfoModel infoModel = (WeixinInfoModel) o;
runOnUiThread(new Runnable() {
@Override public void run() {
Toast.makeText(MainActivity.this, infoModel.toString(), Toast.LENGTH_SHORT).show();
}
});
}
@Override public void onError(final Exception e) {
runOnUiThread(new Runnable() {
@Override public void run() {
Toast.makeText(MainActivity.this, "onError()--->" + e.getMessage(), Toast.LENGTH_SHORT)
.show();
}
});
}
@Override public void onCancel() {
runOnUiThread(new Runnable() {
@Override public void run() {
Toast.makeText(MainActivity.this, "onCancel()", Toast.LENGTH_SHORT).show();
}
});
}
}).doLogin(this);