项目对接微信公众号平台时,微信的官方给出的建议是使用wechat4j。官方建议的,自然心里踏实,但实际用起来时发现wechat4j埋有很多雷,最让人心烦意乱的就是中文乱码问题。

之前写过一篇为JAXB和response设置编码,解决wechat4j中文乱码,解决的是智能输入时反馈信息的乱码,遇到同样问题的伙伴可以去参考一下解决方案。

今天要写的是利用wechat4j获取用户昵称乱码的问题。

一、问题描述

UserManager userManager = new UserManager();
org.sword.wechat4j.user.User user = userManager.getUserInfo(tokenResponse.getOpenid());
thirdLoginMember.setThird_name(user.getNickName());

项目运行时,一旦昵称为中文,此方法获得的昵称就是乱码,引发乱码的原因其实很直白,无非就是编码方式不匹配。

二、问题分析

我们来追本溯源,看看以下的代码,我们能感受到问题具体出在哪。

wechat4j中的代码

public User getUserInfo(String openId) {return getUserInfo(openId, null);
}public User getUserInfo(String openId, LanguageType lang) {String url = USER_INFO_GET_URL + TokenProxy.accessToken() + "&openid=" + openId;if (lang != null) {url += "&lang=" + lang.name();}String resultStr = HttpUtils.get(url);logger.info("return data " + resultStr);try {WeChatUtil.isSuccess(resultStr);} catch (WeChatException e) {logger.error(e.getMessage());e.printStackTrace();return null;}User user = JSONObject.parseObject(resultStr, User.class);return user;
}public static String get(String url){return httpGet(url);
}private static String httpGet(String url) {try {HttpEntity entity = Request.Get(url).execute().returnResponse().getEntity();return entity != null ? EntityUtils.toString(entity) : null;} catch (Exception e) {logger.error("get请求异常," + e.getMessage() + "\n get url:" + url);e.printStackTrace();}return null;
}

httpcore-4.3.3.jar中的代码

public static String toString(final HttpEntity entity)throws IOException, ParseException {return toString(entity, (Charset)null);
}public static String toString(final HttpEntity entity, final Charset defaultCharset) throws IOException, ParseException {Args.notNull(entity, "Entity");final InputStream instream = entity.getContent();if (instream == null) {return null;}try {Args.check(entity.getContentLength() <= Integer.MAX_VALUE,"HTTP entity too large to be buffered in memory");int i = (int)entity.getContentLength();if (i < 0) {i = 4096;}Charset charset = null;try {final ContentType contentType = ContentType.get(entity);if (contentType != null) {charset = contentType.getCharset();}} catch (final UnsupportedCharsetException ex) {if (defaultCharset == null) {throw new UnsupportedEncodingException(ex.getMessage());}}if (charset == null) {charset = HTTP.UTF8_CONTENT_CHARSET;}logger.info("输出流的转码方式为:" + charset);final Reader reader = new InputStreamReader(instream, charset);final CharArrayBuffer buffer = new CharArrayBuffer(i);final char[] tmp = new char[1024];int l;while((l = reader.read(tmp)) != -1) {buffer.append(tmp, 0, l);}return buffer.toString();} finally {instream.close();}
}

从上述代码中可得知,wechat4j在取得到参数后,调用httpcore-4.3.3.jar中的EntityUtils类的toString()方法,该方法默认使用的编码方式是“ISO-8859-1”。看到这里,你也许就恍然大悟了,原来如此嘛。那,该如何改动呢?

三、问题解决之道

wechat4j是一个jar包,git上提供了源码下载,你可以选择直接在项目中引入wechat4j.jar,也可以选择把源码作为一个导入项目引入到项目中,我选择的是第二种做法,这种方案方便我们调试,以及修改源码。

在说解决之道之前,我先啰嗦一点关于eclipse中项目之间引用的注意事项。

上图是我项目中wechat4j源码的目录:

  1. apache.http就是httpcore-4.3.3.jar的源码。
  2. sword是wechat4j.jar的源码。
  3. tomcat 7 是把该项目引入到一个web项目后,自动出现的,我顺带把wechat4j所需要的jar包添加到lib包下。
  4. 本来wechat4j是一个Java项目。

关于deployment assembly我并没有很好的理解其作用(Define packaging structure for this Java EE Web Application project.),大致的意思是把被引入的项目编译成jar包供引用项目使用。

build path中引入项目。

project reference。

关于这三个之间的关联关系,我真是没有搞明白,敬请小伙伴们指导。

PS:请特别注入,针对wechat4j的引入,被引入项目(ymeng)中不能再放httpcore-4.3.3.jar,否则wechat4j中的httpcore将不会起作用。

那么接下来,我们该好好看看怎么解决了,其实方法依然可知。

第一种,EntityUtils.toString()方法中设置编码方式。

