小程序
小游戏
企业微信
微信支付
扫描小程序码分享
输入字段body为中文时
返回数据为
签名错误
给body字段编码后
签名是成功了 但是支付数据中备注是 ??? 中文编程乱码了
有大神知道该怎么解决吗???谢谢了!!!
2 个回答
加粗
标红
插入代码
插入链接
插入图片
上传视频
我是在做微信小程序调用支付的时候,遇到的问题。本地是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); }
你好,麻烦通过点击下方“反馈信息”按钮,提供出现问题的。
解决了吗? 我也头疼这个
关注后,可在微信内接收相应的重要提醒。
请使用微信扫描二维码关注 “微信开放社区” 公众号
我是在做微信小程序调用支付的时候,遇到的问题。本地是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); }
解决了吗? 我也头疼这个