微信支付jsapi缺少參數 total_fee 錯誤分析與解決方法

這篇文章主要介紹了微信支付jsapi缺少參數 total_fee 錯誤分析與解決方法,需要的朋友可以參考下

微信支付jsapi缺少參數 total_fee,其實很多參數錯誤都會報這個錯,其實不一定是參數 total_fee,所以最好是單步或者在日誌文件輸出中間結果,畢竟服務器上沒幾個裝開發軟件的。

最近更換服務器之後,加上了nginx做代理並做了負載均衡後,微信支付第一次支付缺少參數 total_fee,再支付就可以,再點支付有報錯缺少參數 total_fee,好奇怪,按理說是不應該報錯或者要就一直報錯,看了好一會代碼,沒問題,最後把統一下單的參數打印到後臺,終於發現問題

統一下單中spbill_create_ip參數一會是127.0.0.1(ipv4),一會是0:0:0:0:0:0:0:1(ipv6)

當爲ipv4是可以正常調用,爲ipv6是就發生缺少參數 total_fee錯誤,其實後臺報錯是

<xml>
<return_code>
<![CDATA[FAIL]]>
</return_code>
<return_msg><![CDATA[invalid spbill_create_ip]]></return_msg>
</xml>

從中可以發現

1、微信支付不支持ipv6;

2、spbill_create_ip參數雖然要求爲非空,但是微信只是校驗了非空,沒有根本要求要實際的用戶端實際ip,(127.0.0.1都能發起支付);

3、同時,我們也發現爲什麼ipv4情況下會一直是127.0.0.1,因爲用了nginx做了代理,所以request.getRemoteAddr獲取的IP永遠是本機地址。

確定問題所在,下面解決問題,把獲取IP地址的方法換一下

原來是

parameterMap.put("spbill_create_ip", request.getRemoteAddr());

更換成

public static String getIpAddr(HttpServletRequest request) { 
    String ip = request.getHeader("x-forwarded-for"); 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
      ip = request.getHeader("Proxy-Client-IP"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
      ip = request.getHeader("WL-Proxy-Client-IP"); 
    } 
    if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { 
      ip = request.getRemoteAddr(); 
    } 
    return ip; 
  } 

這樣獲取的IP是ipv4是也是客戶的真實ip。

有時報這個錯誤並不一定是IP的問題,前端報錯都是微信支付jsapi缺少參數 total_fee,所以最好的方法還是把中間結果打印出來或者斷點測試一下

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章