php获取用户粗略地理位置

在部分开发场景中,我们需要获取用户的地理位置,根据城市返回不同的信息
如果是前后端分离,自然好做,前端获取定位,传给后端即可
但是如果是php渲染模板的,在第一次用户访问的时候,我们没办法拿到用户的地理位置
我们可以拿到用户的ip,然后利用ip去向腾讯的ip定位去请求,拿到用户的地理位置

代码示例

function get_client_ip(){
    $ip = FALSE;
    //客户端IP 或 NONE 
    if(!empty($_SERVER["HTTP_CLIENT_IP"])){
        $ip = $_SERVER["HTTP_CLIENT_IP"];
    }
    //多重代理服务器下的客户端真实IP地址(可能伪造),如果没有使用代理,此字段为空
    if (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ips = explode (", ", $_SERVER['HTTP_X_FORWARDED_FOR']);
        if ($ip) {
            array_unshift($ips, $ip);
            $ip = FALSE; 
        }
        for ($i = 0; $i < count($ips); $i++) {
            if (!eregi ("^(10│172.16│192.168).", $ips[$i])) {
                $ip = $ips[$i];
                break;
            }
        }
    }
    //客户端IP 或 (最后一个)代理服务器 IP 
    return ($ip ? $ip : $_SERVER['REMOTE_ADDR']);
}
$ip = get_client_ip();
$url = "https://apis.map.qq.com/ws/location/v1/ip?ip=$ip&key=YNFBZ-N5BRV-ZCJPS-USFGL-BSMHZ-YZFNZ";
$res = file_get_contents($url);//返回的是json
$data = json_decode($res,true);//转成数组
print_r($data);

返回的json格式示例

{
    "status": 0,
    "message": "query ok",
    "result": {
        "ip": "60.166.89.86",
        "location": {
            "lat": 31.8512,
            "lng": 117.26061
        },
        "ad_info": {
            "nation": "中国",
            "province": "安徽省",
            "city": "合肥市",
            "district": "蜀山区",
            "adcode": 340104
        }
    }
}
Last modification:July 9th, 2019 at 02:40 pm
If you think my article is useful to you, please feel free to appreciate

Leave a Comment

简爱博客