springboot实现调用百度ocr实现身份识别+二要素校验功能

 更新时间:2025年03月22日 10:18:32   作者:似璟如你  
本文介绍了如何使用Spring Boot调用百度OCR服务进行身份识别,并通过二要素校验确保信息准确性,感兴趣的朋友一起看看吧

一、技术选型

OCR服务:推荐使用百度AI

二、实现

1.注册一个服务

百度智能云控制台

https://console.bce.baidu.com/ai-engine/ocr/overview/index?_=1742309417611

填写完之后可以获取到app-idapiKeySecretKey这三个后面文件配置会用到

2、导入依赖

        <!-- Spring Boot Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.6.13</version>
        </dependency>
        <!-- 百度AI SDK(示例) -->
        <dependency>
            <groupId>com.baidu.aip</groupId>
            <artifactId>java-sdk</artifactId>
            <version>4.16.13</version>
        </dependency>
        <!--json依赖-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>2.0.40</version>
        </dependency>

3、配置文件

spring:
  servlet:
    multipart:
      max-request-size: 10MB # 文件上传最大值
      max-file-size: 10MB # 单个文件最大值
baidu:
  ai:
    app-id: ***** 换成自己的
    secret-key: ***** 换成自己的
    api-key: ***** 换成自己的

4、编写OCR工具类

import com.baidu.aip.ocr.AipOcr;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
@Component
public class OcrService {
    @Value("${baidu.ai.app-id}")
    private String appId;
    @Value("${baidu.ai.api-key}")
    private String apiKey;
    @Value("${baidu.ai.secret-key}")
    private String secretKey;
    public Map<String, String> recognizeIdCard(MultipartFile file, boolean isFront) throws Exception {
        AipOcr client = new AipOcr(appId, apiKey, secretKey);
        // 读取图片字节
        byte[] imgData = file.getBytes();
        // 设置身份证正反面
        String idCardSide = isFront ? "front" : "back";
        // 设置其他识别选项(如果有)
        HashMap<String, String> options = new HashMap<String, String>();
        // 可以在这里添加其他选项,例如:
        // options.put("detect_direction", "true"); // 检测图像朝向
        // 调用身份证识别接口
        JSONObject res = client.idcard(imgData, idCardSide, options);
        // 检查返回结果
        if (res == null || !res.has("words_result")) {
            throw new Exception("OCR 识别失败: 返回结果为空或不包含 words_result");
        }
        // 解析结果
        Map<String, String> result = new HashMap<String, String>();
        JSONObject words = res.getJSONObject("words_result");
        // 根据正反面提取不同字段
        if (isFront) {
            result.put("姓名", words.optString("姓名", ""));
            result.put("性别", words.optString("性别", ""));
            result.put("民族", words.optString("民族", ""));
            result.put("出生日期", words.optString("出生年月日", ""));
            result.put("住址", words.optString("住址", ""));
            result.put("身份证号", words.optString("公民身份号码", ""));
        } else {
            result.put("签发机关", words.optString("签发机关", ""));
            result.put("有效期限", words.optString("失效日期", ""));
        }
        return result;
    }
}

5、文件上传接口

import com.alibaba.fastjson.JSON;
import com.cykj.service.OcrService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.util.HashMap;
import java.util.Map;
@RestController
@RequestMapping("/api/idcard")
/**
 * 身份证识别控制器
 * 提供身份证图片上传和识别功能
 */
