微信H5支付出現網絡環境未能經過安全驗證,請稍後再試.

  在其餘瀏覽器中使用微信支付時會調用微信的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

相關文章
相關標籤/搜索