调用阿里云身份证识别服务识别本地图片

  • 一、先购买阿里云的身份证识别服务,拿到对应的AccessKey ID 和 AccessKey Secret
  • 二、在项目中添加阿里云的相关依赖,找到对应的工具类,这里用的是新版依赖
    • 1、引入阿里云图片识别的依赖
    • 2、查询引入依赖,看是否导入成功
    • 3、这是我找工具类的过程,可以跳过
      • (1)、识别身份证的类
      • (2)、调用服务的类
      • (3)、调用服务的类需要的Config实例,也是前面提到的没有看到的Config类
      • (4)、Config实例传参
  • 三、示例代码
  • 四、工具类
    • 1、身份证识别服务的请求参数
    • 2、身份证正面识别的接收dto
    • 3、身份证反面识别的接收dto
    • 4、身份证正反面枚举类
    • 5、身份证识别工具类

一、先购买阿里云的身份证识别服务,拿到对应的AccessKey ID 和 AccessKey Secret

二、在项目中添加阿里云的相关依赖,找到对应的工具类,这里用的是新版依赖

1、引入阿里云图片识别的依赖

<dependency><groupId>com.aliyun</groupId><artifactId>ocr20191230</artifactId><version>${aliyun.ocr.version}</version>
</dependency>

这是对应的依赖版本号查询地址,新版和旧版的依赖都可以在这里查

https://mvnrepository.com/artifact/com.aliyun/aliyun-java-sdk-ocr

接入步骤中的依赖我只添加了这个,json处理的依赖包项目本身就有,看自己情况,没有缺少对应的依赖就不需要添加了。

这是阿里云的示例地址

https://help.aliyun.com/document_detail/153132.htm?spm=a2c4g.11186623.0.0.65296d04gaIiFP#task-2406409

2、查询引入依赖,看是否导入成功

但是在调用过程发现引入依赖后与示例有点不一样!!!
我并没有看到com.aliyun:ocr:0.0.3这个依赖,以为是版本的问题,但看了一下也没有0.0.3这个版本

这是阿里云示例地址中的截图

这是我引入的阿里云依赖后,找到最像示例中的依赖包

RecognizeBankCardAdvanceRequest和RecognizeBankCardRequest这两个类倒是有,可是我的models包下面没有Config这个类,当时就想,示例代码中是需要这个类的,就算是高版本的jar包也不应该删了啊,保留疑问继续往下走。

既然和示例中的jar包有些出入,就先看看识别身份证的相关类吧,阿里云示例中提到

对于同一个接口,如果 SDK 中包含类似 xxxAdvanceRequest 的结构,那么这个接口支持本地文件上传,否则不支持。

示例截图中框的是识别银行卡的,我需要的是识别身份证的,那就找相关的工具类吧。

3、这是我找工具类的过程,可以跳过

(1)、识别身份证的类

识别身份证的是RecognizeIdentityCardAdvanceRequest和RecognizeIdentityCardRequest,其中RecognizeIdentityCardAdvanceRequest支持本地上传,那么就用这个。

识别本地图片的话,就将本地图片的输入流赋值给RecognizeIdentityCardAdvanceRequest实例的imageURLObject属性,示例代码中也有提到。

(2)、调用服务的类

调用身份证识别的服务需要Client这个类,通过在Client实例的recognizeIdentityCardAdvance方法中传入RecognizeIdentityCardAdvanceRequest实例进行图片识别,阿里云示例中没有明说Client这个是那个包中,引入的依赖和示例截图中(不同依赖)都有这个类,当时就想着先使用已经引入的依赖中的Client类,不行再换。

(3)、调用服务的类需要的Config实例,也是前面提到的没有看到的Config类

在实例化Client这个类中需要传入Config类的示例,因为modules中没有Config,进入Client源码,发现使用的是com.aliyun.teaopenapi.models这个包下的Config,行,那就用这个吧。

(4)、Config实例传参

一开始还不知道Config实例如何传参,后面看到阿里云身份证识别产品体验的示例代码(示例代码是旧版依赖的调用方式)中传了regionId、AccessKey ID 和 AccessKey Secret,加上Config确实有对应的变量,那就传这三个参数试试吧。

这是阿里云产品体验中心的代码:

三、示例代码

