因工作需要对接微信的扫码支付,这里用到的统一下单支付接口。开始一切正常。可是当传递参数body为中文的时候,返回错误提示:body不是utf8编码。看字面意思是编码不是utf-8,经常做java的朋友都对这类问题见怪不怪了(心中早有了解决方法),可是这次没有想像的那么简单,试过了N种方法,结果要么是:签名不对,要么是:body不是utf8编码。看来这次没有那么简单,毕竟要对接人家的接口,所幸到网上搜索一下,遇到此问题的还真不少,照着别人的解决方法也不好使,所有方法都不行的情况下,只好回头来耐心研究了。还好费了点工夫总算解决,下面说一下解决的方法吧。保证切实可用!
首先有说对中文进行unicode编码,结果试了是不可以的,见下图:
![4ba1d791c60b40ea38113da65ca60e8d.png](https://i-blog.csdnimg.cn/blog_migrate/2fcbce1ffae4bd00cc9b8215fe13fed8.jpeg)
再就是有说进行urlencode编码,试了结果也是不行的:
![36f2376580038f261389e5ef6cc8ead4.png](https://i-blog.csdnimg.cn/blog_migrate/2ebd412f38762d703b33b63637cc5c5e.jpeg)
下面分析一下提单环节用到中文编码的几个地方:
1、xml的内容中中文要使用utf-8
2、对参数签名的加密方法无论用MD5还是SHA256,均需要指定utf-8
3、数据post到签名下单接口时要指定utf-8编码
4、读取微信返回参数时使用utf-8编码(虽然这个不影响业务逻辑,不过指定好可以正确获取微信的中文信息)
然后针对上面的每个环节看一下我的代码:
一、构造map
HashMap map=new HashMap();
String body=RequestUtil.getSafeStr(request, "body");
map.put("appid