在其餘瀏覽器中使用微信支付時會調用微信的H5支付,但有時會出現如上圖的錯誤,查看了一下微信官方文檔瞭解到是獲取客戶端IP出現了問題.以下圖.php
網址: https://pay.weixin.qq.com/wiki/doc/api/H5.php?chapter=15_4html
也就是說咱們要修改下微信支付獲取IP的方式獲得真是的客戶端IP:api
原有的的獲取方式是:瀏覽器
'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") 取到的值將是空的。this
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值。spa
若是上面的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