• 微信公众号开发--获取用户信息中文乱码的解决方案,获取自定义菜单中文乱码解决方案

    在微信开发中我们会经常需要获取用户的信息。
    微信给我们提供了获取用户信息的api,
    地址为

    https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

    将其中的access_token替换为我们的access_token
    openid为关注用户的openid就可以获取到用户的信息了。

    问题描述

    不过获取到的数据却是中文乱码

    这里写图片描述

    而用java程序获取的结果也是一样的

    这里写图片描述

    解决方案

    这个乱码主要是由于微信那边采用的是“ISO-8859-1”编码造成的。

    我们对获取的结果进行编码

    这里写图片描述

    关键代码

        String token = AccessTokenTool.getAccessToken();
        String URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
        // 原始json
        String jsonResult = HttpUtil.sendGet(URL.replace("OPENID", openid).replace("ACCESS_TOKEN", token));
        System.out.println(jsonResult);
        // 编码后的json
        String json = new String(jsonResult.getBytes("ISO-8859-1"), "UTF-8");
        System.out.println(json);

    获取自定义菜单乱码也是一样的解决方法

    这里写图片描述

    参考文献

    获取用户基本信息(UnionID机制)
    HttpUtil工具类参考

    展开全文
  • * 微信开放平台获取用户信息连接 * %s替换 */ private final static String OPEN_USER_INFO_URL="https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s"; // privat...

    5.通过access——token获取用户的信息

     /**
       * 微信开放平台获取用户信息连接
       * %s替换
       */
      private final static String OPEN_USER_INFO_URL="https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s";
    //  private final static String OPEN_USER_INFO_URL="https://api.weixin.qq.com/sns/auth?access_token=%s&openid=%s";

     

     

     

      String accessTokenUrl=String.format(WeChatConfig.getOpenAccessTokenUrl(),weChatConfig.getOpenAppid(),weChatConfig.getOpenAppsecret(),code);
            Map<String, Object> baseMap = HttpUtils.doGet(accessTokenUrl);
            if (baseMap==null|| baseMap.isEmpty()){
                return null;
            }
            String  access_token = (String) baseMap.get("access_token");
            String  openid = (String) baseMap.get("openid");
    
    //获取用户信息
            String userInfoUrl = String.format(WeChatConfig.getOpenUserInfoUrl(),access_token,openid);
            Map<String, Object> userInfoMap = HttpUtils.doGet(userInfoUrl);
            if (userInfoMap==null||userInfoMap.isEmpty()){
                return null;
            }
            String nickname= (String)userInfoMap.get("nickname");
            Integer sex = (Integer) userInfoMap.get("sex");
            Integer province = (Integer) userInfoMap.get("province");
    
            String city= (String)userInfoMap.get("city");
            String country= (String)userInfoMap.get("country");
            String headimgurl= (String)userInfoMap.get("headimgurl");
    
            return null;
        }

     //获取用户基本信息
        String userInfoUrl = String.format(WeChatConfig.getOpenUserInfoUrl(),accessToken,openId);
        //获取access_token
        Map<String ,Object> baseUserMap =  HttpUtils.doGet(userInfoUrl);
    
        if(baseUserMap == null || baseUserMap.isEmpty()){ return  null; }
        String nickname = (String)baseUserMap.get("nickname");
    
        Double sexTemp  = (Double) baseUserMap.get("sex");
        int sex = sexTemp.intValue();
        String province = (String)baseUserMap.get("province");
        String city = (String)baseUserMap.get("city");
        String country = (String)baseUserMap.get("country");
        String headimgurl = (String)baseUserMap.get("headimgurl");
        StringBuilder sb = new StringBuilder(country).append("||").append(province).append("||").append(city);
        System.out.println(""+headimgurl);
        String finalAddress = sb.toString();
        try {
            //解决乱码
            nickname = new String(nickname.getBytes("ISO-8859-1"), "UTF-8");
            finalAddress = new String(finalAddress.getBytes("ISO-8859-1"), "UTF-8");
            System.out.println(""+nickname);
    
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    
        return null;
    }

     

     

     

     

    官方文档:

    https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419316518&token=&lang=zh_CN

    请求说明

    http请求方式: GET
    https://api.weixin.qq.com/sns/auth?access_token=ACCESS_TOKEN&openid=OPENID
    

    参数说明

    参数 是否必须 说明
    access_token 调用接口凭证
    openid 普通用户标识,对该公众帐号唯一

    返回说明

    正确的Json返回结果:

    {
    "errcode":0,"errmsg":"ok"
    }
    

    错误的Json返回示例:

    {
    "errcode":40003,"errmsg":"invalid openid"
    }

    获取用户个人信息(UnionID机制)

    接口说明

    此接口用于获取用户个人信息。开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。请注意,在用户修改微信头像后,旧的微信头像URL将会失效,因此开发者应该自己在获取用户信息后,将头像图片保存下来,避免微信头像URL失效后的异常情况。

    请求说明

    http请求方式: GET
    https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID

     

    参数说明

    防止乱码问题

    参数 是否必须 说明
    access_token 调用凭证
    openid 普通用户的标识,对当前开发者帐号唯一
    lang 国家地区语言版本,zh_CN 简体,zh_TW 繁体,en 英语,默认为zh-CN

    返回说明

    正确的Json返回结果:

    {
    "openid":"OPENID",
    "nickname":"NICKNAME",
    "sex":1,
    "province":"PROVINCE",
    "city":"CITY",
    "country":"COUNTRY",
    "headimgurl": "http://wx.qlogo.cn/mmopen/g3MonUZtNHkdmzicIlibx6iaFqAc56vxLSUfpb6n5WKSYVY0ChQKkiaJSgQ1dZuTOgvLLrhJbERQQ4eMsv84eavHiaiceqxibJxCfHe/0",
    "privilege":[
    "PRIVILEGE1",
    "PRIVILEGE2"
    ],
    "unionid": " o6_bmasdasdsad6_2sgVt7hMZOPfL"
    
    }
    
    参数 说明
    openid 普通用户的标识,对当前开发者帐号唯一
    nickname 普通用户昵称
    sex 普通用户性别,1为男性,2为女性
    province 普通用户个人资料填写的省份
    city 普通用户个人资料填写的城市
    country 国家,如中国为CN
    headimgurl 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
    privilege 用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
    unionid 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。

    建议:

    开发者最好保存用户unionID信息,以便以后在不同应用中进行用户信息互通。

    错误的Json返回示例:

    {
    "errcode":40003,"errmsg":"invalid openid"
    }
    展开全文
  • 在做微信公众号开发获取用户授权取用户昵称的时候发现有字符乱码的情况,百度了一下发现很多网友遇到这个问题,记录一下解决办法。 String url = ...
        

    在做微信公众号开发获取用户授权取用户昵称的时候发现有字符乱码的情况,百度了一下发现很多网友遇到这个问题,记录一下解决办法。

    String url = "https://api.weixin.qq.com/sns/userinfo?access_token="+accessToken+"&openid="+openId+"&lang=zh_CN";
    HttpClient client =  new HttpClient();
    GetMethod get=new GetMethod(url);
    client.executeMethod(get);
    String response = get.getResponseBodyAsString();
    JSONObject body = (JSONObject) JSON.parse(response);
    if (null!=body&&null!=body.get("openid")) {
        String nickName = String.valueOf(body.get("nickname"));
       /**进行编码*/
        nickName = new String(nickName.getBytes("ISO-8859-1"), "UTF-8");
        System.out.println("nickName:"+nickName);
    }
    

    这样进行UTF-8编码就行了。
    原文作者技术博客:https://www.jianshu.com/u/ac4daaeecdfe
    95后前端妹子一枚,爱阅读,爱交友,将工作中遇到的问题记录在这里,希望给每一个看到的你能带来一点帮助。
    欢迎留言交流

    展开全文
  • 包括了在微信公众号中获取微信用户openid的方法,然后根据access_token和openid获取微信用户基本信息的方法。解决了返回的微信用户基本信息乱码问题以及解决乱码问题时需要的jar包。
  • 为什么80%的码农都做不了架构师?>>> ...

    在微信开发中我们会经常需要获取用户的信息。 微信给我们提供了获取用户信息的api, 地址为

    https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN

    将其中的accesstoken替换为我们的accesstoken openid为关注用户的openid就可以获取到用户的信息了。

    问题描述 不过获取到的数据却是中文乱码

     

    而用java程序获取的结果也是一样的

    解决方案 这个乱码主要是由于微信那边采用的是“ISO-8859-1”编码造成的。

    我们对获取的结果进行编码

    关键代码

     String token = AccessTokenTool.getAccessToken();
        String URL = "https://api.weixin.qq.com/cgi-bin/user/info?access_token=ACCESS_TOKEN&openid=OPENID&lang=zh_CN";
        // 原始json
        String jsonResult = HttpUtil.sendGet(URL.replace("OPENID", openid).replace("ACCESS_TOKEN", token));
        System.out.println(jsonResult);
        // 编码后的json
        String json = new String(jsonResult.getBytes("ISO-8859-1"), "UTF-8");
        System.out.println(json);
    

    获取自定义菜单乱码也是一样的解决方法

    转载于:https://my.oschina.net/gyuan/blog/2874076

    展开全文
  • 在绑定用户微信时,需要从微信获取用户信息,此处容易出现乱码。 JSONObject jo = this.getAccessTokenOpenid(code); StringBuilder sb = new StringBuilder("... ...

    在绑定用户微信时,需要从微信获取用户信息,此处容易出现乱码。

            JSONObject jo = this.getAccessTokenOpenid(code);
    
            StringBuilder sb = new StringBuilder("https://api.weixin.qq.com/sns/userinfo?access_token=");
            sb.append(jo.getString("access_token"));
            sb.append("&openid=").append(jo.getString("openid")).append("&lang=zh_CN");
            
            HttpMethod method = new PostMethod(sb.toString());
            HttpClient httpclient = new HttpClient();
            
            httpclient.executeMethod(method);        
            
            String result = new String(method.getResponseBody(), "utf-8");
            
    //        String result = method.getResponseBodyAsString();
    System.out.println("getWeiXinUserInfo result = " + result); JSONObject userInfo = JSON.parseObject(result, JSONObject.class);

    String result = method.getResponseBodyAsString();

    换成 String result = new String(method.getResponseBody(), "utf-8");

    即可。

    method.getResponseBodyAsString()

    Returns the response body of the HTTP method, if any, as a String. If response body is not available or cannot be read, null is returned. The raw bytes in the body are converted to a String using the character encoding specified in the response's Content-Type header, or ISO-8859-1 if the response did not specify a character set.

    Note that this method does not propagate I/O exceptions. If an error occurs while reading the body, null will be returned.

    而:new String(method.getResponseBody(), "utf-8")

    method.getResponseBody() 返回的原生字节用指定的 utf-8 编码,编码成String。因为微信的返回值就是采用的utf-8编码。

    运行结果:

    没有乱码出现。

     

    展开全文
  • // 指定编码格式 in = new BufferedReader(new InputStreamReader( connection.getInputStream(),"UTF-8")); 在指定编码格式之后乱码格式就会解决
  • 在使用微信api"https://api.weixin.qq.com/cgi-bin/user/info"获取微信用户信息时会遇到乱码 >>> import requests >>> import json >>> get_fansInfo_api = '...
  • 获取加密数据后再获取jscode的话,sessionkey会变化,所以新的sessionkey没法解密老的加密数据,这样在第一次获取手机号的时候会获取成功,但是一旦jscode获取的sessionkey失效后,就会解密失败, 这样就必须先获取...
  • 之前做微信公众号项目开发的时候,发现根据微信的接口获得用户的昵称,如果昵称后面有特殊的图标,字符,在网页上展示微信昵称的时候,很容易出现乱码;现解决如下: 将昵称存入数据库的时候,对其进行编码 ...
  • 微信小程序开发时想必大家都会用到button的 open-type="getUserInfo"获取用户信息,但获取到的数据要传到后台时发现,地址什么的都是拼音,,但要求的都是中文,看到网上说 像下面那样就可以了 结果还是拼音,,, ...
  • 微信小程序获取带表情的微信乱码问题 在后台获取微信用户数据后,对微信名进行UTF-8编码 URLEncoder.encode(nickName, "utf-8") ,将编码后的结果储存到数据库中,环境为mysql数据库。 ...
  • 前端微信小程序获取code,后台使用asp获取session_key和openid;然后结合iv和encryptedData解密出微信用户手机号码 【操作步骤】 第1步:wx.login获取code 第2步:传递code到服务器,获取session_key和openid 第3步...
  • 于是开发出来后安卓环境下无任何的问题,但是ios下却不能分享,还有就是有的微信昵称是表情的 思考后做出一些判断 首先在后台取出微信的昵称后要对昵称进行编码在插入数据库 WxUser wxUser = WxUtils.getWxUser...
  • using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text; using System.Security.Cryptography; using System.IO;...using System.Text.Regular
  • 前言: 在微信公众号请求用户网页授权之前,开发者需要先在自己的公众平台配置好基本配置,修改授权回调域名JS安全域名。并且需要先获取到全局access_token,这里不对全局access_token的获取做详细讲解,可以参考...
1 2 3 4 5 ... 20
收藏数 2,953
精华内容 1,181