Config实例中的regionId沿用示例代码中的cn-shanghai。

运行测试一下

识别成功!

完整代码如下:

import com.aliyun.ocr20191230.Client;
import com.aliyun.ocr20191230.models.RecognizeIdentityCardAdvanceRequest;
import com.aliyun.ocr20191230.models.RecognizeIdentityCardResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.google.gson.Gson;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;/*** TODO** @author:user* @date: 2022-08-08 14:21*/
public class IdCardIdentifyUtil {public static void main(String[] args) throws Exception {Config config = new Config();config.setAccessKeyId("你的accessKeyId");config.setAccessKeySecret("你的accessKeySecret");config.setRegionId("cn-shanghai");Client client = new Client(config);InputStream inputStream = new FileInputStream(new File("D:\\opt\\jeecg-boot\\upload\\temp\\upload_1644998658029.jpg"));//这是上传本地图片的RecognizeIdentityCardAdvanceRequest request = new RecognizeIdentityCardAdvanceRequest();request.setSide("face");request.imageURLObject = inputStream;//识别本地图片才要上传,但只是new一个实例进行传参,也没做什么RuntimeOptions runtimeOptions = new RuntimeOptions();RecognizeIdentityCardResponse response = null;try {response = client.recognizeIdentityCardAdvance(request, runtimeOptions);} catch (ServerException e) {e.printStackTrace();throw new RuntimeException(e.getMessage());} catch (ClientException e) {System.out.println("ErrCode:" + e.getErrCode());System.out.println("ErrMsg:" + e.getErrMsg());System.out.println("RequestId:" + e.getRequestId());throw new RuntimeException("ErrCode:" + e.getErrCode() + ",ErrMsg:" + e.getErrMsg());}System.out.println("response::" + new Gson().toJson(response));}}

四、工具类

这是我改造后的工具类,个人觉得比较适合在项目中使用。

1、身份证识别服务的请求参数

import lombok.Data;/*** 身份证识别接口的参数** @author:user* @date: 2022-08-08 15:28*/
@Data
public class IdCardRequestParam {//阿里云accessKeyIdprivate String accessKeyId;//阿里云accessSecretprivate String accessSecret;//阿里云识别身份证的regionId,设置请求参数的方法有横线,似乎废弃了private String regionId;//身份证正反面private String side;//上传图片路径private String imageURL;
}

2、身份证正面识别的接收dto

import lombok.Data;/*** 身份证正面dto** @author:user* @date: 2022-08-08 14:59*/
@Data
public class IdCardFrontDto {//地址private String Address;//出生日期private String BirthDate;//性别private String Gender;//身份证号码private String IDNumber;//姓名private String Name;//民族private String Nationality;//身份证位置,目前没有用到private String CardAreas;
}

3、身份证反面识别的接收dto

import lombok.Data;/*** 身份证反面dto** @author:user* @date: 2022-08-08 15:09*/
@Data
public class IdCardBackDto {//开始日期private String StartDate;//结束日期private String EndDate;//发证机关private String Issue;
}

4、身份证正反面枚举类

/*** 身份证正反面枚举类** @author:user* @date: 2022-08-08 16:09*/
public enum IdCardSideEnum {FACE("face", "人像面"),BACK("back", "国徽面");private String code;private String desc;IdCardSideEnum(String code, String desc) {this.code = code;this.desc = desc;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}public static String getDesc(String code) {for (IdCardSideEnum value : IdCardSideEnum.values()) {if (value.code.equals(code))return value.desc;}throw new RuntimeException("未知状态:" + code);}public String getDesc() {return desc;}public void setDesc(String desc) {this.desc = desc;}
}

5、身份证识别工具类

import com.alibaba.fastjson.JSONObject;
import com.aliyun.ocr20191230.Client;
import com.aliyun.ocr20191230.models.RecognizeIdentityCardAdvanceRequest;
import com.aliyun.ocr20191230.models.RecognizeIdentityCardResponse;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.google.gson.Gson;import org.jeecg.common.util.VerifyUtil;
import org.jeecg.modules.aliyun.enums.IdCardSideEnum;
import org.jeecg.modules.aliyun.dto.IdCardBackDto;
import org.jeecg.modules.aliyun.dto.IdCardFrontDto;
import org.jeecg.modules.aliyun.dto.IdCardRequestParam;import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;/*** TODO** @author:user* @date: 2022-08-08 14:21*/
public class IdCardIdentifyUtil {/*** 识别身份证,泛型方法* @param param 识别身份证需要的参数* @param c 识别身份证正面传IdCardFrontDto.class;识别身份证反面传IdCardBackDto.class* @param <T>* @return*/public static <T> T getIdCardInfo(IdCardRequestParam param, Class<T> c) throws Exception {VerifyUtil.checkBean(param); //这是之前写的一个校验方法,可以用自己的方式校验空值,之前的博客中也有该方法的代码//校验传入身份证正反面码是否合法String side = param.getSide();IdCardSideEnum.getDesc(side);if (IdCardSideEnum.FACE.getCode().equals(side) && !IdCardFrontDto.class.equals(c))throw new RuntimeException("识别身份证正面,应传入【IdCardFrontDto.class】");if (IdCardSideEnum.BACK.getCode().equals(side) && !IdCardBackDto.class.equals(c))throw new RuntimeException("识别身份证反面,应传入【IdCardBackDto.class】");String regionId = param.getRegionId();//这是阿里云身份证识别案例代码中拿过来的Config config = new Config();config.setAccessKeyId(param.getAccessKeyId());config.setAccessKeySecret(param.getAccessSecret());config.setRegionId(regionId);Client client = new Client(config);//这是识别网络路径的,需要开通oss服务
//        RecognizeIdentityCardRequest request = new RecognizeIdentityCardRequest();
        request.setRegionId(param.getRegionId());
//        request.setSide(side);
//        request.setImageURL(param.getImageURL());InputStream inputStream = new FileInputStream(new File(param.getImageURL()));//这是上传本地图片的RecognizeIdentityCardAdvanceRequest request = new RecognizeIdentityCardAdvanceRequest();request.setSide(side);request.imageURLObject = inputStream;//识别本地图片才要上传,但只是new一个实例进行传参,也没做什么RuntimeOptions runtimeOptions = new RuntimeOptions();RecognizeIdentityCardResponse response = null;try {response = client.recognizeIdentityCardAdvance(request, runtimeOptions);} catch (ServerException e) {e.printStackTrace();throw new RuntimeException(e.getMessage());} catch (ClientException e) {System.out.println("ErrCode:" + e.getErrCode());System.out.println("ErrMsg:" + e.getErrMsg());System.out.println("RequestId:" + e.getRequestId());throw new RuntimeException("ErrCode:" + e.getErrCode() + ",ErrMsg:" + e.getErrMsg());}System.out.println("response::" + response);//将返回的json转化成JSONObjectJSONObject responseJsonObject = JSONObject.parseObject(new Gson().toJson(response));//返回结果中嵌套了data,不能写错,data就是身份证的信息,//身份证正反面的返回键不一样,需要单独处理JSONObject idCardJsonObject = responseJsonObject.getJSONObject("body").getJSONObject("data");String idCardDataStr = null;if (IdCardSideEnum.FACE.getCode().equals(side)) {idCardDataStr = idCardJsonObject.getString("frontResult");} else if (IdCardSideEnum.BACK.getCode().equals(side)) {idCardDataStr = idCardJsonObject.getString("backResult");}return JSONObject.parseObject(idCardDataStr, c);}}

调用阿里云身份证识别服务识别本地图片,很详细,附工具类相关推荐

