无法读取身份证物理uid,因国密规范禁止直接访问;只能通过公安认证sdk走apdu指令合法读取结构化身份信息。

uni-app 本身不提供直接读取身份证物理卡号(即芯片 UID 或 ATS)的 API,安卓端必须依赖原生能力 + 正确 NFC 协议栈支持。二代身份证使用的是 ISO 14443-3A(NfcA)协议,其物理卡号(UID)不可被普通 NFC 应用直接读取——这是国密规范强制限制的,目的是防止身份信息被非授权设备批量采集。
所以结论很明确:
你无法在标准合规的 uni-app 应用中,通过 plus.android 或 uni-app-nfc 插件读出身份证的真实 UID(如 8 字节或 4 字节序列号)。所谓“读到的卡号”,绝大多数情况是应用层伪造的、由读卡器生成的伪 ID,或解析 NDEF 消息时误认为的标签 ID,不具备唯一性与权威性。
为什么调用 nfc.onNdefDiscovered 拿不到身份证 UID?
nfc.onNdefDiscovered 拿不到身份证 UID?因为二代身份证不响应 NDEF 格式请求,它不支持 Ndef 技术类型,只响应 NfcA + 自定义 APDU 指令(需国密认证密钥)。uni-app 的通用 NFC 插件(如 uni-app-nfc)默认监听的是 NDEF_DISCOVERED Intent,而身份证卡片根本不会在这个通道上报数据。
- 调用
nfc.onNdefDiscovered后无回调 → 正常现象,不是代码写错了 - 部分插件返回一个形如
"04:12:34:56:78:9A:BC"的字符串 → 这是 NFC 控制器临时分配的伪 ID(ATS 或 SAK 相关),每次靠近可能不同,且不等于身份证芯片物理 UID - Android 系统从 4.4 开始屏蔽了对 ISO 14443-3A UID 的 raw 访问(
Tag.getId()返回的是防克隆处理后的值),厂商固件层也做了二次过滤
真要获取身份证可识别标识,只能走国密读卡流程
合法读取身份证信息(含姓名、照片、卡号等)必须使用国家公安部认证的读卡 SDK,例如:
-
IdCardReaderSDK(华大北斗、神思、天地融等厂商提供) - 调用底层
IsoDep通道发送加密 APDU 指令(如SELECT AID、GET CHALLENGE、READ BINARY) - 需预置国密 SM4 密钥、签名证书,并完成设备级白名单注册(仅允许指定 APP 包名+签名访问)
- uni-app 中必须通过
nativePlugin封装该 SDK,不能靠 JS 层模拟
示例关键路径(Android 原生侧):
String aid = "A00000002501"; // 身份证应用AID
IsoDep isoDep = IsoDep.get(tag);
isoDep.connect();
isoDep.transceive(new byte[]{(byte) 0x00, (byte) 0xA4, (byte) 0x04, (byte) 0x00, (byte) aid.length(), ...}); // SELECT
JS 层调用方式(通过原生插件桥接):
const reader = uni.requireNativePlugin('IdCardReader');
reader.readCard({
timeout: 5000
}, (res) => {
console.log('真实身份证号:', res.idNumber); // 注意:这是逻辑卡号(身份证号码),不是物理 UID
}, (err) => {
console.error('读卡失败:', err.code); // 如 -1001(未授权)、-1002(密钥错误)
});
常见误操作和报错陷阱
开发者最容易踩的坑,不是代码写错,而是对“卡号”概念混淆:
- 把
tag.getId()返回值当作身份证 UID → 实际是 NFC 控制器生成的临时 ID,安卓 10+ 已不可靠 - 在
manifest.json里只配了NFC权限,没加android.permission.USE_BIOMETRIC和前台服务声明 → 华为/小米等机型直接静默拒绝连接 - 用
MifareClassic方式尝试读取 → 身份证不是 Mifare 卡,会抛出IOException: Transceive failed - 未在
xml/nfc_tech_filter.xml中声明<tech-list><tech>android.nfc.tech.NfcA</tech></tech-list>→ 部分安卓版本无法触发TECH_DISCOVERED回调 - 在 HBuilderX 真机运行时开启“调试模式” → 某些 OEM 系统会拦截原生插件调用,导致
readCard无响应
真正能落地的方案,只有两条路:
一是接入公安认证的原生身份证读卡 SDK(封装为 uni-app 原生插件),读取的是结构化身份信息(含身份证号码);
二是放弃物理 UID,改用业务系统生成的设备绑定 ID + 读卡结果哈希做防重校验。
所有试图绕过国密流程、纯前端“读 UID”的做法,要么无效,要么违规。











