微信支付時需要向微信傳送一個spbill_create_ip的參數,開發的時候我們是從request中通過如下代碼方式獲取到的
public static String getIpAddress(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.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
String realIp = ip.equals("0:0:0:0:0:0:0:1") ? "127.0.0.1" : ip;
return realIp;
}
然後正常單臺部署時沒問題,今天在阿里雲加入負載均衡並啓用https後微信支付莫名就不能用了(下單失敗不能生成二維碼),異常如下:{微信返回returnCode:FAIL,返回returnMsg:invalid spbill_create_ip"}"},經過分析發現是加了負載均衡且啓用https後request中的IP地址被修改成了兩個不一樣的地址數組了(具體是因爲加負載引起的還是因爲https引起的,還是兩個一起引起的還不確定)。然後果斷對獲取到的“IP”地址進行處理後(改爲取第一個地址)支付恢復正常。