• 安卓第三方登录 微信


    微信开放平台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();
        }

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

  • 相关阅读:
    九连环
    杨辉三角
    魔术师发牌问题(循环链表)
    Linux 技巧:让进程在后台可靠运行的几种方法
    博客新地址
    x&(-x)取x的最后一个1的证明
    c++对象模型布局分析
    c++ 子类要正确的调用父类构造函数
    hibernate ID 生成方式
    IOCP
  • 原文地址:https://www.cnblogs.com/moonwhite/p/5852213.html
Copyright © 2020-2023  润新知