身份证 OCR 识别 API 接入详解(Python / Java 示例)

在很多互联网应用中,经常需要对身份证信息进行自动识别,例如:

  • 用户实名认证

  • 金融开户

  • 电商实名认证

  • 政务系统资料录入

传统手动录入效率低且容易出错,而 身份证 OCR 识别 API 可以自动识别图片中的身份证信息,大幅提升系统自动化能力。

本文将通过 Python 和 Java 示例,详细介绍如何快速接入身份证 OCR 识别接口。


一、身份证 OCR 识别是什么

身份证 OCR(Optical Character Recognition)是一种 基于图像识别技术的文字识别能力,可以自动从身份证图片中提取关键信息,例如:

复制代码
姓名
性别
民族
出生日期
身份证号
住址
签发机关
有效期限
附加:身份证的头像处理

开发者只需要上传身份证图片,OCR API 就可以返回结构化 JSON 数据。

常见应用场景:

  • 用户实名认证系统中的信息获取

  • 金融 KYC 认证

  • 酒店入住登记

  • 政务系统信息录入


二、身份证 OCR API 接入流程

一般 OCR API 接入流程如下:

复制代码
准备身份证图片
        ↓
图片转 Base64
        ↓
调用 OCR API
        ↓
返回 JSON 识别结果
        ↓
解析字段信息

接口请求说明:

详细接入可以参考说身份证OCR接入文档:https://market.shiliuai.com/doc/id-card-ocr

请求地址(URL):

复制代码
POST http(s)://ocr-api.shiliuai.com/api/id_card_ocr/v2

请求方式:POST

请求头(Header):

参数 类型 说明
Authorization string 'APPCODE ' + 您的AppCode (注意英文空格)
Content-Type string application/json

请求体(Body)

参数 是否必填 类型 说明
image_base64 必填 string base64编码的图片文件,像素范围:[15,8192],小于20M
return_rectified_card 选填 bool 是否返回裁剪并矫正的身份证图片,默认为False
card_margin_ratio 选填 float 裁剪时的边距比例,等于边距/长边,默认为0
card_width 选填 int 裁剪后的证件图片的宽度
card_height 选填 int 裁剪后的证件图片的高度(如果card_width和card_height都不传,或者都传-1,那么用原图中证件大小 如果其中一个>0, 另一个不传或传-1,那么表示该长度按比例缩放得到)
return_rectified_head 选填 bool 是否返回裁剪并矫正的头像图片,默认为False,头像图片里,头顶和上边会有一些距离( 长宽比是441:358 )
head_width 选填 int 裁剪后的头像图片的宽度,如果head_width和head_height都不传,或者都传-1,那么用原图中头像大小,如果其中一个>0, 另一个不传或传-1,那么表示该长度按比例缩放得到
head_height 选填 int 裁剪后的头像图片的高度

返回信息

返回类型:

JSON

返回码:

参数名 类型 说明
code int 返回码,0表示成功
message string 返回信息

返回信息:

参数 参数类型 说明
code int 错误码
msg string 错误信息(英文)
msg_cn string 错误信息(中文)
success bool 识别是否成功
image_id string 图片ID
request_id string 唯一请求ID
data data 具体看下面

其中data信息:

参数 参数类型 说明 举例
is_front bool 是否正面
complete_score float 完整度[0, 1] 0.8
is_complete bool 是否完整,当complete_score==1时,为True True
unoccluded_score float 无遮挡程度[0, 1]
is_unoccluded bool 是否无遮挡,当unoccluded_score>0.99时,为True
clear_score float [0, 1],清晰度,用文字可识别度计算 0.9
is_clear bool 是否清晰,当clear_score>0.5时,为True
rectified_card_base64 string 裁剪并矫正的身份证图片, 当return_rectified_card=True时有该项
rectified_head_base64 string 裁剪并矫正的头像图片, 当return_rectified_head=True且是正面时有该项

返回示例:

复制代码
{
  "code": 200,
  "msg": "success",
  "msg_cn": "成功",
  "success": true,
  "image_id": "xxxx",
  "request_id": "req_xxxx",
  "data": {
    "is_front": true,
    "complete_score": 0.98,
    "is_complete": true,
    "clear_score": 0.92,
    "is_clear": true,
    "name": "张三",
    "sex": "男",
    "ethnicity": "汉",
    "birthDate": "1990年01月01日",
    "address": "北京市朝阳区XXX",
    "idNumber": "110101199001011234"
  }
}

三、Python 调用身份证 OCR API 示例

首先安装 Python 依赖:

复制代码
pip install requests

示例代码:

python 复制代码
# API文档:https://market.shiliuai.com/doc/id-card-ocr
# -*- coding: utf-8 -*-
import requests
import base64
import json

# 请求接口
URL = "https://ocr-api.shiliuai.com/api/id_card_ocr/v2"

# 图片转base64
def get_base64(file_path):
    with open(file_path, 'rb') as f:
        data = f.read()
    b64 = base64.b64encode(data).decode('utf8')
    return b64

