因为公司的项目要用微信支付,部署时候发现总是报签名错,经过排查,原来是编码问题,那么找到原因了就来解决问题吧,本文详细介绍了三种解决方案,如果时间有限没空看完的话,那就直接奔第三种方案吧,希望能帮助到大家。
第一种解决方案:设置tomcat编码为utf-8
tomcat在window环境默认编码是gbk,所以要设置tomcat编码为utf-8。
第一步:在catalina.bat里面的头部第二行添加
set JAVA_OPTS=-xms128m -Xmx512m -XX:MaxPermSize=256m -Dfile.encoding=utf-8 -Dsun.jnu.encoding=utf-8
让java环境使用utf-8编码
第二步:在server.xml添加
URIEncoding=UTF-8 useBodyEncodingForURI=true,使tomcat发送的请求使用utf-8,如下面代码
<Connector port=8081 protocol=HTTP/1.1
- connectionTimeout=20000
redirectPort=8443 URIEncoding=UTF-8 useBodyEncodingForURI=true />
控制台可能会有乱码,但是改成gbk就没事,但是微信签名失败
第二种解决方案:进行body转码
String body = new String(body中文字段值.toString().getBytes(ISO8859-1),UTF-8);
但是:微信返回的商品名会出现乱码
第三种解决方案:修改签名MD5编码(这个解决方案才是王道)
tomcat在window环境默认编码是gbk,所以在进行md5签名的时候设置编码,为utf-8就可以了。
这个是我用的MD5签名工具类:
public class MD5Util { private static String byteArrayToHexString(byte b[]) { StringBuffer resultSb = new StringBuffer(); for (int i = 0; i < b.length; i++) resultSb.append(bytetoHexString(b[i])); return resultSb.toString(); } private static String bytetoHexString(byte b) { int n = b; if (n < 0) n += 256; int d1 = n / 16; int d2 = n % 16; return hexDigits[d1] + hexDigits[d2]; } public static String MD5Encode(String origin, String charsetname) { String resultString = null; try { resultString = new String(origin); MessageDigest md = MessageDigest.getInstance(MD5); if (charsetname == null || .equals(charsetname)) resultString = byteArrayToHexString(md.digest(resultString .getBytes())); else resultString = byteArrayToHexString(md.digest(resultString .getBytes(charsetname))); } catch (Exception exception) { } return resultString; } private static final String hexDigits[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f }; }
相关推荐:
原文地址:https://www.jb51.cc/wxmp/1202900.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。