适用场景与接口能力边界
运营商三要素核验接口用于一次性校验「姓名 + 手机号 + 身份证号」三者是否一致,广泛应用于账户实名认证、风控准入、身份一致性校验等场景。接口仅返回核验结论(一致/不一致/无法核验),不返回、不存储任何明文个人信息,开发者可在取得信息主体授权后合规调用。
能力边界:单次核验仅支持一组三要素,不支持批量。QPS限制为5次/秒(以账号维度),超出限制会返回频率控制错误。接口只反馈核验结果,不提供运营商归属地、在网时长等衍生信息。
接口参数与鉴权
请求方式
- HTTP方法:
POST - 请求地址:
https://v1.apizero.cn/api/carrier-3c
Header参数
| 参数名 | 是否必须 | 类型 | 说明 |
|---|---|---|---|
| Authorization | 是 | string | Bearer <你的API Key> |
| Content-Type | 否 | string | 请求体格式,默认application/json |
请求体字段
| 字段名 | 类型 | 是否必须 | 说明 | 别名 |
|---|---|---|---|---|
| name | string | 是 | 真实姓名(中文) | realname / xm |
| mobile | string | 是 | 11位手机号 | phone / sj |
| idcard | string | 是 | 18位身份证号,末位X兼容大小写 | id_card / sf |
示例请求体:
{
"name": "张三",
"mobile": "13800138000",
"idcard": "110101199001011234"
}
curl接入示例
以下是一个可直接复制的curl请求,请将$APIZERO_API_KEY替换为你实际的API Key:
curl -sS \
-X POST \
-H "Authorization: Bearer $APIZERO_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "李四",
"mobile": "13912345678",
"idcard": "320102199003074567"
}' \
"https://v1.apizero.cn/api/carrier-3c"
注意:此处使用的手机号、姓名、身份证号均为测试数据,实际调用请使用真实用户信息。
Python接入示例
import requests
url = "https://v1.apizero.cn/api/carrier-3c"
payload = {
"name": "王五",
"mobile": "13698765432",
"idcard": "110101199501011234"
}
headers = {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())
返回值解读
成功响应(HTTP 200)
{
"code": 0,
"msg": "成功",
"request_id": "abc123",
"data": {
"name": "张三",
"mobile": "138****0000",
"idcard": "110***********001X",
"match": true,
"result": "三要素一致"
}
}
| 字段 | 类型 | 说明 |
|---|---|---|
| code | int | 业务状态码,0表示成功 |
| msg | string | 状态描述 |
| request_id | string | 本次请求的全局唯一标识 |
| data.name | string | 脱敏后的姓名 |
| data.mobile | string | 脱敏后的手机号 |
| data.idcard | string | 脱敏后的身份证号 |
| data.match | bool | 核验是否匹配 |
| data.result | string | 核验结论描述 |
核验结论说明:
"三要素一致"→ match=true"信息不一致"→ match=false"无法核验"→ match=false(运营商数据不足)
常见错误与排错指南
错误类型总览
| 错误表现 | 典型原因 | 解决方向 |
|---|---|---|
| HTTP 401 | Authorization头缺失或API Key无效 | 检查Header格式和Key有效性 |
| HTTP 400 | 请求体JSON格式错误或参数类型不符 | 使用JSON校验工具检查payload |
| HTTP 429 | 超过QPS限制(5次/秒) | 增加调用间隔或实现限流重试 |
| code非0 | 业务层校验失败 | 根据code字段定位具体问题 |
| 网络超时 | 代理/防火墙/出口IP问题 | 检查网络连通性 |
1. 鉴权失败(HTTP 401)
现象:返回{"code":401, "msg":"Unauthorized"}。
排查步骤:
- 确认
Authorization头格式为Bearer <API Key>,注意Bearer后面有一个空格。 - 检查API Key是否已过期或未生效(控制台可查询状态)。
- 检查是否有额外的空格或换行符。
- 对比curl命令中的Header写法:
-H "Authorization: Bearer $APIZERO_API_KEY"。
2. 参数缺失或格式错误(HTTP 400)
现象:返回{"code":400, "msg":"参数错误"},并可能附带errors字段详细说明。
常见原因:
name字段包含数字或特殊符号(仅允许中文)。mobile位数不足11位或包含非数字字符。idcard位数不是18位(含X时大小写混用)。- 请求体JSON语法错误(如尾逗号、双引号未转义)。
验证方法:使用curl -d '...'前,先通过管道| jq .检查JSON合法性:
echo '{"name":"张三","mobile":"13800138000","idcard":"110101199001011234"}' | jq
3. 业务核验错误(code非0)
接口在HTTP 200下也可能返回非0的code,常见code如下:
| code | msg含义 | 处理建议 |
|---|---|---|
| 1001 | 当日的可调用量已用尽 | 检查账户剩余次数或次月重置 |
| 1002 | 姓名格式不合法 | 确认name为纯中文 |
| 1003 | 手机号格式不合法 | 检查手机号是否为11位数字 |
| 1004 | 身份证号格式不合法 | 校验身份证校验位算法 |
| 1005 | 调用频次超限 | 降低请求频率,QPS限制5次/秒 |
| 2001 | 运营商无数据(无法核验) | 该号码可能为虚拟运营商或携号转网 |
| 2002 | 身份信息被运营商标记异常 | 建议换用其他核验通道 |
| 9999 | 系统内部错误 | 间隔重试,若持续出现请联系技术支持 |
排错示例:假设请求正常但返回{"code":2001, "msg":"运营商无数据", "data":{"match":false}},表示该号码对应的运营商数据库暂未收录三要素,并非参数错误。此时应在业务层兜底,例如降级为二要素核验或人工审核。
4. QPS超限(HTTP 429)
现象:频繁请求时收到{"code":429, "msg":"请求过于频繁"}。
解决方案:
- 在客户端实现令牌桶或滑动窗口限流,确保每秒不超过5次。
- 对429响应做指数退避重试(例如等待1秒、2秒、4秒…)。
- 若业务峰值需要更高QPS,联系服务提供商申请调整。
5. 数据脱敏与隐私合规
官网接口文档明确:接口不存储明文数据,响应中data.name、data.mobile、data.idcard均为脱敏后的字符串。开发者不应将原始请求参数或脱敏后结果明文打印到日志中,尤其是身份证号和手机号。建议在日志中只保留request_id用于问题追溯。
6. 网络层错误
现象:curl返回curl: (28) Connection timed out。
排查:
- 检查服务器是否可访问公网。
- 验证目标IP是否被防火墙/安全组拦截。
- 使用
curl -v详细查看握手阶段。 - 如果使用代理,确认http_proxy / https_proxy环境变量正确。
工程化注意事项
必做检查清单
- 参数白名单校验:在调用前对
idcard做18位长度和校验位检查(ISO 7064:1983, MOD 11-2算法),可提前拦截大量格式错误请求,节省维护复杂度。 - 别名兼容:接口文档允许
name/realname/xm、mobile/phone/sj、idcard/id_card/sf多组别名。建议在SDK或中间件中统一映射为规范字段名后提交,避免因别名未识别导致的参数缺失。 - 请求去重:使用
request_id做幂等判断,避免重复请求产生额外计费。 - 错误码分级告警:对于
1001(余额不足)和9999(系统错误)应触发P0告警;对于2001(无数据)属于正常业务错误,无需告警。 - 合规声明:在调用接口前确保已获得用户明确授权,并在隐私政策中说明数据流转。
重试策略建议
import time
import requests
def call_with_retry(url, headers, payload, max_retries=3):
for attempt in range(max_retries):
try:
resp = requests.post(url, json=payload, headers=headers, timeout=5)
if resp.status_code == 429:
time.sleep(2 ** attempt)
continue
return resp
except requests.exceptions.Timeout:
if attempt == max_retries - 1:
raise
time.sleep(1)
return None
参考文档
- 接口文档:https://apizero.cn/aidocs/carrier-3c
- 原始文档(Markdown):https://apizero.cn/aidocs/carrier-3c/raw.md

458

被折叠的 条评论
为什么被折叠?