def demo(appcode, file_path):
    # 请求头
    headers = {
        'Authorization': 'APPCODE %s' % appcode,
        'Content-Type': 'application/json'
    }
    # 请求体
    b64 = get_base64(file_path)
    data = {"image_base64": b64}
    # 请求
    response = requests.post(url=URL, headers=headers, json=data)
    content = json.loads(response.content)
    print(content)

if __name__=="__main__":
    appcode = "你的APPCODE"
    file_path = "本地图片路径"
    demo(appcode, file_path)

四、Java 调用身份证 OCR API 示例

Java 可以使用 HttpURLConnectionOkHttp 调用接口。

示例代码:

java 复制代码
//=====================================================
// API文档:https://market.shiliuai.com/doc/id-card-ocr
//=====================================================

import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import java.util.Base64;

public class Main {
    public static String get_base64(String path) {
        String b64 = "";
        try {
            // 使用Commons IO简化文件读取
            byte[] content = FileUtils.readFileToByteArray(new File(path));
            // 使用JDK自带的Base64
            b64 = Base64.getEncoder().encodeToString(content);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return b64;
    }

    public static void main(String[] args) {
        String url = "https://ocr-api.shiliuai.com/api/id_card_ocr/v2"; // 请求接口
        String appcode = "你的APPCODE";
        String imgFile = "本地图片路径";

        Map headers = new HashMap<>();
        headers.put("Authorization", "APPCODE " + appcode);
        headers.put("Content-Type", "application/json");

        // 请求体
        JSONObject requestObj = new JSONObject();
        requestObj.put("image_base64", get_base64(imgFile));
        String bodys = requestObj.toString();

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            // 创建POST请求
            HttpPost httpPost = new HttpPost(url);
            
            // 设置请求头
            for (Map.Entry entry : headers.entrySet()) {
                httpPost.addHeader(entry.getKey(), entry.getValue());
            }
            
            // 设置请求体
            StringEntity entity = new StringEntity(bodys, "UTF-8");
            httpPost.setEntity(entity);
            
            // 执行请求
            HttpResponse response = httpClient.execute(httpPost);
            int stat = response.getStatusLine().getStatusCode();
            if (stat != 200) {
                System.out.println("Http code: " + stat);
                return;
            }
            String res = EntityUtils.toString(response.getEntity());
            JSONObject res_obj = JSON.parseObject(res);
            System.out.println(res_obj.toJSONString());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

五、身份证 OCR 识别示例效果

示例身份证图片:

识别结果:

开发者可以直接将返回 JSON 存入数据库或用于实名认证流程。


六、身份证 OCR 识别常见问题

1 图片模糊识别率低

建议:

  • 分辨率 ≥ 800px

  • 避免反光

  • 身份证完整入镜


2 身份证倾斜

可以在识别前做简单图像处理:

  • 自动旋转

  • 边缘检测

  • 裁剪身份证区域


3 批量识别效率问题

对于批量识别场景,可以:

  • 使用多线程调用 API

  • 异步队列处理

  • 批量任务系统


七、在线体验身份证 OCR

如果想快速测试身份证识别效果,可以先通过在线工具进行测试,然后再接入 API。

在线体验:https://market.shiliuai.com/id-card-ocr

支持:

  • 身份证正面识别

  • 身份证反面识别

  • 自动信息提取

  • 人像提取与优化调整操作

开发者可以根据测试效果再接入 API。


八、总结

身份证 OCR 是 OCR 技术中非常常见的应用场景,通过 API 接口可以快速实现:

  • 用户实名认证

  • 自动信息录入

  • 身份证信息提取

本文介绍了 身份证 OCR API 接入流程,并提供 Python 和 Java 示例代码,开发者可以根据自己的项目需求快速接入。

如果你正在开发 实名认证系统、金融系统或自动化信息录入系统,OCR API 可以大幅减少人工输入成本,提高系统效率。

相关推荐
qq_206901392 小时前
CSS如何选择同级中的第一个元素_通过-first-child伪类实现
jvm·数据库·python
云烟成雨TD2 小时前
Spring AI Alibaba 1.x 系列【16】异步工具核心组件与执行流程
java·人工智能·spring
翼龙云_cloud2 小时前
阿里云代理商:详解阿里云部署OpenClaw 且接入Playwright指南
人工智能·阿里云·云计算·openclaw
AI、少年郎2 小时前
MiniMind 第 4 篇:《数据工程|Tokenizer 训练 + 预训练 / SFT/DPO 全数据集处理》
人工智能·python·ai·大模型·微调·大模型训练·minimind
马士兵教育2 小时前
AI工作岗位的就业分层?
开发语言·人工智能·学习·面试·职场和发展
leoZ2312 小时前
胡思乱想。。。
人工智能
南师大蒜阿熏呀2 小时前
AI助手分析清理电脑垃圾
人工智能
清 晨2 小时前
社媒引流不稳定跨境卖家如何建立长期流量池
大数据·人工智能·新媒体运营·跨境·营销策略
quetalangtaosha2 小时前
Anomaly Detection系列(CVPR2025 TAO论文解读)
人工智能·异常检测