使用腾讯地图的 IP 定位服务。这里是正确的实现方式

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Http;

class CheckXinjiangIp
{
    protected $key = ' ';  // 你的腾讯地图 key

    public function handle(Request $request, Closure $next)
    {
        $ip = $request->ip();
        
        if ($ip === '127.0.0.1') {
            return $next($request);
        }

        // 缓存24小时
        $location = Cache::remember('ip_location_' . $ip, 60 * 24, function () use ($ip) {
            $response = Http::get('https://apis.map.qq.com/ws/location/v1/ip', [
                'key' => $this->key,
                'ip' => $ip
            ]);
            
            return $response->json();
        });

        // 检查是否是新疆地区
        if (isset($location['result']['ad_info']['province']) 
            && $location['result']['ad_info']['province'] === '新疆') {
            return $next($request);
        }

        // 非新疆地区返回JSON响应
        return response()->json([
            'code' => 403,
            'msg' => '非新疆地区访问',
            'data' => [
                'redirect' => true,
                'path' => '/pages/banners/index'
            ]
        ]);
    }
}

腾讯地图 IP 定位服务的特点:

  • 需要在请求参数中带上 key
  • 返回的地区信息更准确
  • 支持 HTTPS
  • 有每日免费配额

返回数据示例:

{
    "status": 0,
    "message": "Success",
    "result": {
        "ip": "xxx.xxx.xxx.xxx",
        "location": {
            "lat": 43.92172,
            "lng": 87.46991
        },
        "ad_info": {
            "nation": "中国",
            "province": "新疆",
            "city": "乌鲁木齐市",
            "district": "渠道"
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值