微信H5支付中如何获取用户真实的IP地址

       最近在做微信H5支付过程中发现,一直提示“网络环境未能通过安全验证,请稍后再试!”,调用不到微信支付的界面!开始以为是开启了NGINX代理的原因,关闭代理后问题依旧,网络上搜索发现说是获取不到用户IP或者切换网络的原因,由于没有切换网络,所以这个排除,那原因只能从获取不到用户IP搞起。先发现错误图如下:

       网络上的解决办法实际上并不一定能用,包括现有的重新的代码,至少我测试过了还是获取不到IP地址,我的步骤是这样的,我们先看微信支付代码中获取用户IP的方式:

微信sdk文件中\lib\WxPay.Api.php中的函数unifiedOrder获取IP的方式是这样的:

$inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//终端ip 

       我们可以看到,它获取IP地址是用了函数$_SERVER方式获取的,为啥获取不到呢?难道是函数出问题了吗还是?这个我们暂不去探究,网上给出的方法是:

function get_client_ip() {
    if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
        $ip = getenv('HTTP_CLIENT_IP');
    } elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
        $ip = getenv('HTTP_X_FORWARDED_FOR');
    } elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
        $ip = getenv('REMOTE_ADDR');
    } elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
        $ip = $_SERVER['REMOTE_ADDR'];
    }
    return preg_match ( '/[\d\.]{7,15}/', $ip, $matches ) ? $matches [0] : '';
}

怪我看不懂太多代码,应该还是利用函数获取IP地址吧,但是放上去之后,还是报同样的错误,难道哪里出问题,还是这个函数也获取不到IP地址呢?抱着这个疑问,干脆这样子:

$inputObj->SetSpbill_create_ip($_SERVER['144.255.215.159']);//终端ip 

 完了!暴露我的行踪了!哈哈!这样写入IP之后竟然就可以支付!也就是说,我用了上述重新写的函数后依旧不能用!不能用自己又不会写,接着百度一下走起!发现了两一个函数!

/**
 * 
  获取客户端IP
 */
	function getIp(){    
	$ip = '';    
	if(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){        
		$ip = $_SERVER['HTTP_X_FORWARDED_FOR'];    
	}elseif(isset($_SERVER['HTTP_CLIENT_IP'])){        
		$ip = $_SERVER['HTTP_CLIENT_IP'];    
	}else{        
		$ip = $_SERVER['REMOTE_ADDR'];    
	}
	$ip_arr = explode(',', $ip);
	return $ip_arr[0];
	}

       这个函数和上面那个函数唯一的区别是:获取IP的函数或者说是变量不同!一个用的是getenv(),一个是标准的变量$_SERVER ,百度了一下getenv()函数,说是获取环境变量的值,不太懂,也没怎么用过,但是为啥调用不到就不得而知,但是$_SERVER我们算是相当熟悉了!所以,我用下面这个getIp()成功的获取到了用户的IP,完成了微信H5的支付操作!

        然而,我服务器用了nginx反向代理后,发现又不能支付了!原来,服务器开启反向代理后,获取到的IP都会自动转换成本地ip,一般是127.0.0.1,那么问题来了,既然获取不到那怎么能支付呢?网络上也贴出一些方法,比如在反向代理服务器中加入头文件,自己百度一下吧!所以如果你不能操作你的代理,那么就只能关掉代理了!

      很多人虽然看到这段代码不知道该把代码放到哪里,你直接放到WxPay.Api.php这个文件里面就行,直接调用就行,这个地方改成:

$inputObj->SetSpbill_create_ip(getIp());//终端ip 

       这样就OK了,如果还有不懂得,可以直接留言!相互学习! 

猜你喜欢

转载自blog.csdn.net/lianjiangdai/article/details/82387531