身份证归属地查询:用户注册实名核验的集成设计(前端 + 后端)
# 身份证归属地查询:用户注册实名核验的集成设计(前端 + 后端)
> 接口:身份证归属地查询(apiCode=25,接入点 25-3) · 免费 · POST/GET · JSON · 适用人群:后端/全栈工程师、产品经理 · 阅读时间:约 7 分钟
## TL;DR
- 实名核验的核心是"号码自带的编码信息"与"用户自填信息"交叉比对。
- 接口返回籍贯/生日/性别,可与用户填写项比对,不一致则拦截或转人工。
- AppKey 必须放**后端**,绝不下发到前端。
## Why
用户注册时填写身份证号,你往往还让他填生日、性别,或要确认"这号是不是随手编的"。与其只做格式校验,不如用接口把号码反推出的籍贯/生日/性别和用户自填项做一次交叉核对——能拦掉一批明显不一致、或随机编造的号码,降低后续人工审核成本。
本接口官方价值点即"可辅助识别随机生成的身份证号或潜在篡改情况",本质就是这种交叉比对。
## What
| 项 | 值 |
|----|----|
| 集成位置 | 后端服务(AppKey 留在服务端) |
| 触发时机 | 用户提交注册/实名表单后、落库前 |
| 依赖 | [5 分钟接入](https://www.showapi.com/guides/idcard-attribution-quickstart-25) 的调用能力 |
## How
### 步骤 1:前端只采集号码
前端收集身份证号,做基础长度/空值校验后提交后端。**AppKey 不出现在前端代码**。
### 步骤 2:后端调用并交叉比对
```python
import requests
APP_KEY = "YOUR_APPKEY"
URL = "https://route.showapi.com/25-3"
def verify(name_id: str, fill_birthday: str, fill_sex: str) -> dict:
resp = requests.post(URL, params={"appKey": APP_KEY},
data={"id": name_id}, timeout=10)
data = resp.json()
if data.get("showapi_res_code") != 0:
return {"ok": False, "reason": "gateway"}
body = data["showapi_res_body"]
if body.get("ret_code") != 0:
return {"ok": False, "reason": "biz"}
rd = body["retData"]
checks = {
"birthday_match": rd["birthday"] == fill_birthday,
"sex_match": (rd["sex"] == "M" and fill_sex == "男")
or (rd["sex"] == "F" and fill_sex == "女"),
}
return {"ok": all(checks.values()), "checks": checks, "data": rd}
```
### 步骤 3:不一致的处理策略
- 全部一致 → 通过。
- 生日/性别不一致 → 标记"待人工复核",不直接拒绝(避免误伤输入误差)。
- 接口调用失败 → 降级为"仅格式校验通过",记录日志,不影响主流程。
## 返回示例解析
返回结构与 [返回字段全解](https://www.showapi.com/guides/idcard-attribution-fields-25) 一致,`retData` 提供 `address/birthday/sex` 供比对。
## 进阶 / 边界
- **接口不校验真伪**:它只反推编码信息,无法确认该身份证在公安系统是否真实存在。交叉比对只能发现"号码内部矛盾"或"与用户填报矛盾",不能替代权威实名认证。
- **敏感信息**:身份证号属个人敏感信息,传输用 HTTPS、存储按最小化与加密要求处理、调用日志避免明文落盘。
- **免费但有频控**:高并发注册场景注意缓存与限速,见 [Redis 缓存](https://www.showapi.com/guides/idcard-attribution-cache-25) 与 [批量核验](https://www.showapi.com/guides/idcard-attribution-batch-25)。
## FAQ
**Q:这个接口能替代公安实名认证吗?**
不能。它仅按号码反推户籍地区/生日/性别,并可与用户自填信息比对,不验证号码在公安系统是否真实存在。严肃实名场景仍需权威渠道。
**Q:AppKey 放前端安全吗?**
不安全。AppKey 应仅保留在后端,前端只负责采集与展示。
**Q:比对不一致一定要拒绝用户吗?**
不必。建议先标记"待人工复核",避免用户填错生日/性别导致误拒。
**Q:返回里的 address 和用户输入的"省/市"怎么比?**
address 是完整籍贯串(如"四川省达州市通川区"),比对时可做包含关系判断(如用户填"四川"即命中),不必强求完全一致。
**Q:高并发注册会触发限流吗?**
免费接口仍受平台频率约束。建议加缓存与限速,详见缓存篇。
## 相关能力 / 下一步阅读
- [身份证归属地查询:返回字段全解(retData / address / birthday / sex 与系统级结构)](https://www.showapi.com/guides/idcard-attribution-fields-25)
- [身份证归属地查询:风控场景如何用"籍贯+生日+性别"识别伪造/篡改身份证](https://www.showapi.com/guides/idcard-attribution-fraud-25)
- [身份证归属地查询:用 Redis 缓存降低重复查询与频率限制风险](https://www.showapi.com/guides/idcard-attribution-cache-25)
- **本系列共 12 篇**:查看[身份证归属地查询指南总目录](https://www.showapi.com/guides/idcard-attribution-guides-25)