Appearance
微信小程序怎么获取用户IP归属地?uni-app和原生开发都讲清楚
做小程序的朋友应该都遇到过这种情况:产品经理突然提需求——"给我在小程序里显示用户所在城市",或者"按用户地区推荐不同内容"。这时候最省事的方案就是通过 IP 获取用户归属地。今天把微信小程序(原生)和 uni-app 两种写法的完整流程都讲清楚。
一、为什么选 IP 归属地而不是定位接口?
很多人第一反应是用 wx.getLocation(),但实际开发中它有几个痛点:
- 要申请用户授权,用户拒绝授权就拿不到位置;
- 需要在小程序后台配置"地理位置用途说明",类目审核严格,很多非地图类小程序根本过不了;
- 打开定位权限的弹窗会劝退一部分用户,转化率受影响。
而 IP 归属地不需要任何授权,请求一次接口就返回省市信息,实现成本几乎为零。它适合的场景是:展示用户大致地区、做同城推荐、风控辅助判断——这些不需要精确到街道的场景,IP 完全够用。
二、获取用户 IP 的两种方式
方式一:服务端获取(推荐)
小程序本身不能直接跨域请求第三方接口,但你的后端服务可以。流程是:
小程序前端 → 你的后端 → IP9 接口 → 返回归属地 → 小程序展示微信的 wx.request 请求你自家后端时,微信会带上用户真实的 X-Forwarded-For 头,你的后端直接取 request.remote_addr 就能拿到用户 IP,然后调用 IP 查询接口。
方式二:前端直接请求
如果你的小程序没有自己的后端,也可以在小程序后台配置 request 合法域名 后直接请求 IP9 接口:
javascript
// 查询当前用户 IP 的归属地
wx.request({
url: 'https://ip9.com.cn/get',
success(res) {
const data = res.data.data
console.log('用户所在省份:', data.prov)
console.log('城市:', data.city)
console.log('运营商:', data.isp)
}
})注意:免费版接口限速 60 次/分钟,生产环境建议通过你自己的服务端做缓存,同一 IP 短时间内不要重复请求。
三、uni-app 写法(一套代码多端运行)
用 uni-app 开发的话,代码几乎一样,只是把 wx.request 换成 uni.request:
javascript
uni.request({
url: 'https://ip9.com.cn/get',
success: (res) => {
const d = res.data.data
this.userCity = d.city
this.userProv = d.prov
}
})小程序端默认也支持 uni.getLocation,但同样有授权问题,能用 IP 解决的场景建议优先用 IP。
四、真实项目示例:显示"IP 属地"标签
很多社区类小程序会给每条评论显示"IP 属地:广东",实现思路很简单:
- 用户发布评论时,前端把用户 IP 传给后端(或后端从请求头取);
- 后端调 IP9 接口拿到省份;
- 把省份存到评论记录里;
- 前端渲染时直接展示。
javascript
// 后端 Node.js 示例:评论时记录 IP 属地
const axios = require('axios')
async function getIpLocation(ip) {
const { data } = await axios.get(`https://ip9.com.cn/get?ip=${ip}`)
if (data.ret === 200) {
return {
prov: data.data.prov,
city: data.data.city
}
}
return null
}五、避坑指南
- IPv6 用户:部分手机网络是 IPv6 出口,查询时建议先查 IPv4,查不到再试 IPv6,IP9 两个都支持;
- 缓存策略:同一 IP 的归属地短期内不会变,后端加个 10 分钟缓存就能省掉大部分请求;
- 不要拿 IP 当精确定位:它只能到城市级,别用来做"必须精确到门牌号"的业务;
- 合规提醒:虽然 IP 归属地不需要授权,但如果要展示给用户看,最好在隐私政策里说明用途。
总结
小程序获取用户地区,IP 归属地是性价比最高的方案——免授权、接入快、够用。把上面代码抄进项目,十分钟就能上线一个"IP 属地"功能。
如果你还没有找到好用的 IP 查询接口,可以直接用 IP9 免费接口:https://ip9.com.cn/get,不传参数就是查当前用户,传 ?ip=xxx 可以查任意 IP,返回省市、运营商、经纬度,免费版 60 次/分钟,个人项目完全够用。
IP9 官网:https://www.ip9.com.cn