android微信登录及踩坑之旅

刚好使用到微信登录,百度一大堆出来,但这里还是要分享下自己的步骤以及自己所犯的一些错,大神勿喷

首先,微信登录需要去微信开放平台去申请,然后获取自己需要的ID及一些东西,这里就不多说了,直接去官网申请就OK。注意,注册是需要的应用签名就是自己的.keystore或者.jks文件所生成的,是release的签名文件,是release的签名文件,是release的签名文件。下面附上转换链接:
https://open.weixin.qq.com/cgi-bin/readtemplate?t=resource/app_download_android_tmpl&lang=zh_CN

好了 接下来就是接入微信登录步骤,直接上图
一:在自定义的Application里去注册下
这里写图片描述

private void registToWX() {
//AppConst.WEIXIN.APP_ID是指你应用在微信开放平台上的AppID,记得替换。
mWxApi = WXAPIFactory.createWXAPI(this, AppConst.WEIXIN_APP_ID, true);
// 将该app注册到微信
mWxApi.registerApp(AppConst.WEIXIN_APP_ID);
}

注意去AndroidManifest.xml中将Application换成你自己的。
二:
在登录页面做如下操作。
if (!App.mWxApi.isWXAppInstalled()) {
showToast(“您还未安装微信客户端”);
return;
}
final SendAuth.Req req = new SendAuth.Req();
req.scope = “snsapi_userinfo”;
/**
* 用于保持请求和回调的状态,授权请求后原样带回给第三方
* 为了防止csrf攻击(跨站请求伪造攻击),后期改为随机数加session来校验
*/
req.state = String.valueOf(System.currentTimeMillis());
App.mWxApi.sendReq(req);
这里写图片描述

需注意, req.state = String.valueOf(System.currentTimeMillis()); 这个字段的赋予。

三:
在你的包名相应目录下新建一个wxapi目录,并在该wxapi目录下新增一个WXEntryActivity类,该类继承自Activity,如图

这里写图片描述

这个WXEntryActivity就是微信回调的页面,我们需要在里面做一系列的应用。
这里写图片描述
这里写图片描述

这里写图片描述

页面方法以及作用文中已经写的很详细,需注意,在获取到code后,需要做网络请求去获取token以及用户的信息等,这时,不建议在此页面中做消耗操作,消耗操作会导致关闭当前页面返回登录页面闪屏,造成不好的用户体验。所以此时使用回调到登录页面做网络请求操作。

四:根据自己的网络去做请求
这里写图片描述
代码如下

/**
 * 获取access_token 以及openid
 * @param code
 */
private void getOpenID(String code) {
    // APP_ID和APP_Secret在微信开发平台添加应用的时候会生成,grant_type 用默认的"authorization_code"即可.   AppConst.WEIXIN_APP_SECRET 替换成自己的
    String urlStr = "https://api.weixin.qq.com/sns/oauth2/access_token?appid="+
            AppConst.WEIXIN_APP_ID+"&secret="+AppConst.WEIXIN_APP_SECRET+
            "&code="+code+"&grant_type=authorization_code";
    PostRequest request = OkHttpUtils.post(urlStr).tag(this);
    request.execute(new StringCallback() {
        @Override
        public void onBefore(BaseRequest request) {
            super.onBefore(request);
        }

        @Override
        public void onResponse(String s) {

            JSONObject jsonObject = null;
            try {
                jsonObject = new JSONObject(s);
                String openid = jsonObject.getString("openid").toString().trim();
                String access_token = jsonObject.getString("access_token").toString().trim();
                SPUtil.put(LoginActivity.this,"weixin_token",access_token);
                getUserMesg(access_token, openid);
            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onError(Call call, @Nullable Response response, @Nullable Exception e) {
            super.onError(call, response, e);
        }
    });

}

/**
 * 获取微信的个人信息
 * <p>
 * openid:普通用户的标识,对当前开发者帐号唯一
 * nickname:普通用户昵称
 * sex:普通用户性别,1为男性,2为女性
 * province:普通用户个人资料填写的省份
 * city:普通用户个人资料填写的城市
 * country:国家,如中国为CN
 * headimgurl:用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
 * privilege:用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
 * unionid:用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。
 *
 * @param access_token
 * @param openid
 */
private void getUserMesg(final String access_token, final String openid) {
    Log.e("--", "access_token:" + access_token + "====openid" + openid);
    String path = "https://api.weixin.qq.com/sns/userinfo?access_token="
            + access_token
            + "&openid="
            + openid;
    //网络请求,根据自己的请求方式

    PostRequest request = OkHttpUtils.post(path).tag(this);
    request.execute(new StringCallback() {
        @Override
        public void onBefore(BaseRequest request) {
            super.onBefore(request);
        }

        @Override
        public void onResponse(String s) {
            JSONObject jsonObject = null;
            try {
                jsonObject = new JSONObject(s);
                String nickname = jsonObject.getString("nickname");
                int sex = Integer.parseInt(jsonObject.get("sex").toString());
                String headimgurl = jsonObject.getString("headimgurl");

                Log.e("--", "用户基本信息:");
                Log.e("--", "nickname:" + nickname);
                Log.e("--", "sex:" + sex);
                Log.e("--", "headimgurl:" + headimgurl);

            } catch (JSONException e) {
                e.printStackTrace();
            }
        }

        @Override
        public void onError(Call call, @Nullable Response response, @Nullable Exception e) {
            super.onError(call, response, e);
        }
    });

}

此时,微信登陆就算成功了,恭喜各位。微信登陆默认时间为两个小时,过了后会有方法去刷新,重新获取下token,这里业务没有设计到,就没有去写,需要的兄弟可以去官网看下。测试的时候,需要和你在官网注册的应用签名一致。然后 就有人问 ,难道每次都需要打包,安装,测试吗?太麻烦了 这里 给大家教下如何更改android studio(绝大多数应该是这个了吧!)debug下的应用签名文件

众所周知,测试的时候大家就是直接发布到连接到工具的手机,这个时候,AS会自己帮我们生成一个debug.keystore,这个就是默认的签名文件,但是我们注册到微信官网的不能是这个文件。这个时候 就需要更改下这个默认的debug文件.
这里写图片描述

去设置下你的正式签名所在的地址,别名以及密码等。

这里写图片描述

将debug的Signing config替换成你刚才所设置的,点击OK。完成后去检查下你的gradle,如图所示,然后 就不需要每次去打包,安装,在测试了。
这里写图片描述

到此,就全部完了,希望可以帮到你。第一次写博客,有什么不好的地方,大家可以建议下。

最后,附上官网地址

https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN&token=4118c9543b9ffd450512b1ad81c8b6bbc5099a81

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值