  1. 阿里云搭建frp服务实现本地内网穿透

    如果使用我的链接购买阿里云服务器,我将免费提供帮忙搭建阿里云的frp服务. 背景 利用阿里云搭建frp服务,本地frp客户端来实现内网穿透,来达到访问没有公网ip的远程机器 frp服务端搭建 首先我们 ...

  2. 调用阿里云身份证识别OCR

    这个是需要收费的第三方身份证识别OCR的接口 这个是官方给出的案例和文档 https://market.aliyun.com/products/57124001/cmapi028587.htmlspm ...

  3. 关于调用阿里云短信服务接口实现短信验证码的过程

    为了实现给手机发送短信来进行验证码验证,所以需要调用此接口来进行测试 登陆阿里云 首先需要有阿里云的账号,进行注册申请,进去控制台,然后找到短信服务 创建签名和模板 选中国内消息,然后看到右边有签名管 ...

  4. 怎么样可以调用阿里云短信服务接口实现短信验证码

    为了实现给手机发送短信来进行验证码验证,所以需要调用此接口来进行测试 登陆阿里云 首先需要有阿里云的账号,进行注册申请,进去控制台,然后找到短信服务 创建签名和模板 选中国内消息,然后看到右边有签名管 ...

  5. 调用阿里云短信服务接口实现短信验证码

