Appearance
电商下单自动填省市怎么做?用IP归属地预填收货地址
做过电商站的朋友都有体会:下单页的收货地址表单,是流失率最高的地方之一。用户填完手机号、姓名,还要在省市区三个下拉框里翻半天,嫌麻烦的直接就关页面了。有没有办法让省市自动带出来?有,用 IP 归属地就能做到,而且免费接口就够用。今天分享一套完整方案。
一、整体思路
思路很简单:用户打开下单页时,前端拿不到他的真实地理位置(浏览器定位要授权,还经常失败),但服务器能拿到他的 IP。把 IP 发给归属地接口,返回省、市,前端自动把省市选好,用户只需要填详细地址。
- 前端请求后端接口
/api/guess-region,后端用https://ip9.com.cn/get查当前请求方 IP 归属地 - 归属地接口免费版就返回
prov(省)、city(市),完全够用 - 预填只做"省 + 市",详细地址、门牌号必须让用户自己填
二、后端接口实现(Python)
python
import requests
def guess_region():
# 不传 ip 参数,查的就是当前请求方 IP
r = requests.get('https://ip9.com.cn/get', timeout=3)
data = r.json()
if data.get('ret') != 200:
return {'prov': '', 'city': ''}
return {
'prov': data.get('prov', ''),
'city': data.get('city', ''),
'country': data.get('country', '')
}注意两点:一是接口支持 IPv4 和 IPv6,用户走什么协议都能查;二是 lat/lng 是城市中心点的经纬度,不能当成用户精确位置,千万别拿它去填详细地址。
三、前端预填(Vue 示例)
js
// 下单页加载时自动预填省市
async function prefillRegion() {
const res = await fetch('/api/guess-region')
const { prov, city } = await res.json()
if (prov && city) {
province.value = prov // 省下拉框选中
citySelect.value = city // 市下拉框选中
}
}前端拿到省市后填进下拉框,用户确认或修改即可。务必保留手动选择能力——IP 归属地判断的是"网络出口位置",用户可能在外地给家人买东西,预填错了要能改。
四、性能和成本怎么控
下单页是高频页面,但归属地查询完全不需要每次下单都打接口:
- 会话级缓存:用户登录后查一次,结果放 Redis,TTL 设 1 天;
- 本地缓存:前端把结果存 localStorage,下次直接读;
- 接口本身免费:IP9 免费版 60 次/分钟/IP,单用户一天查一两次,额度绰绰有余;实在不够再上 VIP(按次计费,0.05 元/千次起)。
python
import redis, json
cache = redis.Redis(host='127.0.0.1', port=6379, db=0)
def guess_region_cached(user_id):
key = f'region:{user_id}'
cached = cache.get(key)
if cached:
return json.loads(cached)
region = guess_region()
cache.setex(key, 86400, json.dumps(region)) # 缓存 1 天
return region总结
IP 归属地预填收货地址,实现成本极低、对转化率提升明显,属于典型的"小改动大收益"。核心就三步:后端查归属地、前端预填省市、加缓存控成本。接口直接用 IP9 的 https://ip9.com.cn/get?ip=xxx 就行,免注册、免鉴权,返回里 prov/city 直接对应省市区三级联动的前两级。需要更细的区县级别,VIP 版还提供 area 字段。官网:https://www.ip9.com.cn