今日在項目開發中遇到一個問題,使用微信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] : '';
}
這樣纔算將此問題完美解決!