public class IdCardController {
    @Autowired
    private OcrService ocrService;
    /**
     * 上传身份证图片并进行识别
     * 
     * @param frontFile 身份证正面图片
     * @param backFile 身份证反面图片
     * @return 身份证信息的Map,包括正面和反面的识别结果
     */
    @PostMapping("/upload")
    public ResponseEntity<?> uploadIdCard(
            @RequestParam("frontFile") MultipartFile frontFile,
            @RequestParam("backFile") MultipartFile backFile) {
        System.out.println(frontFile);
        System.out.println(backFile);
        try {
            // 识别正面信息
            Map<String, String> frontInfo = ocrService.recognizeIdCard(frontFile, true);
            System.out.println("Front Info: " + frontInfo);
            // 识别反面信息
            Map<String, String> backInfo = ocrService.recognizeIdCard(backFile, false);
            System.out.println("Back Info: " + backInfo);
            // 合并结果
            Map<String, String> combined = new HashMap<String, String>();
            combined.putAll(frontInfo);
            combined.putAll(backInfo);
            // 身份证校验(示例)
            String idNumberJson = combined.get("身份证号");
            //解析获取身份证号
            com.alibaba.fastjson.JSONObject jsonObject = JSON.parseObject(idNumberJson);
            String idNumber = jsonObject.getString("words");
            if (!validateIdCard(idNumber)) {
                return ResponseEntity.badRequest().body("身份证号校验失败");
            }
            return ResponseEntity.ok(combined);
        } catch (Exception e) {
            e.printStackTrace();
            return ResponseEntity.status(500).body("识别失败: " + e.getMessage());
        }
    }
    /**
     * 简单身份证号校验(正则表达式)
     * 
     * @param idNumber 身份证号码字符串
     * @return 校验通过返回true,否则返回false
     */
    private boolean validateIdCard(String idNumber) {
        String regex = "^[1-9]\\d{5}(19|20)\\d{2}(0[1-9]|1[0-2])(0[1-9]|[12]\\d|3[01])\\d{3}[\\dXx]$";
        return idNumber != null && idNumber.matches(regex);
    }
}

三、前端写个测试页面

这边的action路径要改成自己的路径

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="http://localhost:8086/api/idcard/upload" method="post" enctype="multipart/form-data">
    <input type="file" name="frontFile" accept="image/*" required>
    <input type="file" name="backFile" accept="image/*" required>
    <button type="submit">上传并识别</button>
</form>
</body>
</html>

第一张为身份证正面(人)

第二张上传为身份证反面(国徽那面)

测试成功在页面和控制台都可以看见自己提取出来的信息就成功啦!

四、二要素校验

身份证上传也不能保证信息准确,毕竟还可以进行p图技术进行修改嘛

为了保证信息的正确,就得要引入二要素校验==》对姓名和身份证号码进行校验

(1)配置

https://www.apispace.com/explore/service

打开网址

首次购买有20次的免费使用!!! ,购买完如下~

往下滑可以看见主要的代码

(2)代码实现

