遇到一个奇葩的问题

现象:

在输入参数里有中文汉字的时候,通过main方法直接执行的结果和通过接口调用这个方法执行的结果不一样,
在输入参数里没有中文汉字的时候,执行结果是一样的。

方法:

  /**
     * MD5编码
     * @param origin 原始字符串
     * @return 经过MD5加密之后的结果
     */
    public static String MD5Encode(String origin) {
        String resultString = null;
        try {
            resultString = origin;
            MessageDigest md = MessageDigest.getInstance("MD5");
            resultString = byteArrayToHexString(md.digest(resultString.getBytes()));
        } catch (Exception e) {
            e.printStackTrace();
        }
        return resultString;
    }

其中用接口去调用这个方法的结果应该是错的

初步怀疑:jar包 冲突

但是这个问题的jar包冲突真的有点难找,怀疑是执行其他相同的方法,得到了一个错误的结果。

其实就是一个简单的md5加密,很多开源的jar里都带有,现在项目引进多了,依赖之间就有很多冲突了,想排除也不太容易,看很仔细的看。

不知道有没有大神遇到过类似的问题,说下解决的思路和经验。

==============================================================
这个问题是腾讯微信支付SDK里的工具类有问题,已经解决了,问题在于resultString.getBytes(),是利用的系统编码,用main方法执行是一种编码,在tomcat里运行又是一种编码,所以这里要统一成utf-8,所以把resultString.getBytes()改成resultString.getBytes(“utf-8”),不过后来看到作者也修复了这个问题,可能没有及时通知。地址:https://github.com/grz/wxpay_scanpay_java_sdk_proj/issues/1

============================================================

其实这段代码很容易看出来坑,不用debug。

阅读 5.1k
6 个回答

编码问题吧……

为什么不debug一下呢

通过main方法直接执行的结果和通过接口调用这个方法执行的结果不一样

分别用两种方式运行一下,然后调试看看传入的参数有什么不同

应该是编码问题吧,最好程序中统一解码为utf8或unicode

很有可能是编码问题

太感谢了,我特么一下午就在折腾这个,折腾得都怀疑人生了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题