zoukankan      html  css  js  c++  java
  • 安卓第三方登录 微信

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

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

  • 相关阅读:
    leetcode 子集
    leetcode 1111. 有效括号的嵌套深度
    leetcode289 生命游戏
    关于三次握手和四次挥手,发送方和接收方处于的状态的问题。
    面试题:随意取数
    2020/3/31
    01背包和完全背包
    USACO Agri-Net 3.1
    mfc小计
    static 成员小记
  • 原文地址:https://www.cnblogs.com/moonwhite/p/5852213.html
Copyright © 2011-2022 走看看