今日在项目开发中遇到一个问题,使用微信H5支付时,提示“网络环境未能通过安全验证,请稍后再试”;查看官方文档说是下单ip(spbill_create_ip)地址检验不正确。阅读官方所给sdk代码是:
$inputObj->SetSpbill_create_ip($_SERVER['REMOTE_ADDR']);//获取终端ip
这种方法不能获取到真实的ip地址,然后我修改成:
/**
* 获取当前服务器的IP
*/
function get_client_ip()
{
if ($_SERVER['REMOTE_ADDR']) {
$cip = $_SERVER['REMOTE_ADDR'];
} elseif (getenv("REMOTE_ADDR")) {
$cip = getenv("REMOTE_ADDR");
} elseif (getenv("HTTP_CLIENT_IP")) {
$cip = getenv("HTTP_CLIENT_IP");
} else {
$cip = "unknown";
}
return $cip;
}
此时将此问题解决,在手机浏览器中能正常成功调起微信H5支付。但是这种方法只能解决部分浏览器,当使用QQ手机浏览器时还是提示“网络环境未能通过安全验证,请稍后再试”;查找好久原因未能解决,百度、谷歌查了好久还是说IP地址获取不正确,又找到了一个改进方法:
/**
* 获取当前服务器的IP
*/
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] : '';
}
这样才算将此问题完美解决!