微信統一下單body傳中文導致簽名失敗和亂碼的問題
阿新 • • 發佈:2019-01-04
呼叫微信統一下單介面時如果返回簽名錯誤,可以先去官方提供的線上簽名去校驗一下,這裡只能校驗簽名演算法有沒有問題。
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; }