最近做了一个项目要使用到QQ,微信,新浪微博登陆。现在有很多的第三方的平台封装了第三方登录的方法,比如说shareSDK、友盟等。我使用的是各个平台官网上的登陆方法。
在集成之前要现在官网上进行申请,这个在这里就不多说了,可以在官方网上找到相应的快速集成的文档。
第一个我们来说一下QQ登陆,QQ登陆首先是jar包和配置mta-sdk-1.6.2.jar
open_sdk_r5509.jar两个库文件,然后配置mainfest文件
<activity
android:name="com.tencent.tauth.AuthActivity"
android:launchMode="singleTask"
android:noHistory="true">
<intent-filter>
<actionandroid:name="android.intent.action.VIEW"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<categoryandroid:name="android.intent.category.BROWSABLE"/>
<dataandroid:scheme="tencent1104899559"/>
</intent-filter>
</activity>
<activity
android:name="com.tencent.connect.common.AssistActivity"
android:screenOrientation="portrait"
android:theme="@android:style/Theme.Translucent.NoTitleBar"/>
配置完成之后,就可以在代码中去调用了,
private AuthInfomAuthInfo = null;
private SsoHandlermSsoHandler;
private IWXAPImWeixinAPI;
private BaseUiListenertencentLoginListener;
private void initAuthLogin() {// 新浪微博实例
mAuthInfo = new AuthInfo(this, MyConstants.APP_KEY,
MyConstants.REDIRECT_URL, MyConstants.SCOPE);
// new AuthInfo(context, appKey, redirectUrl, scope)
if (mWeixinAPI ==null) {
mWeixinAPI = WXAPIFactory.createWXAPI(context,
MyConstants.WECHAT_APP_ID,false);
}
tencentLoginListener = new BaseUiListener();
}
QQ登陆使用的时候要先进行初始化,然后进行认证和监听:
// ///QQ登陆/
// 这里是调用QQ登录的关键代码
public void LoginQQ() {
// 这里的APP_ID请换成你应用申请的APP_ID,我这里使用的是DEMO中官方提供的测试APP_ID 222222
// 第一个参数就是上面所说的申请的APPID,第二个是全局的Context上下文,这句话实现了调用QQ登录
if (!BaseApplication.mTencent.isSessionValid()) {
BaseApplication.mTencent.login(context,"all", tencentLoginListener);
}
}
/**
* 当自定义的监听器实现IUiListener接口后,必须要实现接口的三个方法, onCompleteonCancel onError
* 分别表示第三方登录成功,取消,错误。
* {"ret":-1,"msg":"clientrequest's parameters are invalid, invalidopenid"}
*/
private class BaseUiListener implements IUiListener {
@Override
public void onCancel() {
}
@Override
public void onComplete(Object response) {
String accesstoken = "";
String expires_in = "";
try {
MyConstants.openId = ((JSONObject)response).getString(Constants.PARAM_OPEN_ID);
accesstoken= ((JSONObject) response)
.getString(Constants.PARAM_ACCESS_TOKEN);
expires_in= ((JSONObject) response).getString("expires_in");
BaseApplication.mTencent.setOpenId(MyConstants.openId);
BaseApplication.mTencent.setAccessToken(accesstoken,expires_in);
//这个对于获取用户信息很重要,之前就是因为这个没有设置,而一直获取不到用户的详细信息。
} catch (JSONException e) {
e.printStackTrace();
}
responseComplete();
}
public void onError(UiError arg0) {
}
}
/**
* 回复信息
*/
private void responseComplete(){
QQToken qqToken = BaseApplication.mTencent.getQQToken();
UserInfo info = new UserInfo(context, qqToken);
info.getUserInfo(new IUiListener() {
public void onComplete(final Object response) {
String headimgurl;
try {
headimgurl = ((JSONObject) response).getString("figureurl_qq_1");
String nickname = ((JSONObject)response).getString("nickname");
String sex = ((JSONObject) response).getString("gender");
String sexId = "2";
if("男".equals(sex) ){
sexId = "0";
} elseif( "女".equals(sex) ){
sexId = "1";
}
authlogin(MyConstants.openId, headimgurl, nickname, sexId,"", "qq");
} catch (JSONException e) {
e.printStackTrace();
}
}
public void onCancel() {
}
public void onError(UiError arg0) {
}
});
}
值得注意的是<dataandroid:scheme="tencent1104899559"/> 这个是appid,这个一定要和你的qq申请的appid一样,不然会收不到回掉信息,在配置好这一项以后还要加上
@Override
protected void onActivityResult(int requestCode,int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Tencent.onActivityResultData(requestCode, resultCode,data,tencentLoginListener);
}
这一句,这样才能够接收到
qq
登陆的后的回调信息。从而进行下一步的操作。
2关于微信还是很麻烦的,微信的认证需要经过我们自己去调用微信官方的get请求,去根据code返回openid,如果你要获取用户的基本信息,就还要根据之前获取得openid来调用相应的官方接口来获取。
public static final String URL_WEIXIN ="https://api.weixin.qq.com/sns/oauth2/access_token";
public static final String URL_WEIBO ="http://api.weibo.com/2/users/show.json";
/***
* 微信登陆
* @param code用户换取access_token的code,仅在ErrCode为0时有效
*/
public void weChatLogin(String code){
AbRequestParams params = new AbRequestParams();
String url = HttpConstant.getURL(HttpConstant.URL_WECHAT)+"?appid="+MyConstants.WECHAT_APP_ID+"&secret="+MyConstants.WECHAT_SECRET+
"&code="+code+"&grant_type=authorization_code";
httpGet(HttpConstant.URL_WECHAT, url, params,new WeChatEntity());
}
/***
* 微信用户公开信息
* @param code用户换取access_token的code,仅在ErrCode为0时有效
*/
public void weChatInfo(String token, String openId){
AbRequestParams params = new AbRequestParams();
String url = HttpConstant.getURL(HttpConstant.URL_WECHAT_INFO)
+ "?access_token=" + token +"&openid=" + openId;
httpGet(HttpConstant.URL_WECHAT_INFO, url, params,newWeChatInfoEntity());
正如看到这样,我要在获得微信的openid后,如果你还需要微信的一些额外的信息的话,还要使用以上的接口先获取对应用户的token,然后使用token来获得用户的相关信息。
微信登陆配置
<!-- 微信登陆后面是微信固有的格式在WXEntryActivity中处理相关的登陆返回的数据-->
<activity
android:name="com.zhanshu.awuyoupin.wxapi.WXEntryActivity"
android:exported="true"
android:label="@string/app_name"
android:launchMode="singleTop">
<intent-filter>
<actionandroid:name="android.intent.action.VIEW"/>
<categoryandroid:name="android.intent.category.DEFAULT"/>
<dataandroid:scheme="sdksample"/>
</intent-filter>
</activity>
}
微信登陆的回调处理
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
handleIntent(intent);
}
private void handleIntent(Intent intent) {
SendAuth.Resp resp = new SendAuth.Resp(intent.getExtras());
if (resp.errCode == BaseResp.ErrCode.ERR_OK) {
// 用户同意
Log.i("TAG", resp.code +"*****************");
/**微信第一步是获得这个code,获取之后通过这个code请求官方给出的接口请求获取openid*/
weChatLogin(resp.code);
Toast.makeText(this,"发送成功", Toast.LENGTH_SHORT).show();
} else if (resp.errCode == BaseResp.ErrCode.ERR_USER_CANCEL) {
Toast.makeText(this,"发送取消", Toast.LENGTH_SHORT).show();
finish();
} else if (resp.errCode == BaseResp.ErrCode.ERR_AUTH_DENIED) {
Toast.makeText(this,"发送被拒绝", Toast.LENGTH_SHORT).show();
finish();
}
}
3.新浪微博登陆,这个与QQ有点类似,
声明变量private AuthInfomAuthInfo = null;
private SsoHandler mSsoHandler;
初始化:
mAuthInfo =new AuthInfo(this, MyConstants.APP_KEY,
MyConstants.REDIRECT_URL, MyConstants.SCOPE);
调用和回调:
// ///新浪登陆
private void loginSine() {
mSsoHandler = new SsoHandler(this,mAuthInfo);
// SSO 授权,仅客户端
//mSsoHandler.authorizeClientSso(new AuthListener());
// SSO 授权, ALL IN ONE如果手机安装了微博客户端则使用客户端授权,没有则进行网页授权
// mSsoHandler.authorizeClientSso(new AuthListener());
mSsoHandler.authorize(new AuthListener());
}
/**
* 新浪微博登录
* 登入按钮的监听器,接收授权结果。
*/
class AuthListenerimplements WeiboAuthListener {
@SuppressWarnings("unused")
@Override
public void onComplete(Bundle values) {
String token = values.getString("access_token");
String expires_in =values.getString("expires_in");
MyConstants.openId =values.getString("uid");
Oauth2AccessToken accessToken = new Oauth2AccessToken(token, expires_in );
System.out.println("token::" + token );
weiboLogin( MyConstants.APP_KEY, token, MyConstants.openId);
}
@Override
public void onWeiboException(WeiboException e) {
Toast.makeText(LoginActivity.this, e.getMessage(),
Toast.LENGTH_SHORT).show();
}
@Override
public void onCancel() {
Toast.makeText(LoginActivity.this,"取消授权", Toast.LENGTH_SHORT)
.show();
}
}
注意微博这里也需要在这里调用才可以达到回调:
@Override
protected void onActivityResult(int requestCode,int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if( mSsoHandler != null ){
mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
}
}
新浪微博的配置
<!-- 新浪登录 -->
<activity
android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
android:configChanges="keyboardHidden|orientation"
android:exported="true"
android:windowSoftInputMode="adjustResize">
</activity>
<service
android:name="com.sina.weibo.sdk.net.DownloadService"
android:exported="false">
</service>
值得注意的是,新浪微博在使用的时候,需要app通过验证或者是调加测试账号才可以拿到用户信息。同时毁掉要与你申请应用的时候给出的回调页相同,不然会出现redir失败的错误,错误号记不太清了。这是我的配置信息:
// 新浪微博
public static final String APP_KEY ="1200542224"; // 应用的APP_KEY
public static final String REDIRECT_URL ="http://open.weibo.com";//应用的回调页
public static final String SCOPE ="email,direct_messages_read,direct_messages_write,"
+ "friendships_groups_read,friendships_groups_write,statuses_to_me_read,"
+ "follow_app_official_microblog," +"invitation_write";
第三方登录如果使用的一些用户信息,可以去查看相关平台的接入文档。