安卓第三方登录 微信

微信开放平台https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN

微信审核在1-3个工作日内完成

集成步骤文档写的挺清楚,这里只贴关键代码

调起微信认证页面,在微信响应后获取到code

public void reqPass() {
        final SendAuth.Req req = new SendAuth.Req();
        req.scope = "snsapi_userinfo";
        req.state = "bbbl_wx_login_test";
        if (api != null) {
            api.sendReq(req);
            Toast.makeText(getBaseContext(), "请求拉起微信认证页面", LENGTH_SHORT).show();
        } else {
            Toast.makeText(getBaseContext(), "微信认证走丢了,跳转至登陆界面,请尝试再次登陆", Toast.LENGTH_LONG).show();
        }
    }
 @Override
    public void onResp(BaseResp baseResp) {
        switch (baseResp.errCode) {
            case BaseResp.ErrCode.ERR_OK://分享成功
                if (ConstantsAPI.COMMAND_SENDMESSAGE_TO_WX == baseResp.getType()) {
                    Toast.makeText(WXEntryActivity.this, "分享成功", Toast.LENGTH_LONG).show();
                    finish();
                    break;
                }
                String code = ((SendAuth.Resp) baseResp).code;
                reqes(code);
                break;
            case BaseResp.ErrCode.ERR_USER_CANCEL://分享取消
                Toast.makeText(WXEntryActivity.this, "您选择了取消", Toast.LENGTH_LONG).show();
                finish();
                break;
            case BaseResp.ErrCode.ERR_AUTH_DENIED://分享拒绝
                Toast.makeText(WXEntryActivity.this, "您选择了取消", Toast.LENGTH_LONG).show();
                finish();
                break;
        }
        finish();
    }

获取到code后就可以访问接口获得access_token,继而得到用户信息

  public void reqes(String code) {
        RequestQueue mQueue = Volley.newRequestQueue(this);
        StringRequest stringRequest = new StringRequest(Constants.REQ_URL
                + "?appid=" + Constants.APP_ID_WX + "&secret=" + Constants.SECRET_WX
                + "&code=" + code + "&grant_type=authorization_code",
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        TokenInfo json = new Gson().fromJson(response,
                                TokenInfo.class);
                        wx_access_token = json.getAccess_token();
                        wx_openid = json.getOpenid();
                        getUserInfo(wx_access_token, wx_openid);

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            }
        });
        mQueue.add(stringRequest);
        mQueue.start();
    }

    public void getUserInfo(String access_token, final String openid) {
        RequestQueue mQueue = Volley.newRequestQueue(this);
        StringRequest stringRequest = new StringRequest(Constants.USERINFO_URL
                + "?access_token=" + access_token + "&openid=" + openid,
                new Response.Listener<String>() {
                    @Override
                    public void onResponse(String response) {
                        Log.i("WXUserInfo", response);
                        WXUserInfo info = new Gson().fromJson(response, WXUserInfo.class);
                        String nickname = info.getNickname();
                        String headimgurl = info.getHeadimgurl();
                        //判断是否为魅族手机,采用不同的编码,以解决乱码的问题
                        if ("Meizu".equals(android.os.Build.MANUFACTURER)) {
                            //魅族手机
                            try {
                                String en_nickname = URLEncoder.encode(nickname, "iso-8859-1");
                                String de_nickname = URLDecoder.decode(en_nickname, "utf-8");
                                bindCustomer(de_nickname, headimgurl, openid, "wx");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                        } else {
                            try {
                                String en_nickname = URLEncoder.encode(nickname, "utf-8");
                                String de_nickname = URLDecoder.decode(en_nickname, "utf-8");
                                bindCustomer(de_nickname, headimgurl, openid, "wx");
                            } catch (UnsupportedEncodingException e) {
                                e.printStackTrace();
                            }
                        }

                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
            }
        });
        mQueue.add(stringRequest);
        mQueue.start();
    }

获取用户信息时,微信文档说默认是中文,但是也有人遇到是英文的情况,这时在请求的时候可以多加一个参数来指定语言

原文地址:https://www.cnblogs.com/moonwhite/p/5852213.html