微信统一下单body传中文导致签名失败和乱码的问题

调用微信统一下单接口时如果返回签名错误,可以先去官方提供的在线签名去校验一下,这里只能校验签名算法有没有问题。

https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=20_1

如果这里校验签名没有问题,但实际调用返回的却是签名错误,可能有两种情况:

一、仔细对比接口参数,注意参数大小写,参数是否有缺失等问题。

二、传值编码问题。如果全是英文能调用成功,有中文值就传输失败,那多半就是这个问题。

本人遇到的就是第二种情况。

解决方法:

我首先想到的是给请求的字符串设置utf-8编码

String requestStr = new String(WXPayUtil.mapToXml(requestMap).getBytes(),"utf-8")

设置过后,请求仍然是签名错误。通过日志查看请求字符串是没有乱码的。然后网上查了一下,看到可能是传输的编码问题,然后还真是这个问题,修改过后成功解决。这个问题还好,没化太长时间,调用js API唤起微信的支付控件(也就是支付框)那里折腾了我一天多,等我有空也把这个问题做个记录。

    
public static String sendXmlPost(String url, String xmlStr){
		HttpClient hc = new HttpClient();
		String result = null;
		hc.getHttpConnectionManager().getParams().setConnectionTimeout(1000 * 5); // 链接超时5秒
		hc.getHttpConnectionManager ().getParams().setSoTimeout(1000 * 5); // 读取超时5秒
		PostMethod post = new PostMethod(url);
		post.addRequestHeader("Content-Type", "text/xml");
		post.setRequestHeader("charset","utf-8");
//		post.setRequestBody(xmlStr); 不设置传输编码格式,会发生传输乱码,导致签名失败
		try {
			post.setRequestEntity(new StringRequestEntity(xmlStr, "text/xml", "utf-8"));
		} catch (UnsupportedEncodingException e1) {
			log.error(e1.getMessage(),e1);
		}
		try {
			int code = hc.executeMethod(post);
			log.info("请求认证返回码:" + code);
		} catch (HttpException e) {
			log.error(e.getMessage());
		} catch (IOException e) {
			log.error(e.getMessage());
		}
		try {
			result = new String(post.getResponseBody(), "utf-8");
//			result = post.getResponseBodyAsString().getBytes();
			log.info("请求返回结果:" + result);
		} catch (IOException e) {
			log.error(e.getMessage());
		}finally{   //释放连接资源
			if(post != null){
				post.releaseConnection();
				hc.getHttpConnectionManager().closeIdleConnections(0);
			}
		}
		return result;
	}


你可能感兴趣的:(微信开发)