return entity != null ? EntityUtils.toString(entity,"utf-8") : null;

这个其实应该交由wechat4j来做的, 但它坑了。

第二种,EntityUtils.toString方法中设置默认的编码方式为utf-8.

if (charset == null) {charset = HTTP.UTF8_CONTENT_CHARSET;
}

看完本篇文章,大家是否略有所获?

wechat4j获取用户昵称乱码修复相关推荐

  1. 微信昵称乱码 mysql_微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案...

    微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案如下: 问题产生原因:由于数据库及属性一致设为utf8,而utf8只支持1-3个字节.当用户昵称为emoji表情时,获取用户基本信 ...

  2. 微信公众号H5页面获取用户昵称头像等信息(Java)

    H5页面获取微信用户信息操作流程 (一)获取微信权限,由微信用户确认 (二)获取相应的ACCESS_TOKEN和OPENID信息 (三)根据ACCESS_TOKEN和OPENID信息获取相应的用户信息 ...

  3. 微信小程序【获取用户昵称头像和昵称(附源码)】

    获取用户昵称头像和昵称 wx.getUserProfile bindgetuserinfo 登录过程 前端源码:https://pan.baidu.com/s/1uz2Gm2FMB-8RFVkhlHY ...

  4. 微信小程序——最新获取用户昵称和头像的方法总结

    前段时间微信小程序对获取用户昵称和头像方法进行了更新,网上很多的文章都已经不适用了,这里简单总结一下 首先,传统接口wx.getUserInfo的效果会弹出一个给用户的弹窗,需要用户授权,经过测试传统 ...

  5. Java获取游戏头像_小程序最新获取用户昵称和头像的方法总结

    前段时间微信小程序对获取用户昵称和头像方法进行了更新,网上很多的文章都已经不适用了,这里简单总结一下 首先,传统接口wx.getUserInfo的效果会弹出一个给用户的弹窗,需要用户授权,经过测试传统 ...

  6. wechat.php+获取昵称,微信后台代码,获取用户昵称

    [PHP]代码<?php define("TOKEN", "weixin"); define("NO_OAUTH2", "n ...

  7. 微信小程序获取用户昵称和头像

    getUserInfo.js Page({data: {userInfo: {},hasUserInfo: false,canIUseGetUserProfile: false,},onLoad() ...

  8. 微信小程序 - 最新获取用户昵称 / 头像(wx.getUserProfile 接口被废弃后的代替方案)详细教程,2022 年之后的所有微信小程序,获取用户信息最新详细教程,附带示例源代码

    前言 由于官方修改了 "用户头像昵称获取规则" ,导致网上几乎所有教程全部失效,本文来做最新详细教程. 2022 年往后(官方废弃了 wx.getUserProfile 接口),本 ...

  9. 微信小程序获取用户昵称中含有emoj表情,后端处理方式以及回显。

    1.在做微信小程序的时候遇到了用户昵称中含有emoj表情无法入库的情况. ### Cause: java.sql.SQLException: Incorrect string value: '\xF0 ...

最新文章

  1. 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(二)寻找物体的凸包
  2. 5 交换机-direct (路由)
  3. 用chkconfig配置linux自启动服务
  4. 动画专业艺术里最懂计算机的,美国数字媒体艺术专业了解一下!
  5. 第四十九期:化繁为简的五种码农必备工具
  6. Redis:12---有序集合对象
  7. 更换ssh通信证书,ssh更改公钥和密钥,以保证服务器安全
  8. 动态规划——最长公共子序列
  9. 在线JSON压缩工具
  10. 测试开发工程师简历模版
  11. 定性特征转化为定量特征之factorize
  12. LaTeX IEEE 模板 图片引用编号为大写罗马数字问题
  13. 【CSAPP】二进制拆弹实验
  14. C51 数码管的动态显示 dynamic display method of digital tube
  15. Unity3d 传送门效果制作
  16. APM32F103 RTC内部时钟源报警中断例程测试
  17. 【学堂上新】大规模动画模拟的一种实现方法
  18. matlab kmo检验,RPCL(Rival Penalized Competitive Learning)在matlab下的实现
  19. 【码字必看】一篇文章带你轻松上手MarkDown
  20. PTA_数据结构与算法_7-7 六度空间 (30分)

热门文章

  1. 【杂谈】360极速浏览器本地收藏夹的文件在哪里?
  2. 软件测试基础 - 单元测试理论部分
  3. IT江湖--这个冬天注定横尸遍野
  4. 电脑浏览器提示“ Adobe Flash Player 插件已被屏蔽”修复方法
  5. 雅俗共享的微信小程序《老子探秘》,大家评价一下好坏
  6. POE供电 网线 电源 网络情况图
  7. MySQL按拼音首字母排序
  8. 研究生如何做好科研和发表文章
  9. 美股历史行情数据 API 接口
  10. 2021-05-31