手机归属地查询在电商风控里能做什么:可用维度与不成立的用法
约 11 分钟 进阶手机号码归属地查询电商风控地域一致性号段分布
# 手机归属地查询在电商风控里能做什么:可用维度与不成立的用法
接口:手机归属地查询(apiCode=6,接入点 6-1)|是否免费:是,注册后默认可调用,设使用档次限制|请求方式:POST / GET|返回格式:JSON|适用人群:电商风控、数据分析和增长团队|阅读时间:约 8 分钟|最后实测核对:2026-09-18
一笔订单进来,收货地址写的是广东,手机号归属地是北京。这个信号能不能进风控特征?能,但要先分清哪些用法站得住、哪些只是看起来合理。这篇把可用的维度和不成立的用法分开讲清楚,避免把归属地当成它承担不了的东西。
## 核心要点
- 归属地返回省和市两级,实测粒度不到区县,做地域判断时按这个精度设计。
- 手机号归属地反映的是号段归属,号码可以异地使用,它不等于用户当前所在地。
- 匹配粒度是前 7 位号段,同一号段的多个订单不必然构成异常信号。
## 可用的三类维度
### 一、号段归属地与申报地域的一致性
用户填的收货省份和号码归属省份不一致,是一个可以计算的信号。做法是把两边都归到编码再比。
```python
import requests
def region_consistency(phone_seg: str, declared_prov_code: str) -> dict:
"""比对号码归属省份与用户申报省份是否同源。"""
resp = requests.get(
"https://route.showapi.com/6-1",
params={"appKey": "YOUR_APPKEY", "num": phone_seg},
timeout=10, # 对齐官方 x-read-timeout
)
data = resp.json()
if data.get("showapi_res_code") != 0:
return {"ok": False, "reason": "gateway_error"}
body = data.get("showapi_res_body", {})
if body.get("ret_code") != 0:
# -1 / -5 / -6 表示号段异常或查不到,这类号码本身值得单独记录
return {"ok": False, "ret_code": body.get("ret_code")}
prov_code = str(body.get("provCode") or "")
declared = str(declared_prov_code or "")
return {
"ok": True,
"prov": body.get("prov"),
"city": body.get("city"),
"same_prov": bool(prov_code) and prov_code[:2] == declared[:2],
"carrier_type": body.get("type"),
"city_code": body.get("cityCode"),
}
```
用 `provCode` 做比对而不是用省名文字,原因是省名有多种写法。`provCode` 的文档口径是「本省身份证的前几位编码」,实测北京返回 `110000`,取前两位做前缀比对就够用。字段细节见[返回字段全解](https://www.showapi.com/guides/phone-attribution-response-fields-6)。
这个信号只适合当辅助特征。用户出差、异地收货、给父母下单,都会产生不一致。把它做成硬性拦截条件,会挡住真实订单。
### 二、号段维度的批量特征
同一批注册或下单里,如果号码集中在少数几个号段,这个分布本身是可以统计的。做法是先取前 7 位去重再聚合。
实测确认归属地结果只跟前 7 位号段有关,`13800130000` 和 `13800139999` 返回完全一致。所以统计号段分布时,键取前 7 位:
```python
import re
from collections import Counter
def to_segment(phone: str) -> str | None:
cleaned = re.sub(r"[-\s]", "", (phone or "").strip())
if not re.fullmatch(r"\d{7,}", cleaned) or cleaned[0] == "0":
return None
return cleaned[:7]
segments = [s for s in (to_segment(p) for p in order_phones) if s]
dist = Counter(segments)
top = dist.most_common(10)
print(f"订单 {len(order_phones)} 笔,不同号段 {len(dist)} 个")
print("集中度最高的号段:", top)
```
号段集中度高不等于异常。真实的批量采购、企业客户、同一地区用户集中的活动,都会出现号段集中。这个指标适合用来观察趋势和分层,不适合直接下判定。
### 三、运营商维度
`type` 返回 1 到 4 的数字枚举,可用于触达通道选择和运营分层。短信通道按运营商配置、不同运营商的到达率差异观察,这类用途不依赖地域信息,也不会因为号码异地使用而失效。
枚举取值与实测样本见 [type 字段全解](https://www.showapi.com/guides/phone-attribution-type-field-6)。
## 不成立的三种用法
### 当作实时位置
归属地是号段归属,跟号码当前使用地不是一回事。用户在北京办的号,人可以在广州下单,返回的 `prov` 仍然是北京。拿它做实时位置判断,结论会在跨城场景下失效。
### 当作单一判定条件
「归属地与收货地不一致就拦单」这条规则拦不住真正想绕过的行为,因为换个号码的成本很低。它挡住的反而是异地收货的正常用户。可以作为加权特征,不要作为独立判据。
### 当作地域销量的直接口径
要分析区域销售表现,用收货地址比用号码归属地准。归属地适合做补充维度,用来观察号码来源地和收货地之间的偏差分布。
## 落地时的两个工程点
批量校验订单时,同一号段只需查一次。先把订单号码取前 7 位去重,再循环调用,最后按号段回填到订单上。完整的脚本写法见[用 Python 给 Excel 号码表批量补归属地](https://www.showapi.com/guides/phone-attribution-excel-batch-6)。
风控链路对延迟敏感,缓存要跟上。同一号段的重复查询直接命中本地缓存,缓存的粒度与实现见[按前 7 位号段做缓存](https://www.showapi.com/guides/phone-attribution-cache-6)。
计费方面,手机归属地查询是免费接口,注册后默认可调用,设使用档次限制;失败时 `showapi_fee_num` 为 0,输入的格式问题不会消耗额度。档位与并发上限见[免费接口与档位说明](https://www.showapi.com/free-api)。
## FAQ
**Q1:归属地能精确到区县吗?**
不能。返回的粒度是省和市两级,`city` 的文档定义就是「市」。需要区县维度时得配合其他数据源。
**Q2:号码归属地与用户所在地是一回事吗?**
不是。归属地反映号段归属,号码可以异地使用。适合做展示和辅助特征,不适合作为实时位置的判据。
**Q3:同一号段多笔订单算异常吗?**
不必然。企业客户、集中活动、同一地区用户聚集都会出现号段集中。这个指标适合观察趋势和分层,不适合单独下判定。
**Q4:归属地和收货地址不一致就拦单吗?**
不建议拦。异地收货、代下单、出差下单都会产生不一致。可以做成加权特征参与评分,同时保留人工审核入口。
**Q5:批量校验订单要调多少次接口?**
按不同号段数计算,不是订单数。实测归属地结果只跟前 7 位号段有关,同一号段查一次就能覆盖该号段下所有订单。
**Q6:查询失败会占用调用额度吗?**
不会。失败时 `showapi_fee_num` 为 0,文档口径是失败不扣点数。
## 下一步阅读
- [手机归属地查询返回字段全解:11 个字段的类型、取值与粒度](https://www.showapi.com/guides/phone-attribution-response-fields-6) —— `provCode` 与 `cityCode` 的取值口径
- [手机归属地查询:用 Python 给 Excel 号码表批量补归属地](https://www.showapi.com/guides/phone-attribution-excel-batch-6) —— 批量校验的脚本骨架
- [手机归属地查询:按 cityCode 给收货号码匹配派送区域](https://www.showapi.com/guides/phone-attribution-logistics-6) —— 地域维度的另一个落地场景
- **本系列共 12 篇**:查看[手机归属地查询指南总目录](https://www.showapi.com/guides/phone-attribution-guides-6)





