Android微信、QQ、微博第三方登录

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/waa_0618/article/details/52980039

微信登录
1.1申请微信登录许可并获取AppId以及AppSecret.
请到开发者应用登记页面 进行登记,登记并选择移动应用进行设置后,将该应用提交审核,只有审核通过的应用才能进行开发。
2、SDK下载
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419319167&token=&lang=zh_CN
前往上述网址下载最新的微信Android SDk。
并把依赖包添加到自己的项目中。
这里写图片描述
3、AndroidManifest.xml 设置
添加必要的权限支持:

<uses-permission android:name="android.permission.INTERNET"/> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/> <uses-permission android:name="android.permission.READ_PHONE_STATE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> 
<activity
    android:name=".wxapi.WXEntryActivity"
    android:exported="true"
    android:label="@string/app_name" >
    <intent-filter>
       <action android:name="android.intent.action.MAIN" />

       <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

配置项目
在app的包名目录下新建一个wxapi目录,然后在此目录下新建WXEntryActivity.Java文件,如下,app的包名为carjob.com.cn,新建的wxapi目录如下。(注意:一定是包名目录下新建,不要在其他目录新建,否则WXEntryActivity.java里public void onResp (BaseResp resp)方法不会被调用)。
这里写图片描述
4、将应用appId注册到微信
要使你的程序启动后微信终端能响应你的程序,必须在代码中向微信终端注册你的id。(如下图所示,可以在程序入口Activity的onCreate回调函数处,或其他合适的地方将你的应用id注册到微信。注册函数示例如下图所示。

api = WXAPIFactory.createWXAPI(this, Constant.APP_ID);
api.registerApp(Constant.APP_ID);
api.handleIntent(getIntent(), this);

5、发送请求到微信

SendAuth.Req req = new SendAuth.Req();
            req.scope = "snsapi_userinfo";
            req.state = "wechat_sdk_demo_test";
            api.sendReq(req);

6、登录成功回调获取微信用户信息
实现IWXAPIEventHandler接口,微信发送的请求将回调到onReq方法,发送到微信请求的响应结果将回调到onResp方法

@Override
    public void onResp(BaseResp resp) {
        switch (resp.errCode) {
        case BaseResp.ErrCode.ERR_OK:
      // 允许微信登录
      // 获取微信用户信息
        new Thread(
          new WXGetInfo(((SendAuth.Resp) resp).code)
                   ).start();
// 最新的包是(SendAuth.Resp) resp).code,之前的版本是//(SendAuth.Resp) resp).taken
            break;
        case BaseResp.ErrCode.ERR_USER_CANCEL:
      // 用户终止微信登录
            break;
        default:
            break;
        }
    }

获取用户信息

/**
     * 获取微信用户信息
     * 
     * @author awang
     *
     */
    public class WXGetInfo implements Runnable {
        private String code;

        public WXGetInfo(String code) {
            this.code = code;
        }

        @Override
        public void run() {
//Constant是参数配置类,微信登录相关数据都配置在该类
            String codeUrl = Constant.OPENID_PATH;
            codeUrl = codeUrl.replace("CODE", code);
//HttpUtil.sendGet(codeUrl)简单的网络请求
//HttpUtil是我自己封装的一个网络请求类,
            String response = HttpUtil.sendGet(codeUrl);
            JSONObject jsonObject = JSONObject.parseObject(response);
            String token = jsonObject.getString("access_token");
            String openId = jsonObject.getString("openid");
            String getInfoPath = Constant.USERINFO_PATH.replace("ACCESS_TOKEN", token).replace("OPENID", openId);
            final String infoResponse = HttpUtil.sendGet(getInfoPath);
            org.json.JSONObject buf;
            try {
                buf = new org.json.JSONObject(infoResponse);
//至此就获取到了微信登录openId,
//微信登录成功,
                final String openid = buf.getString("openid");
                runOnUiThread(new Runnable() {
                    @Override
                    public void run() {
                        Toast.makeText(context, openid, Toast.LENGTH_LONG).show();
                    }
                });
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

    }

Constant.java参数配置类

/**
 * 微信登录参数配置
 * 
 * @author awang
 *
 */
public class Constant {
    public static final String APP_ID = "你的APPID";
    public static final String APP_SECRET = "APP_SECRET ";
    // 生成 通过OAuth2.0机制code获取用户openId地址
    public static final String OPENID_PATH = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + APP_ID
            + "&secret=" + APP_SECRET + "&code=CODE&grant_type=authorization_code";
    // 根据openId获取用户信息
    public static final String USERINFO_PATH = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
}


QQ登录
1、在QQ开放平台创建应用,通过审核后获取appId以及appSecret.
2、配置项目
配置文件Androidmanifest.xml

<!-- QQ登录相关 -->
        <activity
            android:name="com.tencent.tauth.AuthActivity"
            android:launchMode="singleTask"
            android:noHistory="true" >
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />

                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <data android:scheme="tencent1105702055" />
            </intent-filter>
        </activity>

3、去QQ开放平台获取最新的依赖包并添加到项目
4、将应用appId注册到QQ

mTencent = Tencent.createInstance(Constant.QQ_APP_ID, this);

5、发起登录请求

mTencent.login(WXEntryActivity.this, "all", loginListener);
IUiListener loginListener = new BaseUiListener() {
        @Override
        protected void doComplete(JSONObject jsonObject) {
            initOpenidAndToken(jsonObject);
            updateUserInfo();
        }
    };
protected void initOpenidAndToken(JSONObject jsonObject) {
        String token = jsonObject.getString(Constants.PARAM_ACCESS_TOKEN);
        String expires = jsonObject.getString(Constants.PARAM_EXPIRES_IN);
        String openId = jsonObject.getString(Constants.PARAM_OPEN_ID);
        if (!TextUtils.isEmpty(token) && !TextUtils.isEmpty(expires) && !TextUtils.isEmpty(openId)) {
            mTencent.setAccessToken(token, expires);
            mTencent.setOpenId(openId);
        }
    }
private class BaseUiListener implements IUiListener {

        @Override
        public void onComplete(Object response) {
            doComplete(JSONObject.parseObject(response.toString()));
        }

        protected void doComplete(JSONObject values) {
        }

        @Override
        public void onError(UiError e) {
        }

        @Override
        public void onCancel() {
        }
    }
/**
     * 获取QQ用户信息
     */
    private void updateUserInfo() {
        if (mTencent != null && mTencent.isSessionValid()) {
            IUiListener listener = new IUiListener() {

                @Override
                public void onError(UiError e) {
                }

                @Override
                public void onComplete(Object response) {
                    JSONObject jsonObject = JSONObject.parseObject(response.toString());
                    jsonObject.put("openId", mTencent.getOpenId());
                    final String json = jsonObject.toJSONString();
                    LogManager.D(TAG_QQ, json);
//登录成功,并获取到openId               
                    runOnUiThread(new Runnable() {
                        @Override
                        public void run() {
                            Toast.makeText(context, mTencent.getOpenId(), Toast.LENGTH_SHORT).show();
                        }
                    });
                }

                @Override
                public void onCancel() {
                }
            };
            mInfo = new UserInfo(context, mTencent.getQQToken());
            mInfo.getUserInfo(listener);
        }
    }

配置 onActivityResult

Tencent.onActivityResultData(requestCode, resultCode, data, loginListener);


微博登录
1、在微博开放平台创建应用,通过审核后获取appId以及appSecret.
2、配置项目

 <activity
            android:name="com.sina.weibo.sdk.component.WeiboSdkBrowser"
            android:configChanges="keyboardHidden|orientation"
            android:exported="false"
            android:windowSoftInputMode="adjustResize" >
        </activity>

        <service
            android:name="com.sina.weibo.sdk.net.DownloadService"
            android:exported="false" >
        </service>
<activity
            android:name=".wxapi.WXEntryActivity"
            android:exported="true"
            android:label="@string/app_name"
            android:windowSoftInputMode="adjustNothing" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
//必须加入这一行                
<action android:name="com.sina.weibo.sdk.action.ACTION_SDK_REQ_ACTIVITY" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

4、去微博开放平台获取最新的依赖包并添加到项目
5、将应用appId注册到微博

/** 微博登录 */
    private AuthInfo mAuthInfo;
    /** 封装了 "access_token","expires_in","refresh_token",并提供了他们的管理功能 */
    private Oauth2AccessToken mAccessToken;
    /** 注意:SsoHandler 仅当 SDK 支持 SSO 时有效 */
    private SsoHandler mSsoHandler;

mAuthInfo = new AuthInfo(this, Constant.WB_APP_KEY, Constant.WB_REDIRECT_URL, Constant.SCOPE);
        mSsoHandler = new SsoHandler(this, mAuthInfo);
        mAccessToken = AccessTokenKeeper.readAccessToken(this);

6、发起登录请求

mSsoHandler.authorizeClientSso(new AuthListener());
//在onActivityResult中添加下面代码(如果缺少,则无法响应回调方法)
if (mSsoHandler != null) {
            mSsoHandler.authorizeCallBack(requestCode, resultCode, data);
        }
/**
     * 微博登录监听器,接收授权结果。
     */
    private class AuthListener implements WeiboAuthListener {
        @Override
        public void onComplete(Bundle values) {
            // 从 Bundle 中解析 Token
            mAccessToken = Oauth2AccessToken.parseAccessToken(values);
            // 从这里获取用户输入的 电话号码信息
            String phoneNum = mAccessToken.getPhoneNum();
            if (mAccessToken.isSessionValid()) {
                // 显示 Token
                // updateTokenView(false);

                // 保存 Token 到 SharedPreferences
                LogManager.e(TAG_WB, mAccessToken.toString());
                AccessTokenKeeper.writeAccessToken(WXEntryActivity.this, mAccessToken);
                // Toast.makeText(WXEntryActivity.this, "登录成功" +
                // mAccessToken.toString(), Toast.LENGTH_SHORT).show();
                UsersAPI mUsersAPI = new UsersAPI(WXEntryActivity.this, "你的APP_KEY", mAccessToken);
                long uid = Long.parseLong(mAccessToken.getUid());
                mUsersAPI.show(uid, mListener);
            } else {
                // 以下几种情况,您会收到 Code:
                // 1. 当您未在平台上注册的应用程序的包名与签名时;
                // 2. 当您注册的应用程序包名与签名不正确时;
                // 3. 当您在平台上注册的包名和签名与您当前测试的应用的包名和签名不匹配时。
                String code = values.getString("code");
                String message = "登录失败";
                if (!TextUtils.isEmpty(code)) {
                    message = message + "\nObtained the code: " + code;
                }
                Toast.makeText(WXEntryActivity.this, message, Toast.LENGTH_LONG).show();
            }
        }

        @Override
        public void onWeiboException(WeiboException e) {
            LogManager.e(TAG_WB, e.getMessage());
            Toast.makeText(WXEntryActivity.this, "登录失败", Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onCancel() {
            Toast.makeText(WXEntryActivity.this, "登录终止", Toast.LENGTH_SHORT).show();
        }
    }

    /**
     * 微博 OpenAPI 回调接口。获取微博用户信息
     */
    private RequestListener mListener = new RequestListener() {
        @Override
        public void onComplete(String response) {
            if (!TextUtils.isEmpty(response)) {
                // LogUtil.i(TAG, response);
                // 调用 User#parse 将JSON串解析成User对象
//至此微博登录成功
                User user = User.parse(response);
                new Thread(new ThirdPartyLogin(user.idstr, 1)).start();
            }
        }

        @Override
        public void onWeiboException(WeiboException e) {
            ErrorInfo info = ErrorInfo.parse(e.getMessage());
            Toast.makeText(WXEntryActivity.this, "登录失败", Toast.LENGTH_LONG).show();
        }
    };
@Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
        // 从当前应用唤起微博并进行分享后,返回到当前应用时,需要在此处调用该函数
        // 来接收微博客户端返回的数据;执行成功,返回 true,并调用
        // {@link IWeiboHandler.Response#onResponse};失败返回 false,不调用上述回调
        mWeiboShareAPI.handleWeiboResponse(intent, this);
    }

猜你喜欢

转载自blog.csdn.net/waa_0618/article/details/52980039
今日推荐