PHP開發小技巧②④—獲取真實的IP(微信支付:網絡環境未能通過安全驗證,請稍後再試)

今日在項目開發中遇到一個問題,使用微信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] : '';
    }

這樣纔算將此問題完美解決!
 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章