API 文档 / 银行卡实名认证
银行卡实名认证接口
核验姓名、身份证号、银行卡号、银行预留手机号四要素是否一致,并返回开户行与卡类型。
请求地址
完整地址:https://smrz.anyixing.com.cn/api/v1/bankcard
请求方式:POST Content-Type:application/json 鉴权:X-Api-Key
核验要素:四要素:name + idcard + bankcard + mobile
请求方式:POST Content-Type:application/json 鉴权:X-Api-Key
核验要素:四要素:name + idcard + bankcard + mobile
本接口判断「这张卡是不是这个人的」。四要素缺一不可:姓名、身份证号、银行卡号,再加上银行预留手机号。资金链路里只用三要素是不够的——手机号是银行侧的另一道绑定关系,补上它才能挡住「卡号与姓名都对、但号码不是本人预留」的情况。核验一致时同时返回开户行名称、卡类型与脱敏卡号。
请求参数
| 参数 | 类型 | 必填 | 说明 | 示例 |
|---|---|---|---|---|
| name* | string | 是 | 姓名,中文全名,须与银行开户姓名完全一致 | 张三 |
| idcard* | string | 是 | 18 位居民身份证号,末位可为 X/x | 330102199001010012 |
| bankcard* | string | 是 | 银行卡号,12–19 位数字,不允许含空格与短横线 | 6222021234567894 |
| mobile* | string | 是 | 银行「预留」手机号,11 位。不是你现在用的号,是办卡时在银行登记的那个 | 13800138000 |
请求示例
curl
curl -X POST "https://smrz.anyixing.com.cn/api/v1/bankcard" \ -H "Content-Type: application/json" \ -H "X-Api-Key: aB3xK9mP2qR7sT5vW8yZ4nC6dF1gH0jL" \ -d '{"name":"张三","idcard":"330102199001010012","bankcard":"6222021234567894","mobile":"13800138000"}'
PHP
<?php $payload = '{"name":"张三","idcard":"330102199001010012","bankcard":"6222021234567894","mobile":"13800138000"}'; $ch = curl_init('https://smrz.anyixing.com.cn/api/v1/bankcard'); curl_setopt_array($ch, array( CURLOPT_POST => true, CURLOPT_POSTFIELDS => $payload, CURLOPT_RETURNTRANSFER => true, CURLOPT_TIMEOUT => 10, CURLOPT_HTTPHEADER => array( 'Content-Type: application/json', 'X-Api-Key: aB3xK9mP2qR7sT5vW8yZ4nC6dF1gH0jL' ), )); $res = curl_exec($ch); curl_close($ch); $json = json_decode($res, true); if ($json['code'] === 0) { // data.result 为核验结论 }
Python
import requests resp = requests.post( 'https://smrz.anyixing.com.cn/api/v1/bankcard', json={"name":"张三","idcard":"330102199001010012","bankcard":"6222021234567894","mobile":"13800138000"}, headers={'X-Api-Key': 'aB3xK9mP2qR7sT5vW8yZ4nC6dF1gH0jL'}, timeout=10, ) data = resp.json() if data['code'] == 0: print(data['data']['result'])
返回参数
| 字段 | 类型 | 说明 |
|---|---|---|
| code | int | 调用状态码,0 表示调用被正常处理,不代表核验一致 |
| msg | string | 状态描述,可直接写入日志 |
| data.result | string | 核验结论,取值见下方「核验结论」 |
| data.bank_name | string | 开户行名称,如「招商银行」。仅在核验一致时返回 |
| data.card_type | string | 卡类型,如「储蓄卡」「信用卡」。仅在核验一致时返回 |
| data.card_mask | string | 脱敏卡号,保留前 6 位与后 4 位。请求带卡号时都会返回 |
| data.fee | decimal | 本次调用实际扣费金额(元) |
| data.balance | decimal | 调用后的账户可用余额(元) |
| data.req_id | string | 本次请求流水号,排查问题时提供此值 |
| data.cost_ms | int | 接口耗时(毫秒) |
返回示例
调用成功(业务结论为一致)
{
"code": 0,
"msg": "核验一致",
"data": {
"result": "MATCH",
"bank_name": "招商银行",
"card_type": "储蓄卡",
"card_mask": "622202****7894",
"fee": 0.20,
"balance": 986.20,
"req_id": "b2c3d4e5f6a7b8c9",
"cost_ms": 286
}
}调用失败(余额不足)
{
"code": 1003,
"msg": "余额不足,请充值后重试",
"data": null
}核验结论
仅当 code = 0 时存在 data.result。
| data.result | 含义 | 说明 | 计费 |
|---|---|---|---|
| MATCH | 核验一致 | 四要素全部匹配,该卡归属此人 | 计费 |
| NO_MATCH | 核验不一致 | 四要素中至少一项不匹配(含预留手机号不符) | 计费 |
| NO_CARD | 卡号不存在 | 银行卡号无效、未开卡或已注销 | 计费 |
错误码
| code | 含义 | 说明与处理 |
|---|---|---|
| 0 | 调用成功 | 按 data.result 判断核验结论,已计费 |
| 1001 | 参数错误 | 缺少必填字段、字段格式不合法或校验位错误。本地即拦截,未计费,也不会产生调用记录 |
| 1002 | 鉴权失败 | 密钥缺失、无效、已重置,或账号被停用。未计费 |
| 1003 | 余额不足 | 账户可用余额低于本次单价,充值后重试。未计费 |
| 1004 | 频率超限 | 超出账号的 QPS 上限。未计费,退避后重试 |
| 1005 | 接口不可用 | 该接口未对本账号开放,或平台侧临时关闭。未计费,联系客服确认 |
| 1006 | 核验频次超限 | 触发了防刷规则(同一主体短时间内在试多个不同对象)。未计费,等窗口期过后再试,详见本页「频率与防刷」 |
| 2001 | 上游超时 | 数据源响应超时或繁忙。未计费,按指数退避重试 |
| 2002 | 上游异常 | 数据源返回异常。未计费,记录 req_id 联系客服 |
计费规则
- 单价按账号累计充值额所属档位执行,起步 ¥0.35 / 次。
- 一致、不一致、卡号不存在均计费。
- 参数错误、鉴权失败、余额不足、防刷拦截、上游异常不计费。
频率与防刷
账号级 QPS 上限为 20,超出返回 1004。除 QPS 外,为防止有人拿真实号码猜姓名、或拿真实姓名批量试号码,另设以下防刷规则,触发返回 1006:
- 同一卡号,60 分钟内出现 ≥5 个不同姓名 → 拦截
- 同一卡号,60 分钟内出现 ≥5 个不同身份证号 → 拦截
- 同一卡号,60 分钟内出现 ≥5 个不同预留手机号 → 拦截
- 同一姓名,60 分钟内查询 ≥10 张不同卡号 → 拦截
- 计数为全局维度,跨账号累计。
正常业务(同一批用户一人一次)不会触发。如果是批量核验且确有需要,联系客服说明用途可调整阈值。
注意事项
- 手机号必须是银行预留手机号,填错会得到「不一致」,这是四要素核验的正常结论,同样计费。
- 卡号会先做 Luhn 校验,校验失败的号码在本地被拦截(返回 1001),不计费。
- 返回的卡号一律脱敏,仅保留前 6 位与后 4 位,任何情况下都不返回完整卡号。
- 二类户、三类户同样支持核验,接口按卡号核验归属,不区分账户类别。