52 lines
1.9 KiB
Markdown
52 lines
1.9 KiB
Markdown
|
|
# 身份证识别(百度 OCR + AES)
|
|||
|
|
|
|||
|
|
调用百度身份证 OCR 接口,对图片做 AES 加密上传,对返回的 `result` 密文做 Base64 解码 + AES 解密后解析出所需字段。
|
|||
|
|
|
|||
|
|
## 依赖
|
|||
|
|
|
|||
|
|
- JDK 8+
|
|||
|
|
- [fastjson](https://github.com/alibaba/fastjson)(解析返回 JSON)
|
|||
|
|
|
|||
|
|
## 配置
|
|||
|
|
|
|||
|
|
从百度控制台获取:
|
|||
|
|
|
|||
|
|
- **access_token**:OAuth2 获取(或使用 API Key + Secret Key 换 token)
|
|||
|
|
- **aesKey**:16 位 hex 字符串(控制台身份证 OCR 安全设置里)
|
|||
|
|
|
|||
|
|
## 使用示例
|
|||
|
|
|
|||
|
|
```java
|
|||
|
|
// 构造识别器(accessToken、aesKey 建议从配置文件或环境变量读取)
|
|||
|
|
IdcardRecognizer recognizer = new IdcardRecognizer(accessToken, aesKey);
|
|||
|
|
|
|||
|
|
// 方式一:本地文件
|
|||
|
|
IdcardRecognizer.IdcardResult result = recognizer.recognize("/path/to/idcard_front.jpg", "front");
|
|||
|
|
if (result != null) {
|
|||
|
|
System.out.println("姓名: " + result.getName());
|
|||
|
|
System.out.println("身份证号: " + result.getIdNumber());
|
|||
|
|
System.out.println("出生: " + result.getBirth());
|
|||
|
|
System.out.println("住址: " + result.getAddress());
|
|||
|
|
// ...
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 方式二:上传的图片字节(如 MultipartFile.getBytes())
|
|||
|
|
byte[] imgBytes = ...;
|
|||
|
|
IdcardRecognizer.IdcardResult back = recognizer.recognize(imgBytes, "back");
|
|||
|
|
if (back != null) {
|
|||
|
|
System.out.println("签发机关: " + back.getIssueAuthority());
|
|||
|
|
System.out.println("有效期限: " + back.getValidDate());
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 返回字段说明
|
|||
|
|
|
|||
|
|
- **正面 (side=front)**:`name` 姓名、`gender` 性别、`nation` 民族、`birth` 出生、`address` 住址、`idNumber` 公民身份号码
|
|||
|
|
- **反面 (side=back)**:`issueAuthority` 签发机关、`validDate` 有效期限
|
|||
|
|
|
|||
|
|
按百度接口约定,请求时 `id_card_side` 传 `front` 或 `back`。
|
|||
|
|
|
|||
|
|
## 集成到现有后端
|
|||
|
|
|
|||
|
|
将 `com.ydoyun.ocr` 包拷贝到你的项目中,并加入 fastjson 依赖即可;若项目已使用 Spring,可把 `IdcardRecognizer` 做成 Bean,`accessToken`、`aesKey` 从 `@Value` 或配置类注入。
|