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();
        }

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

  • 相关阅读:
    tgttg
    在OpenStack虚拟机实例中创建swap分区的一种方法
    产品:我想要的产品是网络存储+网络备份
    《哪来的天才?》读书笔记——天才源于练习,而且是针对性的练习
    一万小时理论的解读(神贴真开眼界:有意识的刻苦训练是必须的,要有精神动力,还必须有及时的反馈,对实力占优的活动比较有效;玩这样的活动是不行的)
    Cross-compiling Qt Embedded 5.5 for Raspberry Pi 2
    MSYS2的源配置
    关于iOS 5 Could not instantiate class named NSLayoutConstraint错误
    BAT线下战争:巨额投资或培养出自己最大对手(包括美团、58、饿了么在内的公司都在计划推出自己的支付工具和金融产品,腾讯只做2不做O)
    欢聚移动互联时代 在腾讯的夹缝中低调崛起
  • 原文地址:https://www.cnblogs.com/moonwhite/p/5852213.html
Copyright © 2011-2022 走看看