    为了实现给手机发送短信来进行验证码验证,所以需要调用此接口来进行测试 登陆阿里云 首先需要有阿里云的账号,进行注册申请,进去控制台,然后找到短信服务 创建签名和模板 选中国内消息,然后看到右边有签名管 ...

  6. SpringBoot集成阿里云短信服务实现登录注册(超详细)

    本篇博客采用得技术为:springboot + redis + aliyun短信验证 redis我用来做短信校验,首先我们先刨除redis部分做一个发送功能 登录你得阿里云账号 1 -> 控制台 ...

  7. 对于阿里云的oss上传本地图片的相关注意点

    #先在阿里云购买储存空间 我的结果如下: 然后下载相关的SDK,下面是C++相关SDK包: https://help.aliyun.com/document_detail/106216.html?sp ...

  8. 阿里云域名注册流程(图文教程很详细)

    阿里云域名注册流程很简单,先注册阿里云账号,账号必须通过实名认证:然后创建信息模版,个人或企业信息模板必须通过实名认证:然后想好域名名称和域名后缀:最后在阿里云域名注册官网进行新域名的注册.阿里云百科 ...

  9. 小程序调用阿里云身份证识别OCR(附带七牛云上传图片)

    写在前面: 实现的逻辑是拍照上传调用后端封装好的身份证接口,然后同时调用七牛云接口把照片传过去以便后台管理系统审核看 1:首选需要这么一张页面 接下来就写我是怎么做的 首先是布局(以下是wxml) & ...

  10. C/C++开发,阿里云短信服务接口的c++实现

    目录 一.阿里云短信服务接口 二.逻辑代码实现 三.编译测试效果 一.阿里云短信服务接口 最近在调用阿里云短信服务接口发现并没有c++的资料,网上查询发现也是零星描述,由于自身项目基础累积了C++的太 ...

最新文章

  1. php要求掌握链表结构吗,PHP 链表结构之单链表(一)
  2. 汇博工业机器人码垛机怎么写_一文带您理解码垛机器人,原来它这么简单!
  3. Firefox Portable Developer 52.0.0.6176-6178
  4. PC处理器装机中的认识 三
  5. MFC里的GDI CDC HDC到底是什么?
  6. openstack Q版部署-----安装报错问题
  7. 一些python函数及其用法
  8. 现代中国第一位数学博士是谁?
  9. 监督学习 | SVM 之线性支持向量机原理
  10. Linux防火墙端口设置和mysql端口开放的navicat整合
  11. C#自定义数字格式字符串
  12. c++11多线程学习笔记之一 thread基础使用
  13. 小型工厂企业网站究竟该怎么做好SEO优化,从而带来更多订单?
  14. BGP 模式下 Calico 与 MetalLB 的组合
  15. 电脑文件删除不掉什么原因?程序显示被占用清理不掉如何操作?
  16. 微软Windows 11官方超高清4K壁纸提前放出,免费下载
  17. AMiner推荐论文:Flexible artificial Si-In-Zn-O/ion gel synapse and its application to sensory-neuromorphi
  18. IaaS开源软件之zstack(OSC中国开源项目的TOP30)
  19. 计算机毕业设计Java的健身房管理系统(源码+系统+mysql数据库+lw文档)
  20. 告白或写给对象的网页。

热门文章

  1. 生信:1:vcf格式文件解读
  2. Android性能优化之页面优化
  3. 全球与中国绿色多元醇市场现状及未来发展趋势
  4. 如何利用python制作一个小游戏
  5. 点击给导航条加背景颜色
  6. Django (十一) 项目部署 2
  7. 开源虚拟机工具_使用开源工具与虚拟乐高玩
  8. 今天是第几天python_“昔我往矣,杨柳依依。今我来思,雨雪霏霏”全诗赏析
  9. 软件测试的类型有哪些?
  10. win10 vs2008到期的解决办法: