1. 程式人生 > >JavaWeb在呼叫微信支付介面的時候,出現的各種奇葩錯誤

JavaWeb在呼叫微信支付介面的時候,出現的各種奇葩錯誤

第一個錯誤:簽名錯誤

微信給返回的錯誤日誌為:

<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的,改好了之後就真的解決了,中文描述傳送成功。