【微信支付】统一下单后台接口 body字段为中文 会返回签名错误该怎么解决啊?
发布于 6 年前 作者 xiuying03 15252 次浏览 来自 问答

统一下单后台接口 body字段为中文 会返回签名错误该怎么解决啊?

输入字段body为中文时

返回数据为

签名错误

给body字段编码后

签名是成功了 但是支付数据中备注是 ??? 中文编程乱码了

有大神知道该怎么解决吗???谢谢了!!!

2 回复

我是在做微信小程序调用支付的时候,遇到的问题。本地是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);
}

解决了吗? 我也头疼这个

回到顶部