# 小程序出行人接入阿里云 OCR 多证件识别，下线微信 OCR

**日期**：2026-04-20
**PR**：#1039
**Issue**：#1036
**影响**：小程序端「出行人录入」模块

---

## 业务变化

微信官方 OCR 接口不再允许使用。出行人证件 OCR 后端切换到阿里云「个人证照识别」SDK，并扩展支持**4 种证件**：

| 证件 | idCardType | 后端走的 SDK |
|---|---|---|
| 身份证 | `ID_CARD` | RecognizeIdcard |
| 护照 | `PASSPORT` | RecognizePassport |
| 港澳通行证 | `HK_MACAU_PASS` | RecognizeExitEntryPermitToHK |
| 台湾通行证 | `TAIWAN_PASS` | RecognizeExitEntryPermitToHK（同接口，签发格式一致） |

军官证 / 其他证件类型直接返回 400「不支持的证件类型」，前端做好容错。

---

## ❌ 下线接口

### `POST /mp/user/ocr/idcard`（微信 OCR 老接口）

**下线原因**：微信 OCR 接口权限被关闭。

**前端必须在本次同步内去掉该接口调用**。

---

## ✅ 新增接口

### `POST /mp/traveler/ocr` —— 多证件 OCR 识别

**用途**：小程序出行人录入页，用户上传证件照到 OSS 后，用 OSS URL 调此接口识别，返回结构化字段**供用户确认后再手动调** `POST /user/traveler` **保存**（OCR 不直接落库）。

**请求** `Content-Type: application/json`：

```json
{
  "idCardType": "ID_CARD",
  "ossUrl": "https://hlgl-test.oss-cn-beijing.aliyuncs.com/xxx/id-front.jpg"
}
```

| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| idCardType | string | 是 | 证件类型。仅支持 `ID_CARD` / `PASSPORT` / `HK_MACAU_PASS` / `TAIWAN_PASS`，其余直接返回 400 |
| ossUrl | string | 是 | 证件图 OSS 公开地址（走现有 `POST /mp/file/upload` 拿） |

**响应**（`TravelerOcrRespVO`，所有字段均为字符串/日期，**按证件类型可能为 null**）：

```json
{
  "code": 200,
  "message": "success",
  "data": {
    "name": "张三",
    "gender": "男",
    "nationality": "汉",
    "nationalityText": "中国 / CHN",
    "birthday": "1990-01-01",
    "idCardNo": "110101199001011234",
    "address": "北京市朝阳区...",
    "validityStart": "2020-01-01",
    "validityEnd": "2040-01-01",
    "issueAuthority": "北京市公安局朝阳分局",
    "issuePlace": null
  }
}
```

字段适用表：

| 字段 | 身份证 | 护照 | 港澳通 | 台湾通 |
|---|---|---|---|---|
| name | ✔️ | ✔️ | ✔️ | ✔️ |
| gender | ✔️ | ✔️ | ✔️ | ✔️ |
| nationality | 民族（汉） | 国籍英文（CHN） | — | — |
| nationalityText | — | 国籍中文（中国） | — | — |
| birthday | ✔️ | ✔️ | ✔️ | ✔️ |
| idCardNo | 身份证号 | 护照号 | 通行证号 | 通行证号 |
| address | ✔️（身份证住址） | — | — | — |
| validityStart / validityEnd | ✔️ | ✔️ | ✔️ | ✔️ |
| issueAuthority | — | ✔️ | ✔️ | ✔️ |
| issuePlace | — | ✔️ | — | — |

---

## 错误码

| HTTP | code | message | 原因 |
|---|---|---|---|
| 200 | 200 | success | 识别成功 |
| 200 | 400 | 不支持的证件类型 | idCardType 不在上面 4 种之内 |
| 200 | 400 | 参数校验失败 | ossUrl 不是 http/https 或 idCardType 空 |
| 200 | 500 | 身份证识别失败，请重试 | 阿里云 SDK 异常（图片质量/网络/额度等），失败已记审计 |

**建议前端**：调用前做**图片压缩**（建议 ≤ 3MB）；失败后提示用户"重新拍照"，不要自动重试（会多扣配额）。

---

## 前端改造 checklist

- [ ] 出行人录入页 OCR 入口替换为 `POST /mp/traveler/ocr`
- [ ] 增加证件类型选择（4 个），默认 `ID_CARD`
- [ ] 老接口 `/mp/user/ocr/idcard` 调用代码全部删除
- [ ] OCR 返回字段渲染到表单输入框里，**让用户确认/编辑后**再提交，不要直接调保存
- [ ] 根据 `idCardType` 决定展示哪些字段（护照多个 `nationalityText`，身份证多个 `address`）

---

## 其它

- 免费额度：每类证件 200 次/月，超出按量付费（阿里云账单）
- QPS：默认 10
- 审计日志（`traveler_ocr_log`）仅后端使用，前端不感知
