在其他瀏覽器中使用微信支付時會調用微信的H5支付,但有時會出現如上圖的錯誤,查看了一下微信官方文檔了解到是獲取客戶端IP出現了問題.如下圖.
網址: https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4
也就是說我們要修改下微信支付獲取IP的方式得到真是的客戶端IP:
原有的的獲取方式是:
'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
可以定義個函數獲取Ip:
/** * 獲取用戶真實iP * */ public function getIp() { if(!empty($_SERVER["HTTP_CLIENT_IP"])) { $cip = $_SERVER["HTTP_CLIENT_IP"]; } else if(!empty($_SERVER["HTTP_X_FORWARDED_FOR"])) { $cip = $_SERVER["HTTP_X_FORWARDED_FOR"]; } else if(!empty($_SERVER["REMOTE_ADDR"])) { $cip = $_SERVER["REMOTE_ADDR"]; } else { $cip = ''; } preg_match("/[\d\.]{7,15}/", $cip, $cips); $cip = isset($cips[0]) ? $cips[0] : 'unknown'; unset($cips); return $cip; }
之后使用這個函數:
'spbill_create_ip' => $this->getIp(),
問題就解決啦~~~~~
總結:
getenv("REMOTE_ADDR")用來取得客戶端的 IP 地址,但如果客戶端是使用代理服務器來訪問,那取到的就是代理服務器的 IP 地址,而不是真正的客戶端 IP 地址。要想透過代理服務器取得客戶端的真實 IP 地址,就要使用 getenv("HTTP_X_FORWARDED_FOR") 來讀取。
但是如果客戶端沒有通過代理服務器來訪問,那么用getenv("HTTP_X_FORWARDED_FOR") 取到的值將是空的。
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
表示如果getenv("HTTP_X_FORWARDED_FOR") 取到的值存在不為空(即客戶端使用代理服務器的情況下),則變量$ip等於getenv("HTTP_X_FORWARDED_FOR") 取到的真實IP值。
如果上面的else if(getenv("HTTP_X_FORWARDED_FOR"))取得的值為空(即沒有使用代理服務器),則不會執行下面的$ip = getenv("HTTP_X_FORWARDED_FOR");這一行語句。
這種情況下已經確認客戶端沒有使用代理服務器,從而通過
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
這兩行語句獲得客戶端的IP地址也是真實的IP地址。
參考於: https://www.cnblogs.com/zsy0228/articles/4440226.html