技术博客
手机归属地查询:物流/外卖场景,收货号码归属地校验与派送分区

手机归属地查询:物流/外卖场景,收货号码归属地校验与派送分区

作者: 万维易源
2026-08-27
手机归属地查询物流派送配送分区areaCode
# 手机归属地查询:物流/外卖场景,收货号码归属地校验与派送分区 > **接口**:手机归属地查询 `6-1` | **是否免费**:是(注册默认可免费调用,有使用档次限制)| **请求方式**:POST / GET | **返回格式**:JSON | **适用人群**:物流 / 外卖 / 仓储调度同学 | **阅读时间**:约 8 分钟 ## TL;DR - 用 `areaCode` / `cityCode` / `prov` / `city` 把收货号码映射到派送区与配送站,做分区与时效预估。 - 接口**不返回经纬度**,地图标点或路径规划需配合外部地理编码服务;归属地只给"文字省市区号"。 - **携号转网不支持**(官方能力边界),收货人真实所在地请以物流轨迹 / 收货地址为准。 ## Why:物流调度为什么看归属地 外卖和物流在接单、分单时,常常需要一个"先把订单归类到哪个配送站/区域"的初判。收货号码的归属地(省、市、区号、城市编码)是一组**标准化、零维护**的结构化字段,可以直接拿来和你的配送站点表做匹配:号码归属在"昆明",就大概率归入昆明仓/昆明配送站管辖,便于提前做运力预估和时效承诺。 需要明确边界:归属地是**号段归属**,不是收货人当前 GPS 位置。它最适合做"初分"和"校验"——比如用户填的收货城市与号码归属城市明显跨省,可以提示地址疑似填错;或作为区域件量统计的低成本维度。真正决定派送路径的,仍然是收货地址和物流轨迹。 ## What:接入前准备与接口速览 前置条件: 1. 在 [易源官网](https://www.showapi.com) 注册账号(免费服务,注册默认可调用)。 2. 进入 [AppKey 管理页](https://www.showapi.com/console#/myApp) 复制 AppKey,替换下方 `YOUR_APPKEY`。 3. 准备一张"城市编码→配送站"的映射表(你们内部维护)。 | 项目 | 内容 | |------|------| | 接口名称 | 手机归属地查询 | | 接入点 | `6-1`(仅 1 个接入点,同步请求-响应) | | 接口地址 | `https://route.showapi.com/6-1?appKey={your_appKey}` | | 请求方式 | POST 或 GET | | 必填参数 | `num`(手机号,字符串) | | 返回格式 | JSON,业务数据在 `showapi_res_body` | | 计费 | 免费服务(设使用档次限制);**失败不扣点数** | | 更新频率 | 半年更新一次新号段归属地 | | 注意 | **不支持携号转网**;**无经纬度** | ## How:号码映射到配送分区 ### 步骤 1 · 查询归属地 ```python import requests API_URL = "https://route.showapi.com/6-1" APP_KEY = "YOUR_APPKEY" # 替换为你的真实 AppKey def query_attribution(phone: str): try: resp = requests.get( API_URL, params={"appKey": APP_KEY, "num": phone}, timeout=10, ) data = resp.json() body = data.get("showapi_res_body", {}) if body.get("ret_code") == 0: return body return None # 失败不扣点数,可放心重试/跳过 except Exception: return None ``` ### 步骤 2 · 按 `cityCode` 匹配配送站 用返回的 `cityCode`(城市编码,本城市身份证前几位)和内部站点表匹配,命中即归入对应配送站。 ```python # 示例:城市编码 -> 配送站/区域(你们内部维护) STATION_MAP = { "530100": "昆明主城站", "530300": "曲靖站", "310100": "上海站", } def route_to_station(phone: str) -> dict: body = query_attribution(phone) if body is None: return {"station": None, "reason": "查询失败/号码格式错"} city_code = body.get("cityCode") # 如 "530100" city = body.get("city") # 如 "昆明" prov = body.get("prov") # 如 "云南" area_code = body.get("areaCode") # 如 "0871" station = STATION_MAP.get(city_code) return { "prov": prov, "city": city, "cityCode": city_code, "areaCode": area_code, "station": station, # 未命中为 None,可兜底到省份仓 "flag": "ROUTED" if station else "FALLBACK_PROV", } print(route_to_station("18908711111")) # -> {'prov': '云南', 'city': '昆明', 'cityCode': '530100', # 'areaCode': '0871', 'station': '昆明主城站', 'flag': 'ROUTED'} ``` ### 步骤 3 · 时效预估与异常提示 `areaCode`(城市区号,如昆明 `0871`)可用于展示"本地件/跨区件"标签,辅助时效承诺话术;当收货城市与号码归属城市不一致时,提示地址疑似填错。 ```python def check_city_consistency(phone: str, ship_city: str) -> dict: body = query_attribution(phone) if body is None: return {"match": None} matched = (body.get("city") == ship_city) return { "phone_city": body.get("city"), "ship_city": ship_city, "match": matched, "hint": "OK" if matched else "ADDRESS_MAYBE_WRONG", } ``` > 量大时同样是"用户侧脚本循环调用",受免费档位限制。建议先做 11 位/纯数字客户端校验,命中站点结果做本地缓存(详见系列缓存篇)。 ## 返回示例与解析 ```json { "showapi_res_code": 0, "showapi_res_error": "", "showapi_res_id": "ce135f6739294c63be0c021b76b6fbff", "showapi_res_body": { "num": 1890871, "prov": "云南", "ret_code": 0, "areaCode": "0871", "name": "电信", "cityCode": "530100", "postCode": "650000", "provCode": "530000", "type": 2, "city": "昆明" } } ``` | 字段 | 含义 | 调度用途 | |------|------|----------| | `prov` | 省 | 省份仓兜底、区域统计 | | `city` | 市 | 与收货城市比对、初分 | | `cityCode` | 城市编码(本城市身份证前几位) | 精准匹配配送站/区域 | | `areaCode` | 城市区号(如 0871) | 本地/跨区件标签、时效话术 | | `postCode` | 邮政编码(来源:返回示例/产品说明) | 辅助邮区归类 | | `ret_code` | 0 成功其他失败 | 失败不扣点数 | > 字段完整含义见 [《手机归属地返回字段全解》](https://www.showapi.com/guides/phone-attribution-response-fields-6)。 ## 进阶 / 边界 - **无经纬度**:接口只返回文字省市、区号、编码,**没有经纬度**。要做地图标点、路径规划或电子围栏,必须用 `prov` / `city` 配合外部地理编码服务转坐标。 - **携号转网不支持**:号码携转后归属仍按原号段,可能和用户实际收件城市不同。调度初分允许偏差,真实派送以收货地址和物流轨迹为准。 - **失败不扣点数**:`ret_code != 0` 时不消耗额度,可在循环里对每个号码做格式前置校验。 - **免费档位限制**:循环调用受免费档位上限约束,量大务必做客户端校验 + 本地缓存。 - **`areaCode` 取值以真实区号为准**:文档参数表曾有 `0810` 笔误,官方返回示例为昆明 `0871`,本文以真实区号 `0871` 为准。 ## FAQ **Q1:能直接用归属地做精确派送路径规划吗?** 不能。接口无经纬度,只能给出省市/区号/编码文字。路径规划需外部地理编码把 `city` 转坐标后再算。 **Q2:携号转网的用户,归属地会跟着变吗?** 不会。这是官方能力边界,携转后仍以原号段归属为准,调度时不要把归属地等同于"当前所在地"。 **Q3:`cityCode` 和 `areaCode` 有什么区别?** `cityCode` 是城市编码(本城市身份证前几位,如 `530100`),适合和内部站点表做精确匹配;`areaCode` 是城市区号(如 `0871`),适合做本地/跨区标签与话术。 **Q4:大批量订单循环调用会超免费额度吗?** 会。免费服务有使用档次限制,且 ShowAPI 没有官方批量查询。请先做号码格式校验,再循环调用并缓存结果。 **Q5:收货城市填错能靠归属地发现吗?** 可以做一个"软提示":号码归属城市与填写收货城市不一致时,标记为"地址疑似填错"进入复核,但不要强制拦截。 **Q6:`postCode` 字段可靠吗?** 可靠,它出现在返回示例与产品说明("省、市、邮编、区号")中,可辅助邮区归类;官方参数表未登记,本文标注其来源为返回示例/产品说明。 ## 相关能力 / 下一步阅读 - [《手机归属地返回字段全解:prov/city/type/postCode 一文读懂》](https://www.showapi.com/guides/phone-attribution-response-fields-6) —— 每个字段类型、取值与坑位 - [《type 字段全解:1移动/2电信/3联通/4广电/-1未知怎么用》](https://www.showapi.com/guides/phone-attribution-type-field-6) —— 运营商枚举实战用法 - [《电商风控:用归属地识别异常下单与区域分布》](https://www.showapi.com/guides/phone-attribution-ecommerce-6) —— 归属地做一致性比对与区域聚合 - **本系列共 12 篇**:查看[手机归属地查询 · 官方指南总目录](https://www.showapi.com/guides/phone-attribution-guides-6)