微信支付时需要向微信传送一个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”地址进行处理后(改为取第一个地址)支付恢复正常。