调用阿里云身份证识别服务识别本舆图片,很具体,附工具类 ...

种地  金牌会员 | 2024-6-14 21:43:08 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 710|帖子 710|积分 2130

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

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


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

  1. <dependency>
  2.     <groupId>com.aliyun</groupId>
  3.     <artifactId>ocr20191230</artifactId>
  4.     <version>${aliyun.ocr.version}</version>
  5. </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.aliyuncr: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。
  运行测试一下

识别成功!
完整代码如下:
  1. import com.aliyun.ocr20191230.Client;
  2. import com.aliyun.ocr20191230.models.RecognizeIdentityCardAdvanceRequest;
  3. import com.aliyun.ocr20191230.models.RecognizeIdentityCardResponse;
  4. import com.aliyun.teaopenapi.models.Config;
  5. import com.aliyun.teautil.models.RuntimeOptions;
  6. import com.aliyuncs.exceptions.ClientException;
  7. import com.aliyuncs.exceptions.ServerException;
  8. import com.google.gson.Gson;
  9. import java.io.File;
  10. import java.io.FileInputStream;
  11. import java.io.InputStream;
  12. /**
  13. * TODO
  14. *
  15. * @author:user
  16. * @date: 2022-08-08 14:21
  17. */
  18. public class IdCardIdentifyUtil {
  19.     public static void main(String[] args) throws Exception {
  20.         Config config = new Config();
  21.         config.setAccessKeyId("你的accessKeyId");
  22.         config.setAccessKeySecret("你的accessKeySecret");
  23.         config.setRegionId("cn-shanghai");
  24.         Client client = new Client(config);
  25.         InputStream inputStream = new FileInputStream(new File("D:\\opt\\jeecg-boot\\upload\\temp\\upload_1644998658029.jpg"));
  26.         //这是上传本地图片的
  27.         RecognizeIdentityCardAdvanceRequest request = new RecognizeIdentityCardAdvanceRequest();
  28.         request.setSide("face");
  29.         request.imageURLObject = inputStream;
  30.         //识别本地图片才要上传,但只是new一个实例进行传参,也没做什么
  31.         RuntimeOptions runtimeOptions = new RuntimeOptions();
  32.         RecognizeIdentityCardResponse response = null;
  33.         try {
  34.             response = client.recognizeIdentityCardAdvance(request, runtimeOptions);
  35.         } catch (ServerException e) {
  36.             e.printStackTrace();
  37.             throw new RuntimeException(e.getMessage());
  38.         } catch (ClientException e) {
  39.             System.out.println("ErrCode:" + e.getErrCode());
  40.             System.out.println("ErrMsg:" + e.getErrMsg());
  41.             System.out.println("RequestId:" + e.getRequestId());
  42.             throw new RuntimeException("ErrCode:" + e.getErrCode() + ",ErrMsg:" + e.getErrMsg());
  43.         }
  44.         System.out.println("response::" + new Gson().toJson(response));
  45.     }
  46. }
复制代码
四、工具类

这是我改造后的工具类,个人以为比较适合在项目中使用。
1、身份证识别服务的请求参数

  1. import lombok.Data;
  2. /**
  3. * 身份证识别接口的参数
  4. *
  5. * @author:user
  6. * @date: 2022-08-08 15:28
  7. */
  8. @Data
  9. public class IdCardRequestParam {
  10.     //阿里云accessKeyId
  11.     private String accessKeyId;
  12.     //阿里云accessSecret
  13.     private String accessSecret;
  14.     //阿里云识别身份证的regionId,设置请求参数的方法有横线,似乎废弃了
  15.     private String regionId;
  16.     //身份证正反面
  17.     private String side;
  18.     //上传图片路径
  19.     private String imageURL;
  20. }
复制代码
2、身份证正面识别的吸收dto

  1. import lombok.Data;
  2. /**
  3. * 身份证正面dto
  4. *
  5. * @author:user
  6. * @date: 2022-08-08 14:59
  7. */
  8. @Data
  9. public class IdCardFrontDto {
  10.     //地址
  11.     private String Address;
  12.     //出生日期
  13.     private String BirthDate;
  14.     //性别
  15.     private String Gender;
  16.     //身份证号码
  17.     private String IDNumber;
  18.     //姓名
  19.     private String Name;
  20.     //民族
  21.     private String Nationality;
  22.     //身份证位置,目前没有用到
  23.     private String CardAreas;
  24. }
复制代码
3、身份证反面识别的吸收dto

  1. import lombok.Data;
  2. /**
  3. * 身份证反面dto
  4. *
  5. * @author:user
  6. * @date: 2022-08-08 15:09
  7. */
  8. @Data
  9. public class IdCardBackDto {
  10.     //开始日期
  11.     private String StartDate;
  12.     //结束日期
  13.     private String EndDate;
  14.     //发证机关
  15.     private String Issue;
  16. }
复制代码
4、身份证正反面枚举类

  1. /**
  2. * 身份证正反面枚举类
  3. *
  4. * @author:user
  5. * @date: 2022-08-08 16:09
  6. */
  7. public enum IdCardSideEnum {
  8.     FACE("face", "人像面"),
  9.     BACK("back", "国徽面");
  10.     private String code;
  11.     private String desc;
  12.     IdCardSideEnum(String code, String desc) {
  13.         this.code = code;
  14.         this.desc = desc;
  15.     }
  16.     public String getCode() {
  17.         return code;
  18.     }
  19.     public void setCode(String code) {
  20.         this.code = code;
  21.     }
  22.     public static String getDesc(String code) {
  23.         for (IdCardSideEnum value : IdCardSideEnum.values()) {
  24.             if (value.code.equals(code))
  25.                 return value.desc;
  26.         }
  27.         throw new RuntimeException("未知状态:" + code);
  28.     }
  29.     public String getDesc() {
  30.         return desc;
  31.     }
  32.     public void setDesc(String desc) {
  33.         this.desc = desc;
  34.     }
  35. }
