收藏
回答

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

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


输入字段body为中文时


返回数据为


签名错误


给body字段编码后


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

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

最后一次编辑于  2018-03-08
回答关注问题邀请回答
收藏

2 个回答

  • Lucene
    Lucene
    2019-12-20

    我是在做微信小程序调用支付的时候,遇到的问题。本地是springboot java的代码,没有用到微信提供的java的sdk,xml是自己拼装的。


    主体思路就是:微信的编码为ISO8859-1。即传给微信的必须是ISO8859-1的编码的数据,微信返回的同样也是ISO8859-1编码的数据。因此,无论本地是UTF-8还是其他编码,在发送的时候,都要改成ISO8859-1的编码数据。

    下面我的解决步骤,为这个问题,我搞了好久,

    注意: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("");
    for (Map.Entry entry : paraMap.entrySet()) {
        request.append("<" + entry.getKey() + ">" + entry.getValue()toString() + "");
    }
    request.append("" + sign + "");
    request.append("");
    // 将报文体转为ISO8859-1String requestParam = newString(requesttoString().getBytes("UTF-8", "ISO8859-1");
    // 构造请求头
    HttpHeaders headers = newHttpHeaders();
    headers.setContentType(MediaType.APPLICATION_XML);
    HttpEntity httpEntity = newHttpEntityString>(requestParam, headers);
    // 利用RestTemplate发送POST请求
    RestTemplate restTemplate = newRestTemplate();
    ResponseEntity 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);
    }
    
    2019-12-20
    有用
    回复
  • 任虎
    任虎
    2019-05-21

    解决了吗? 我也头疼这个

    2019-05-21
    有用
    回复
登录 后发表内容