您的位置:首页 > 移动开发 > 微信开发

三方授权登陆

2018-01-19 14:42 113 查看
新浪授权申请地址:http://open.weibo.com/wiki/Connect/login
QQ授权申请地址:https://connect.qq.com
微信公众号授权申请地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140842
微信扫码登陆申请地址:
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&lang=zh_CN

授权申请说明:四种授权方式都需要回调域名跳转,调试的时候,可以申请域名,使用ngrok等工具来实现本地端口映射。其中新浪授权对域名是否备案要求不是太严格,测试域名只能用一天。微信公众号授权登陆需要域名和验证文件,可以下载对应的验证文件放到本地服务器根目录,来达到验证。QQ登陆和微信扫码登陆,都需要域名备案,回调地址对应的域名都必须是已经备案的域名,但是依然可以用备案域名来调试本地端口,我使用的是natapp,我的解决办法是将线上备案的域名下的二级域名解析到natapp,然后将natapp下的域名映射到本地端口,也通过了域名验证,实现了本地调试。
调试出现的问题:
1、微信公众号获取用户信息的时候,中文信息乱码,解决思路将响应信息用ISO-8859-1编码一次,然后在用UTF8解码一次,java实现代码如下:
         byte[] bytes = responsetext.getBytes("ISO-8859-1");
       responsetext=new String(bytes,"UTF-8")

2、微信公众号第一步通过code获取access_token时,然后第二步通过access_token获取用户信息,http请求需要时同步依次请求。我在调试的时候,发现使用异步请求的时候,由于第一次和第二步的http请求都是异步,导致access_token发生改变,获取用户信息失败,java实现代码如下:
 // 通过code值获取access_token
            String url = "https://api.weixin.qq.com/sns/oauth2/access_token";
            Map<String, String> params = new HashMap<String, String>();
            params.put("appid", ResourceConfig.getValue("wx_appid"));
            params.put("secret", ResourceConfig.getValue("wx_secret"));
            params.put("code", code);
            params.put("grant_type", "authorization_code");
            String result = HttpUtil.httpPost(url, HttpUtil.redistimeout, params);
            // 解析返回结果
            if (result != null) {
                Map json2Map = JSONUtil.paseJson2Map(result);
                if (json2Map.containsKey("errcode")) {
                    validation.addError("errcode", json2Map.get("errcode") + ":" + json2Map.get("errmsg"));
                    Result validateRlt = ResultValidateUtils.getResult(validation);
                    RenderUtils.renderBeanJson(validateRlt);
                    return;
                } else {
                    // 通过access_token获取用户信息
                    String info_url = "https://api.weixin.qq.com/sns/userinfo";
                    Map<String, String> param = new HashMap<String, String>();
                    param.put("access_token", json2Map.get("access_token").toString());
                    param.put("openid", json2Map.get("openid").toString());
                    param.put("lang", "zh_CN");
                    String info = HttpClientUtil.httpGet(info_url, param, "ISO-8859-1");
                    // 解析返回结果
                    if (info != null) {
                        Map info2Map = JSONUtil.paseJson2Map(info);
                        if (info2Map.containsKey("errcode")) {
                            validation.addError("errcode", json2Map.get("errcode") + ":" + json2Map.get("errmsg"));
                            Result validateRlt = ResultValidateUtils.getResult(validation);
                            RenderUtils.renderBeanJson(validateRlt);
                            return;
                        } else {
                            userBp.dealinfoForWx(validation, info);
                        }
                    }
                }
            }
        }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