复制代码
5、身份证识别工具类

  1. import com.alibaba.fastjson.JSONObject;
  2. import com.aliyun.ocr20191230.Client;
  3. import com.aliyun.ocr20191230.models.RecognizeIdentityCardAdvanceRequest;
  4. import com.aliyun.ocr20191230.models.RecognizeIdentityCardResponse;
  5. import com.aliyun.teaopenapi.models.Config;
  6. import com.aliyun.teautil.models.RuntimeOptions;
  7. import com.aliyuncs.exceptions.ClientException;
  8. import com.aliyuncs.exceptions.ServerException;
  9. import com.google.gson.Gson;
  10. import org.jeecg.common.util.VerifyUtil;
  11. import org.jeecg.modules.aliyun.enums.IdCardSideEnum;
  12. import org.jeecg.modules.aliyun.dto.IdCardBackDto;
  13. import org.jeecg.modules.aliyun.dto.IdCardFrontDto;
  14. import org.jeecg.modules.aliyun.dto.IdCardRequestParam;
  15. import java.io.File;
  16. import java.io.FileInputStream;
  17. import java.io.InputStream;
  18. /**
  19. * TODO
  20. *
  21. * @author:user
  22. * @date: 2022-08-08 14:21
  23. */
  24. public class IdCardIdentifyUtil {
  25.     /**
  26.      * 识别身份证,泛型方法
  27.      * @param param 识别身份证需要的参数
  28.      * @param c 识别身份证正面传IdCardFrontDto.class;识别身份证反面传IdCardBackDto.class
  29.      * @param <T>
  30.      * @return
  31.      */
  32.     public static <T> T getIdCardInfo(IdCardRequestParam param, Class<T> c) throws Exception {
  33.         VerifyUtil.checkBean(param); //这是之前写的一个校验方法,可以用自己的方式校验空值,之前的博客中也有该方法的代码
  34.         //校验传入身份证正反面码是否合法
  35.         String side = param.getSide();
  36.         IdCardSideEnum.getDesc(side);
  37.         if (IdCardSideEnum.FACE.getCode().equals(side) && !IdCardFrontDto.class.equals(c))
  38.             throw new RuntimeException("识别身份证正面,应传入【IdCardFrontDto.class】");
  39.         if (IdCardSideEnum.BACK.getCode().equals(side) && !IdCardBackDto.class.equals(c))
  40.             throw new RuntimeException("识别身份证反面,应传入【IdCardBackDto.class】");
  41.         String regionId = param.getRegionId();
  42.         //这是阿里云身份证识别案例代码中拿过来的
  43.         Config config = new Config();
  44.         config.setAccessKeyId(param.getAccessKeyId());
  45.         config.setAccessKeySecret(param.getAccessSecret());
  46.         config.setRegionId(regionId);
  47.         Client client = new Client(config);
  48.         //这是识别网络路径的,需要开通oss服务
  49. //        RecognizeIdentityCardRequest request = new RecognizeIdentityCardRequest();
  50.         request.setRegionId(param.getRegionId());
  51. //        request.setSide(side);
  52. //        request.setImageURL(param.getImageURL());
  53.         InputStream inputStream = new FileInputStream(new File(param.getImageURL()));
  54.         //这是上传本地图片的
  55.         RecognizeIdentityCardAdvanceRequest request = new RecognizeIdentityCardAdvanceRequest();
  56.         request.setSide(side);
  57.         request.imageURLObject = inputStream;
  58.         //识别本地图片才要上传,但只是new一个实例进行传参,也没做什么
  59.         RuntimeOptions runtimeOptions = new RuntimeOptions();
  60.         RecognizeIdentityCardResponse response = null;
  61.         try {
  62.             response = client.recognizeIdentityCardAdvance(request, runtimeOptions);
  63.         } catch (ServerException e) {
  64.             e.printStackTrace();
  65.             throw new RuntimeException(e.getMessage());
  66.         } catch (ClientException e) {
  67.             System.out.println("ErrCode:" + e.getErrCode());
  68.             System.out.println("ErrMsg:" + e.getErrMsg());
  69.             System.out.println("RequestId:" + e.getRequestId());
  70.             throw new RuntimeException("ErrCode:" + e.getErrCode() + ",ErrMsg:" + e.getErrMsg());
  71.         }
  72.         System.out.println("response::" + response);
  73.         //将返回的json转化成JSONObject
  74.         JSONObject responseJsonObject = JSONObject.parseObject(new Gson().toJson(response));
  75.         //返回结果中嵌套了data,不能写错,data就是身份证的信息,
  76.         //身份证正反面的返回键不一样,需要单独处理
  77.         JSONObject idCardJsonObject = responseJsonObject.getJSONObject("body").getJSONObject("data");
  78.         String idCardDataStr = null;
  79.         if (IdCardSideEnum.FACE.getCode().equals(side)) {
  80.             idCardDataStr = idCardJsonObject.getString("frontResult");
  81.         } else if (IdCardSideEnum.BACK.getCode().equals(side)) {
  82.             idCardDataStr = idCardJsonObject.getString("backResult");
  83.         }
  84.         return JSONObject.parseObject(idCardDataStr, c);
  85.     }
  86. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

种地

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表