JavaWeb在呼叫微信支付介面的時候,出現的各種奇葩錯誤
阿新 • • 發佈:2019-02-14
第一個錯誤:簽名錯誤
微信給返回的錯誤日誌為:
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[簽名錯誤]]></return_msg> <result_code><![CDATA[FAIL]]></result_code> <err_code><![CDATA[SIGN_ERROR]]></err_code> <err_code_des><![CDATA[簽名錯誤]]></err_code_des> </xml>
我們會發現,即使我們用https://pay.weixin.qq.com/wiki/tools/signverify/,微信自己的簽名工具去生成的簽名,在我們的應用中使用,最後還是一樣的,會報簽名錯誤。
這個就有點操蛋了!網上看到也有好多人遇到這個問題的,到最後我們發現,我們的xml中帶了中文,所以,我們的錯誤就是xml中有中文。
問題已經定位了:XML中有中文
那我們該怎麼辦?
網上找到了解決方案:下面這一段,就是我們測試的時候寫的方法,主要是最後對拼接完的字串要進行編碼格式的轉換,轉成ISO8859-1
public static String getXmlString(){ String result = null; StringBuffer sb = new StringBuffer(); sb.append("<xml>"); sb.append("<amount>1</amount>"); sb.append("<check_name>NO_CHECK</check_name>"); sb.append("<desc>"); sb.append("老闆收錢"); sb.append("</desc>"); sb.append("<mch_appid>wx2bd9961127214cef</mch_appid>"); sb.append("<mchid>11231</mchid>"); sb.append("<nonce_str>5K8264ILTKCH16CQ2502SI8ZNMTM67VS</nonce_str>"); sb.append("<openid>31232132121</openid>"); sb.append("<partner_trade_no>20160616143751</partner_trade_no>"); sb.append("<spbill_create_ip>180.110.77.170</spbill_create_ip>"); sb.append("<sign>1231232132132121</sign>"); sb.append("</xml>"); try { <span style="white-space:pre"> </span><span style="color:#ff0000;">result = new String(sb.toString().getBytes(), "ISO8859-1");</span> } catch (UnsupportedEncodingException e) { e.printStackTrace(); } return result; }
這樣基本就能解決問題了;
但是這個時候你可能還遇到第二個問題:就是即使轉了也沒用,微信還是會返回一個錯誤:引數錯誤:描述資訊存在非UTF8字元
<xml> <return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[引數錯誤:描述資訊存在非UTF8字元]]></return_msg> <result_code><![CDATA[FAIL]]></result_code> <err_code><![CDATA[PARAM_IS_NOT_UTF8]]></err_code> <err_code_des><![CDATA[引數錯誤:描述資訊存在非UTF8字元]]></err_code_des> </xml>
其實這個問題就是我們的Java檔案,他竟然不是UTF8的格式,所以以後JAVA檔案一定都要用UTF8的,改好了之後就真的解決了,中文描述傳送成功。