项目中需要使用到身份证识别,所以经过调研后决定从阿里云上购买,在经过我的两天研究和客服对接,我基本把坑全踩完了,所以在此总结一套整体的流程
首先,在我买过之后才发现,阿里云的官网上面有两套ocr,第一套是读光的OCR,第二套是视觉智能的OCR,但是他们的官网并没有描述,我是在买完之后扣费时发现不对的,问了三个客服才能给我解答,其他客服也说不清楚,很坑
(1):读光的OCR:读光的OCR是我在调通视觉智能的OCR之后才知道我第一次买的是读光下面的,但是我因为已经用了视觉智能的,所以我就没有再用了,我在此就把读光的OCR的购买 方式和开发文档放在这,有需要的自己去集成:
然后在这个页面内购买预付包
他的开发调用链接是:RecognizeIdcard - 文字识别(OCR) - 阿里云
需要的朋友可以自己去集成一下,我主要说一下第二种方式,通过视觉智能的OCR集成的方式,看起来也比读光简单一些
(2):视觉智能的OCR
视觉智能的OCR购买方式不是从上面的方式进去购买的,目前我找的时候是从他给的开发文档内去购买的:身份证识别 - 阿里云视觉智能开放平台 - 阿里云
点击立即开通,如果你开通了,他会弹出框提示,如果没有开通的话,你就直接选择上海然后开通就行,我这边已经开通了
然后控制台内点击下面的能力购买,或者下面服务列表后面的购买,随便一个就行
然后进入之后就是付费页面,这个付费是以点数来抵扣的,抵扣规则就是下面的付费能力抵扣系数,你购买的点数是包含下面的所有识别的,所以随便从哪里点击购买都行,然后根据你的需求去购买,测试的话,第一次是一分钱,我这是第二次,所以贵
买完之后就会跟我刚刚的首页一样,会有一千点的抵扣点,然后我们再回到我们的开发文档:身份证识别 - 阿里云视觉智能开放平台 - 阿里云
看到这个api,他的参数ImageUrl必须是上海地域的OSS链接,所以,我们需要再次购买他的OSS服务,
点击链接之后跳转OSS教程:
因为我已经开通了,所以截图就放在这了,开通的选择规则请看:反正也是免费的,怎么便宜怎么来 创建存储空间 - 对象存储 OSS - 阿里云
然后我们还需要创建一个AccessKey,因为我们开的服务都需要通过AccessKey去创建
创建AccessKey是在随便你的哪个工作台都可以,在OCR的工作台或者OSS的工作台都行:
然后进去点击继续使用,创建就是一路点:
然后背景板就是我创建过后的,不想截图了,太累了,然后我们需要的AccessKey ID就是我打码的那个,然后AccessKeySecret就是后面那个查看Secret,需要通过验证码的方式,你刚开始创建的时候就记好,这样就不用再验证码了
现在我们都写好了,就差写代码了,我们如果用这个写的话,最好是后台去访问,然后通过接口的方式返回给我们移动端,后台起码安全一些,也简单一些,所以移动端的朋友们可以让你们的后台来学这个,如果用读光的话,我没有写,那个不知道能不能使用到android,所以有感兴趣的朋友也可以去研究一下读光的OCR
1.首先是依赖注入:
com.aliyun
ocr20191230
1.0.19
com.aliyun
viapi-utils
1.0.2
com.aliyun
aliyun-java-sdk-viapiutils
1.0.0
com.aliyun
aliyun-java-sdk-core
4.4.8
com.aliyun.oss
aliyun-sdk-oss
3.4.2
org.apache.commons
commons-lang3
3.9
2.就是写代码了,然后我这边是集成了三个,其他的都是一样的,我写了身份证、驾驶证、行驶证三个证件识别,有哪里不懂记得看注释,打印不出来记得看注释,不要复制进去就开跑:
import com.aliyun.com.viapi.FileUtils;
import com.aliyun.ocr20191230.Client;
import com.aliyun.ocr20191230.models.*;
import com.aliyun.tea.TeaException;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
import java.io.*;
/**
* @Author: 四块五毛六
* @Date: 2022/7/19 14:49
*/
public class SampleOCR {
public static void main(String[] args_) throws Exception {
Config config = new Config();
//你的accessKeyId
config.accessKeyId = "你的accessKeyId";
//你的accessKeySecret
config.accessKeySecret = "你的accessKeySecret";
config.type = "access_key";
config.regionId = "cn-shanghai";
// config.endpointType="internal"; //默认通过公网访问OSS,如需通过内网请打开这一行
Client client = new Client(config);
RuntimeOptions runtimeOptions = new RuntimeOptions();
FileUtils fileUtils = FileUtils.getInstance("你的accessKeyId", "你的accessKeySecret");
//这个是通过本地上传的方式,然后如果是移动端的话,他传过来的就应该是一个file文件,直接用file.getInputStream就行
InputStream in = new FileInputStream(new File("C:\\Users\\Chongchong\\Desktop\\23.jpg"));
//这个前面的fileName是生成后的ossUrl的后缀,其实有没有都无所谓,或者你自己取一个,如果加上.jpg等图片后缀,
//访问这个链接的时候就是下载一张本地图片,如果不加的话,下载的就是一个未识别的文件,如果改后缀可以变成图片
String ossUrl = fileUtils.upload("", in);
//url方式
//身份证
// recognizeIdCardAdvance(client, ossUrl);
//驾驶证
// recognizeDriverLicense(client, ossUrl);
//行驶证
recognizeDrivingLicense(client, ossUrl);
config.endpoint = "ocr.cn-shanghai.aliyuncs.com";
}
//行驶证(就写了这一个,因为其他的都跟这个一样,只有方法不一样)
private static void recognizeDrivingLicense(Client client, String ossUrl) {
//face是正面,back是背面,我们一般用正面就行,这个可以传过来的
RecognizeDrivingLicenseRequest request = new RecognizeDrivingLicenseRequest()
.setImageURL(ossUrl)
.setSide("face");
try {
// 复制代码运行请自行打印 API 的返回值
RecognizeDrivingLicenseResponse recognizeDrivingLicenseResponse = client.recognizeDrivingLicense(request);
//这个打印的就是recognizeDrivingLicenseResponse就是内容,最好用断点打,这是整个的内容,打印不出来东西的,
//需要你自己从中间解析,解析我就不写了,因为我也没有解析
System.out.println(recognizeDrivingLicenseResponse);
} catch (TeaException error) {
// 如有需要,请打印 error
com.aliyun.teautil.Common.assertAsString(error.message);
System.out.println(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 如有需要,请打印 error
com.aliyun.teautil.Common.assertAsString(error.message);
System.out.println(error.message);
}
}
//驾驶证
private static void recognizeDriverLicense(Client client, String ossUrl) {
RecognizeDriverLicenseRequest request = new RecognizeDriverLicenseRequest()
.setImageURL(ossUrl)
.setSide("face");
try {
// 复制代码运行请自行打印 API 的返回值
RecognizeDriverLicenseResponse recognizeDriverLicenseResponse = client.recognizeDriverLicense(request);
System.out.println(recognizeDriverLicenseResponse);
} catch (TeaException error) {
// 如有需要,请打印 error
com.aliyun.teautil.Common.assertAsString(error.message);
System.out.println(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 如有需要,请打印 error
com.aliyun.teautil.Common.assertAsString(error.message);
System.out.println(error.message);
}
}
//身份证
private static void recognizeIdCardAdvance(Client client, String ossUrl) throws Exception {
RecognizeIdentityCardRequest recognizeIdentityCardRequest = new RecognizeIdentityCardRequest()
.setImageURL(ossUrl)
.setSide("face");
RuntimeOptions runtime = new RuntimeOptions();
try {
// 复制代码运行请自行打印 API 的返回值
RecognizeIdentityCardResponse recognizeIdentityCardResponse = client.recognizeIdentityCardWithOptions(recognizeIdentityCardRequest, runtime);
System.out.println(recognizeIdentityCardResponse);
} catch (TeaException error) {
// 如有需要,请打印 error
com.aliyun.teautil.Common.assertAsString(error.message);
System.out.println(error.message);
} catch (Exception _error) {
TeaException error = new TeaException(_error.getMessage(), _error);
// 如有需要,请打印 error
com.aliyun.teautil.Common.assertAsString(error.message);
System.out.println(error.message);
}
}
}
然后接口就调试完了,如果要用到其他的服务,我这里面没写到的,可以自己去那个开发文档里面找方法名,我没有一个一个测,我感觉他们的调用就是把方法改了一下,其他的什么也没变,很方便。