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] : '';
    }

这样才算将此问题完美解决!
 

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