fucai-server/IDCARD_IMPLEMENTATION.md

249 lines
6.3 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 身份证识别接口实现完成
## ✅ 实现状态
身份证识别接口已成功添加到 `OcrController.java` 中,完全参考结婚证识别接口的逻辑。
## 📋 实现内容
### 1. 新增配置
在 OcrController 中添加了身份证API配置
```java
@Value("${baidu.ocr.idCardUrl:https://aip.baidubce.com/rest/2.0/ocr/v1/idcard}")
private String idCardUrl;
```
### 2. 新增识别接口
**接口方法**: `/marriage/ocr/parseIdCard`
```java
@PostMapping("/parseIdCard")
public ResultObject parseIdCard(@RequestBody OcrParseDTO dto)
```
**功能**: 识别身份证正面
**流程**:
1. 验证手机号、验证码、上传ID
2. 从Redis中获取上传的图片Base64数据
3. 调用百度身份证识别API
4. 解析识别结果提取字段数据包含probability和location
5. 返回详细和简化两种格式
### 3. 支持的识别字段
- **name** - 姓名
- **gender** - 性别
- **nationality** - 民族
- **birthday** - 出生日期
- **address** - 住址
- **id_number** - 身份证号
### 4. 核心辅助方法
#### parseIdCardFieldsFromRawDetailed()
从百度API原始响应解析身份证字段数据提取所<EFBFBD><EFBFBD><EFBFBD>字段的word、probability和location信息。
#### extractFieldDataFromIdCardNode()
从JSON节点提取单个身份证字段的完整数据word、probability、location
#### extractAndAddIdCardField()
提取并添加身份证字段到结果Map中。
#### parseIdCardFieldsSimple()
简单的字段解析fallback方法
## 🚀 API 使用方法
### 第一步:上传身份证图片
```bash
curl -X POST \
-F "file=@idcard_front.jpg" \
http://localhost:8080/marriage/ocr/upload
```
**响应**:
```json
{
"code": 200,
"msg": "success",
"data": {
"uploadId": "xxx"
}
}
```
### 第二步:识别身份证正面
```bash
curl -X POST \
-H "Content-Type: application/json" \
-d '{
"mobile": "18888888888",
"smsCode": "123456",
"uploadId": "xxx"
}' \
http://localhost:8080/marriage/ocr/parseIdCard
```
## 📊 响应格式示例
```json
{
"code": 200,
"msg": "success",
"data": {
"raw": "{百度API原始JSON响应}",
"words": ["王连杰", "男", "汉族", "1995年04月01日", ...],
"parsed": {
"name": "王连杰",
"gender": "男",
"nationality": "汉族",
"birthday": "1995-04-01",
"address": "江苏省南京市...",
"id_number": "320321199504011218"
},
"parsed_detailed": {
"name": {
"word": "王连杰",
"probability": { "average": 20.69, "min": 0.91 },
"location": { "width": 109, "height": 47, "top": 933, "left": 253 }
},
"gender": {
"word": "男",
"probability": { "average": 25.0, "min": 0.95 },
"location": { "width": 50, "height": 40, "top": 980, "left": 300 }
},
...其他字段...
}
}
}
```
## ✨ 关键特性
### ✅ 完全参考parse接口逻辑
- 相同的验证流程
- 相同的Redis缓存机制
- 相同的API调用方式
- 相同的数据解析逻辑
### ✅ 复用upload接口
- 使用相同的上传接口
- 图片存储到Redis中
- 10分钟有效期
### ✅ 支持probability和location
- 返回识别概率信息average和min
- 返回识别位置信息width、height、top、left
- parsed和parsed_detailed两种格式
### ✅ 验证关键字段
- 必须包含name和id_number
- 缺少关键字段时返回错误提示
## 📝 配置要求
需要在 `application.properties``application.yml` 中配置百度OCR API参数
```properties
baidu.ocr.apiKey=your_api_key
baidu.ocr.secretKey=your_secret_key
baidu.ocr.idCardUrl=https://aip.baidubce.com/rest/2.0/ocr/v1/idcard
```
## 🔍 流程对比
### 结婚证识别 (/parse)
```
upload() → parseIdCard()
├─ 验证手机号、验证码、uploadId
├─ 从Redis获取图片
├─ 调用百度API
├─ parseMarriageFieldsFromRawDetailed() - 提取字段
└─ 返回结果
```
### 身份证识别 (/parseIdCard)
```
upload() → parseIdCard()
├─ 验证手机号、验证码、uploadId
├─ 从Redis获取图片
├─ 调用百度API
├─ parseIdCardFieldsFromRawDetailed() - 提取字段
└─ 返回结果
```
## 🛠️ 技术细节
### 百度API请求参数
```java
params.put("image", imageBase64); // 图片Base64
params.put("id_card_side", "front"); // 正面
params.put("probability", "true"); // 返回概率信息
params.put("location", "true"); // 返回位置信息
```
### 字段解析流程
1. 获取API返回的 `words_result` 数组
2. 取第一个元素(通常是完整的结果对象)
3. 逐个提取各字段(姓名、性别、民族等)
4. 构建OcrFieldData对象包含word、probability、location
5. 同时转换为简化格式仅包含word
### 错误处理
- 验证码错误时返回 `验证码错误,请重新输入!`
- 文件不存在时返回 `上传文件不存在或已过期,请重新上传!`
- 缺少关键字段时返回 `请上传完整清晰的身份证正面`
- API调用失败时返回 `识别失败,请稍后再试!`
## 📚 文件位置
- **源文件**: `/Users/bugjiewang/StudioProjects/fucai-server/com-marriage-client/src/main/java/com/jinrui/marriage/client/controller/OcrController.java`
**新增的方法**:
- `parseIdCard()` - 主要接口方法
- `parseIdCardFieldsFromRawDetailed()` - 详细字段解析
- `extractFieldDataFromIdCardNode()` - 单个字段提取
- `extractAndAddIdCardField()` - 字段辅助添加
- `parseIdCardFieldsSimple()` - 简化字段解析fallback
## ✅ 编译验证
代码已成功编译,仅有以下警告(非关键):
- 字段未使用警告
- 泛型参数警告
- 条件始终真/假警告
- main()方法签名警告
所有功能已完整实现,可正常使用。
## 🔗 相关接口
### 上传接口
- **URL**: `/marriage/ocr/upload`
- **方法**: POST
- **参数**: fileMultipartFile
- **返回**: uploadId
### 结婚证识别接口
- **URL**: `/marriage/ocr/parse`
- **方法**: POST
- **参数**: mobile, smsCode, uploadId
- **返回**: 结婚证识别结果
### 身份证识别接口(新增)
- **URL**: `/marriage/ocr/parseIdCard`
- **方法**: POST
- **参数**: mobile, smsCode, uploadId
- **返回**: 身份证识别结果
---
实现完成!✨