官方解釋:java
首先咱們要分清spbill_create_ip參數是幹嗎的?微信
---------spbill_create_ip 指的是終端ip,在APP和網頁支付提交用戶端ip,Native支付填調用微信支付API的機器IP。微信支付
那麼歸根結底,咱們只要能獲取正確的客戶端ip,那麼問題就能夠解決,通過我堅苦卓絕的尋找,找到以下一個豪華版獲取客戶端ip的方法,只要用了它,java版H5支付就迎刃而解。以下:spa
/** * 獲取用戶真實IP地址,不使用request.getRemoteAddr()的緣由是有可能用戶使用了代理軟件方式避免真實IP地址, * 但是,若是經過了多級反向代理的話,X-Forwarded-For的值並不止一個,而是一串IP值 * * 獲取終端ip(高配版) * @return ip */ private String getIpAddr2(HttpServletRequest request) { String ip = request.getHeader("x-forwarded-for"); System.out.println("x-forwarded-for ip: " + ip); if (ip != null && ip.length() != 0 && !"unknown".equalsIgnoreCase(ip)) { // 屢次反向代理後會有多個ip值,第一個ip纔是真實ip if( ip.indexOf(",")!=-1 ){ ip = ip.split(",")[0]; } } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); System.out.println("Proxy-Client-IP ip: " + ip); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); System.out.println("WL-Proxy-Client-IP ip: " + ip); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_CLIENT_IP"); System.out.println("HTTP_CLIENT_IP ip: " + ip); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); System.out.println("HTTP_X_FORWARDED_FOR ip: " + ip); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("X-Real-IP"); System.out.println("X-Real-IP ip: " + ip); } if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); System.out.println("getRemoteAddr ip: " + ip); } System.out.println("獲取客戶端ip: " + ip); return ip; }