/**
     * 二要素校验
     * @param idNumber 身份证
     * @param realname 姓名
     * @return true则为一致,匹配正确
     * @throws IOException
     */
    private boolean validateIdCardAndName(String idNumber, String realname) throws IOException {
        // 示例:判断身份证号和姓名是否匹配
        OkHttpClient client = new OkHttpClient();
        //校验身份和姓名是否匹配 ==》二要素校验
        RequestBody body = RequestBody.create(okhttp3.MediaType.get("application/x-www-form-urlencoded"),
                "realname=" + realname + "&idcard=" + idNumber
        );
        //下面的addHeader和url都可以在上面购买完可以看见信息
        Request request = new Request.Builder()
                .url("换成自己的!!!!!!!!!!")
                .method("POST", body)
                .addHeader("X-APISpace-Token", "换成自己的!!!!!!!!!!")
                .build(); // 移除重复的 Content-Type 头
        Response response = client.newCall(request).execute();
        //System.out.println(response.body().string());
        //打印出来的{"requestId":"f20067dac6633685bd348f9e388b","data":{"valid":false,"incorrect":101,"message":"不一致"},"code":0,"message":"success"}
        if (response.code() != 200) {
            return false;
        }
        if (response.body() == null) {
            return false;
        }
        try {
            JSONObject responseJson = JSON.parseObject(response.body().string());
            if (responseJson.containsKey("data") && responseJson.getJSONObject("data").containsKey("message")) {
                JSONObject dataJson = responseJson.getJSONObject("data");
                String dataMessage = dataJson.getString("message");
                return "一致".equals(dataMessage);
            } else {
                System.out.println("响应缺少必要字段");
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

// 获取姓名
            String nameInfo = combined.get("姓名");
            JSONObject nameJson = JSON.parseObject(nameInfo);
            String realname = nameJson.getString("words");
            //校验姓名和身份证是否匹配
            boolean validateIdCardAndName = validateIdCardAndName(idNumber, realname);
            if (!validateIdCardAndName){
                //说明当前身份证于当前姓名不匹配
                return ResponseEntity.badRequest().body("姓名和身份不匹配,请检查填写信息是否正确");
            }

到此这篇关于springboot实现调用百度ocr实现身份识别+二要素校验的文章就介绍到这了,更多相关springboot身份识别+二要素校验内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java的ConcurrentHashMap中不能存储null的原因解析

    Java的ConcurrentHashMap中不能存储null的原因解析

    众所周知,在Java中Map可以存储null,而ConcurrentHashMap不能存储null值,那么为什么呢?今天通过源码分析给大家详细解读,感兴趣的朋友一起看看吧
    2022-07-07
  • Mac开源开发环境搭建指南之一次配好Git、JDK、Maven、Docker

    Mac开源开发环境搭建指南之一次配好Git、JDK、Maven、Docker

    mac开发环境配置的核心在于构建高效、隔离且可复用的工程化体系,而非单纯安装软件,这篇文章主要介绍了Mac开源开发环境搭建指南之一次配好Git、JDK、Maven、Docker的相关资料,需要的朋友可以参考下
    2026-05-05
  • SpringBoot集成Swagger2生成接口文档的方法示例

    SpringBoot集成Swagger2生成接口文档的方法示例

    我们提供Restful接口的时候,API文档是尤为的重要,它承载着对接口的定义,描述等,本文主要介绍了SpringBoot集成Swagger2生成接口文档的方法示例,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • Spring Boot全局异常处理实战指南

    Spring Boot全局异常处理实战指南

    在开发过程中,异常是不可避免的,Spring Boot提供了一种简单而强大的机制来处理应用程序中的异常,即全局异常处理,这篇文章主要介绍了Spring Boot全局异常处理的相关资料,需要的朋友可以参考下
    2025-09-09
  • Java 内部类的定义与范例

    Java 内部类的定义与范例

    说起内部类这个词,想必很多人都不陌生,但是又会觉得不熟悉。原因是平时编写代码时可能用到的场景不多,用得最多的是在有事件监听的情况下,并且即使用到也很少去总结内部类的用法。今天我们就来一探究竟
    2021-11-11
  • 基于SpringBoot+Vue实现DeepSeek对话效果的详细步骤

    基于SpringBoot+Vue实现DeepSeek对话效果的详细步骤

    本文详细介绍了使用SpringBoot和Vue构建对话系统,包含API设计、聊天界面开发、前后端集成及WebSocket优化,实现类似DeepSeek的交互效果,需要的朋友可以参考下
    2025-07-07
  • Spring-DI依赖注入全过程

    Spring-DI依赖注入全过程

    Spring DI是核心特性,通过容器管理依赖注入,降低耦合度,实现方式包括组件扫描、构造器/设值/字段注入、自动装配及作用域配置,支持灵活的依赖管理与生命周期控制,提升代码可维护性与可测试性
    2025-08-08
  • java解析xml汇总_动力节点Java学院整理

    java解析xml汇总_动力节点Java学院整理

    这篇文章主要介绍了java解析xml汇总_动力节点Java学院整理的相关资料,需要的朋友可以参考下
    2017-07-07
  • spring boot常见get 、post请求参数处理、参数注解校验、参数自定义注解校验问题解析

    spring boot常见get 、post请求参数处理、参数注解校验、参数自定义注解校验问题解析

    这篇文章主要介绍了spring boot常见get 、post请求参数处理、参数注解校验、参数自定义注解校验,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • SpringBoot3应用中集成和使用Spring Retry的实践记录

    SpringBoot3应用中集成和使用Spring Retry的实践记录

    SpringRetry为SpringBoot3提供重试机制,支持注解和编程式两种方式,可配置重试策略与监听器,适用于临时性故障场景,需合理设置次数、退避策略并做好监控,本文给大家详细介绍如何在 SpringBoot 3 应用中集成和使用 Spring Retry,感兴趣的朋友一起看看吧
    2025-06-06

最新评论