Android QQ,微信,新浪微博登录笔记

最近做了一个项目要使用到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";

第三方登录如果使用的一些用户信息,可以去查看相关平台的接入文档。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值