这篇文章主要为大家详细介绍了 Android 微信第三方登录的具体过程,个人笔记分享,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
Android 是一种基于 Linux 的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由 Google 公司和开放手机联盟领导及开发。尚未有统一中文名称,中国大陆地区较多人使用 "安卓" 或 "安致"。
今天在写微信登录,花了半天时间搞定、然后写下自己的笔记,希望帮助更多的人。欢迎各位指教。
微信授权登录,官方说的不是很清楚、所以导致有一部分的坑。
微信注册应用平台的应用签名, 下载 {aa1aa} 输入项目的 packageName 也可以查看到。
(注意:debug、Release 一定要区分,因为 2 种生成的微信签名不一致,会导致没有跳转、回调。。。。一般在微信开发者上面注册的是正式环境打包好的、)
申请微信开发者账号、应用申请省略。
1. 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"
- />
2. 在图一按钮上面,加上微信跳转方法、也就是启动微信登录的方法
- private void loginToWeiXin(){
- IWXAPI mApi = WXAPIFactory.createWXAPI(this, WXEntryActivity.WEIXIN_APP_ID, true);
- mApi.registerApp(WXEntryActivity.WEIXIN_APP_ID);
- if (mApi != null && mApi.isWXAppInstalled()) {
- SendAuth.Req req = new SendAuth.Req();
- req.scope = "snsapi_userinfo";
- req.state = "wechat_sdk_demo_test_neng";
- mApi.sendReq(req);
- } else
- Toast.makeText(this, "用户未安装微信", Toast.LENGTH_SHORT).show();
- }
3. 在你的包名相应目录下新建一个 wxapi 目录,并在该 wxapi 目录下新增一个 WXEntryActivity 类,该类继承自 Activity
package(项目报名).wxapi.WXEntryActivity.Java
回调方法 onResp() 方法没有触发回调、请监测 WXEntryActivity onCreate 中是否调用此方法 mApi.handleIntent(this.getIntent(), this);
- package com.xxx.xxxx.android.wxapi;
- /**
- * 微信登录页面
- * @author kevin_chen 2016-12-10 下午19:03:45
- * @version v1.0
- */
- public class WXEntryActivity extends Activity implements IWXAPIEventHandler {
- private static final String APP_SECRET = "填写自己的AppSecret";
- private IWXAPI mWeixinAPI;
- public static final String WEIXIN_APP_ID = "填写自己的APP_id";
- private static String uuid;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- mWeixinAPI = WXAPIFactory.createWXAPI(this, WEIXIN_APP_ID, true);
- mWeixinAPI.handleIntent(this.getIntent(), this);
- }
- @Override
- protected void onNewIntent(Intent intent) {
- super.onNewIntent(intent);
- setIntent(intent);
- mWeixinAPI.handleIntent(intent, this);//必须调用此句话
- }
- //微信发送的请求将回调到onReq方法
- @Override
- public void onReq(BaseReq req) {
- LogUtils.log("onReq");
- }
- //发送到微信请求的响应结果
- @Override
- public void onResp(BaseResp resp) {
- LogUtils.log("onResp");
- switch (resp.errCode) {
- case BaseResp.ErrCode.ERR_OK:
- LogUtils.log("ERR_OK");
- //发送成功
- SendAuth.Resp sendResp = (SendAuth.Resp) resp;
- if (sendResp != null) {
- String code = sendResp.code;
- getAccess_token(code);
- }
- break;
- case BaseResp.ErrCode.ERR_USER_CANCEL:
- LogUtils.log("ERR_USER_CANCEL");
- //发送取消
- break;
- case BaseResp.ErrCode.ERR_AUTH_DENIED:
- LogUtils.log("ERR_AUTH_DENIED");
- //发送被拒绝
- break;
- default:
- //发送返回
- break;
- }
- }
- /**
- * 获取openid accessToken值用于后期操作
- * @param code 请求码
- */
- private void getAccess_token(final String code) {
- String path = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="
- + WEIXIN_APP_ID
- + "&secret="
- + APP_SECRET
- + "&code="
- + code
- + "&grant_type=authorization_code";
- LogUtils.log("getAccess_token:" + path);
- //网络请求,根据自己的请求方式
- VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() {
- @Override
- public void onSuccess(String result) {
- LogUtils.log("getAccess_token_result:" + result);
- JSONObject jsonObject = null;
- try {
- jsonObject = new JSONObject(result);
- String openid = jsonObject.getString("openid").toString().trim();
- String access_token = jsonObject.getString("access_token").toString().trim();
- getUserMesg(access_token, openid);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void onError(String errorMessage) {
- }
- });
- }
- /**
- * 获取微信的个人信息
- * @param access_token
- * @param openid
- */
- private void getUserMesg(final String access_token, final String openid) {
- String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
- + access_token
- + "&openid="
- + openid;
- LogUtils.log("getUserMesg:" + path);
- //网络请求,根据自己的请求方式
- VolleyRequest.get(this, path, "getAccess_token", false, null, new VolleyRequest.Callback() {
- @Override
- public void onSuccess(String result) {
- LogUtils.log("getUserMesg_result:" + result);
- JSONObject jsonObject = null;
- try {
- jsonObject = new JSONObject(result);
- String nickname = jsonObject.getString("nickname");
- int sex = Integer.parseInt(jsonObject.get("sex").toString());
- String headimgurl = jsonObject.getString("headimgurl");
- LogUtils.log("用户基本信息:");
- LogUtils.log("nickname:" + nickname);
- LogUtils.log("sex:" + sex);
- LogUtils.log("headimgurl:" + headimgurl);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- finish();
- }
- @Override
- public void onError(String errorMessage) {
- }
- });
- }
- }
5. 在 AndroidManifest.xml 设置注册微信的页面
当授权时候进入 WXEntryActivity、当前背景可能是黒或白,为了不影响用户体验,可以把当前 Activity 设置为透明:
android:theme="@android:style/Theme.Translucent"
- <!--注册微信回调 WXEntryActivity -->
- <activity
- android:name=".wxapi.WXEntryActivity"
- android:exported="true"
- android:label="@string/app_name"
- android:launchMode="singleTop"
- android:theme="@android:style/Theme.Translucent" />
具体可参考:{aa0aa}
来源: http://www.phperz.com/article/17/0317/312682.html