1. 程式人生 > >微信統一下單body傳中文導致簽名失敗和亂碼的問題

微信統一下單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;
}