统一下单后台接口 body字段为中文 会返回签名错误该怎么解决啊?
输入字段body为中文时
返回数据为
签名错误
给body字段编码后
签名是成功了 但是支付数据中备注是 ??? 中文编程乱码了
有大神知道该怎么解决吗???谢谢了!!!
我是在做微信小程序调用支付的时候,遇到的问题。本地是springboot java的代码,没有用到微信提供的java的sdk,xml是自己拼装的。
主体思路就是:微信的编码为ISO8859-1。即传给微信的必须是ISO8859-1的编码的数据,微信返回的同样也是ISO8859-1编码的数据。因此,无论本地是UTF-8还是其他编码,在发送的时候,都要改成ISO8859-1的编码数据。
下面我的解决步骤,为这个问题,我搞了好久,
若诸位看了我的步骤仍然不知道怎么做,可以加我QQ:531413005.
注意:body字段直接填中文,不要像问题中描述的那样,先进行编码转换。不必如此
分三步:
1)保证程序中的中文默认为UTF-8的编码。可通过如下代码测试:
new String(“中文”.getBytes(“UTF-8”), “UTF-8”).equals(“中文”)
为true,说明当前中文默认为UTF-8的编码
2)利用JDK自带的MessageDigest进行MD5签名加密,代码如下:
privatestaticString MD5(String s) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
try
MessageDigest mdInst = MessageDigest.getInstance"MD5");
mdInst.update(s.getBytes("UTF-8"));
byte[] md = mdInst.digest();
int = md.length
charstr[] = newchar[ * ];
int k =
forint = ; < ; ++) {
byte byte0 = md[];
str[k++] = hexDigits[byte0 >>> & 0xf];
str[k++] = hexDigits[byte0 & 0xf];
}
returnnewStringstr);
} catch (Exception e) {
e.printStackTrace();
returnnull
}
3)在提交报文到微信统一下单api的地方,将请求参数的编码改为"ISO8859-1"。同样,返回的报文体,用ISO8859-1解码,将其转为UTF-8,才可以看到返回的中文不乱码。代码如下
// 生成统一下单api的请求报文. 其中sign为利用2)中的MD5方法生成的MD5码
StringBuilder request = newStringBuilder();
request.append("<xml>");
for (Map.Entry<String, Object> entry : paraMap.entrySet()) {
request.append("<" + entry.getKey() + ">" + entry.getValue()toString() + "</" + entry.getKey() + ">");
}
request.append("<sign>" + sign + "</sign>");
request.append("</xml>");
// 将报文体转为ISO8859-1String requestParam = newString(requesttoString().getBytes("UTF-8", "ISO8859-1");
// 构造请求头
HttpHeaders headers = newHttpHeaders();
headers.setContentType(MediaType.APPLICATION_XML);
HttpEntity<String> httpEntity = newHttpEntityString>(requestParam, headers);
// 利用RestTemplate发送POST请求
RestTemplate restTemplate = newRestTemplate();
ResponseEntity<String> httpResponse = restTemplate.postForEntity("https://api.mch.weixin.qq.com/pay/unifiedorder", httpEntity, String.class;
String responseBody = nulltry {
// 将响应的报文,有ISO8859-1转为UTF-8
responseBody = newString(httpResponsegetBody().getBytes("ISO8859-1", "utf-8");
logger.info("微信统一下单出参:" + responseBody);
} catch (Exception e) {
logger.error("微信统一下单失败", e);
}