wechat4j获取用户昵称乱码修复
项目对接微信公众号平台时,微信的官方给出的建议是使用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源码的目录:
- apache.http就是httpcore-4.3.3.jar的源码。
- sword是wechat4j.jar的源码。
- tomcat 7 是把该项目引入到一个web项目后,自动出现的,我顺带把wechat4j所需要的jar包添加到lib包下。
- 本来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获取用户昵称乱码修复相关推荐
- 微信昵称乱码 mysql_微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案...
微信网页开发获取用户昵称乱码 微信昵称包含emoji表情乱码的解决方案如下: 问题产生原因:由于数据库及属性一致设为utf8,而utf8只支持1-3个字节.当用户昵称为emoji表情时,获取用户基本信 ...
- 微信公众号H5页面获取用户昵称头像等信息(Java)
H5页面获取微信用户信息操作流程 (一)获取微信权限,由微信用户确认 (二)获取相应的ACCESS_TOKEN和OPENID信息 (三)根据ACCESS_TOKEN和OPENID信息获取相应的用户信息 ...
- 微信小程序【获取用户昵称头像和昵称(附源码)】
获取用户昵称头像和昵称 wx.getUserProfile bindgetuserinfo 登录过程 前端源码:https://pan.baidu.com/s/1uz2Gm2FMB-8RFVkhlHY ...
- 微信小程序——最新获取用户昵称和头像的方法总结
前段时间微信小程序对获取用户昵称和头像方法进行了更新,网上很多的文章都已经不适用了,这里简单总结一下 首先,传统接口wx.getUserInfo的效果会弹出一个给用户的弹窗,需要用户授权,经过测试传统 ...
- Java获取游戏头像_小程序最新获取用户昵称和头像的方法总结
前段时间微信小程序对获取用户昵称和头像方法进行了更新,网上很多的文章都已经不适用了,这里简单总结一下 首先,传统接口wx.getUserInfo的效果会弹出一个给用户的弹窗,需要用户授权,经过测试传统 ...
- wechat.php+获取昵称,微信后台代码,获取用户昵称
[PHP]代码<?php define("TOKEN", "weixin"); define("NO_OAUTH2", "n ...
- 微信小程序获取用户昵称和头像
getUserInfo.js Page({data: {userInfo: {},hasUserInfo: false,canIUseGetUserProfile: false,},onLoad() ...
- 微信小程序 - 最新获取用户昵称 / 头像(wx.getUserProfile 接口被废弃后的代替方案)详细教程,2022 年之后的所有微信小程序,获取用户信息最新详细教程,附带示例源代码
前言 由于官方修改了 "用户头像昵称获取规则" ,导致网上几乎所有教程全部失效,本文来做最新详细教程. 2022 年往后(官方废弃了 wx.getUserProfile 接口),本 ...
- 微信小程序获取用户昵称中含有emoj表情,后端处理方式以及回显。
1.在做微信小程序的时候遇到了用户昵称中含有emoj表情无法入库的情况. ### Cause: java.sql.SQLException: Incorrect string value: '\xF0 ...
最新文章
- 《OpenCV3编程入门》学习笔记8 图像轮廓与图像分割修复(二)寻找物体的凸包
- 5 交换机-direct (路由)
- 用chkconfig配置linux自启动服务
- 动画专业艺术里最懂计算机的,美国数字媒体艺术专业了解一下!
- 第四十九期:化繁为简的五种码农必备工具
- Redis:12---有序集合对象
- 更换ssh通信证书,ssh更改公钥和密钥,以保证服务器安全
- 动态规划——最长公共子序列
- 在线JSON压缩工具
- 测试开发工程师简历模版
- 定性特征转化为定量特征之factorize
- LaTeX IEEE 模板 图片引用编号为大写罗马数字问题
- 【CSAPP】二进制拆弹实验
- C51 数码管的动态显示 dynamic display method of digital tube
- Unity3d 传送门效果制作
- APM32F103 RTC内部时钟源报警中断例程测试
- 【学堂上新】大规模动画模拟的一种实现方法
- matlab kmo检验,RPCL(Rival Penalized Competitive Learning)在matlab下的实现
- 【码字必看】一篇文章带你轻松上手MarkDown
- PTA_数据结构与算法_7-7 六度空间 (30分)