在其他瀏覽器中使用微信支付時會調(diào)用微信的H5支付,但有時會出現(xiàn)如上圖的錯誤,查看了一下微信官方文檔了解到是獲取客戶端IP出現(xiàn)了問題.如下圖.

/**
?* 獲取用戶真實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;
}
之后使用這個函數(shù):
'spbill_create_ip'?=>?$this->getIp(),
問題就解決啦~~~~~
總結(jié):?
getenv("REMOTE_ADDR")用來取得客戶端的 IP 地址,但如果客戶端是使用代理服務(wù)器來訪問,那取到的就是代理服務(wù)器的 IP 地址,而不是真正的客戶端 IP 地址。要想透過代理服務(wù)器取得客戶端的真實 IP 地址,就要使用 getenv("HTTP_X_FORWARDED_FOR") 來讀取。
但是如果客戶端沒有通過代理服務(wù)器來訪問,那么用getenv("HTTP_X_FORWARDED_FOR") 取到的值將是空的。
else if(getenv("HTTP_X_FORWARDED_FOR"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
表示如果getenv("HTTP_X_FORWARDED_FOR") 取到的值存在不為空(即客戶端使用代理服務(wù)器的情況下),則變量$ip等于getenv("HTTP_X_FORWARDED_FOR") 取到的真實IP值。
如果上面的else if(getenv("HTTP_X_FORWARDED_FOR"))取得的值為空(即沒有使用代理服務(wù)器),則不會執(zhí)行下面的$ip = getenv("HTTP_X_FORWARDED_FOR");這一行語句。
這種情況下已經(jīng)確認客戶端沒有使用代理服務(wù)器,從而通過
else if(getenv("REMOTE_ADDR"))
$ip = getenv("REMOTE_ADDR");
這兩行語句獲得客戶端的IP地址也是真實的IP地址。