实名登记在很多行业或者特殊场景都有很大的使用量,我们常见的银行业务办理、电信营业厅业务办理、酒店住宿、买车票、网吧、疫情期间的刷身份证检查核验等都在广泛使用。传统的方式我们都需要购买一个专用的“二代证读卡器”或者叫“身份证读卡器”的设备才能完成上述刷卡实名登记的过程。从国家二代身份证发布到现在已经有比较长的时间了,身份证实名登记的主要设备均来国内几个主要设备厂家,华视、神思、新中新、国腾、精伦等,相比较原来的复印、扫描OCR方式优势是读取数据更快,准确性是100%,不会存在身份证扫描不清晰影响读取准确性的问题,同时机读方式具备防伪特性可以保障读卡信息的可靠性。但缺点也很明显,首先读卡设备价格比较贵,一般价格在1300~1600一个,其次读卡设备目前都比较大需要配套电脑才能使用,针对需要外出登记移动工作的场景来说就不太方便了。
随着国内实名制的广泛应用,不难发现很多使用场景都需要便携移动的识别登记手段,显然原有的方式和技术对实名制的应用和推广会产生较大阻力,目前新的技术也在不断发展,智能安卓手机集成NFC近场通讯的越来越多,苹果手机NFC功能的开放也势不可挡,原有PC电脑外接读卡器方式或扫描仪、移动端拍照拍照OCR方式的实名采集方式将被更高效、更安全可靠的NFC直接读取方式所代替。
与二代身份证读卡器以及拍照OCR方式比,手机身份证识别及验证方式有以下几大优势:
(1)快速集成优势,应用开发单位或企业不用购买任何外部硬件设备,利用手机本身自带NFC功能,嵌入手机身份证识别识别库,并根据自身业务需要定制开发APP或者小程序等完成高集成度的实名采集登记系统,既能高效读取又能有效鉴真防伪,同时也方便移动办公业务人员直接下载到安卓或IOS手机及平板电脑上使用,完全做到纯软集成。
(2) 快速安全优势,手机身份证识别除了可识别二代身份证还可识别护照、港澳居住证、港澳通行证等其他有效身份证件。甚至可以同时开发兼容原有的IC卡、社保卡、储蓄卡、公交卡等方面的应用,用一台手机集成多种智能卡的功能。读卡速度是拍照扫描方式10倍以差距(一般都是秒级读取,不用正反拍照),而且刷卡方式有安全加密芯片作保障即能保障卡内信息的准确可靠,既能可靠辨别证件真伪(安全加解密),又能防止拍照方式造成的信息泄露。
(3) 巨大的成本优势,通过利用现成的手机等移动终端自带的NFC功能,不再需要购买价格高昂的身份证读卡器外设,也不用单独配置一台读卡电脑,大大节省实名登记系统所需要的投入费用。
(4) 移动便携优势,手机身份证证件识别可便携易于移动办公,手机就是一台读卡器又是一台在线便携的处理终端,原来读卡器方式不易移动携带的问题立刻得到解决。如能将二代证读卡和拍照、签字、人脸核验识别集成,将是各服务行业、电信、银行、保险、政府机构各营业厅柜台以及在线业务实名开户或办理业务的登记核验首选理想模式。
下面简单介绍下手机身份证识别技术的相关信息:
支持平台:Android4.0及以上、Linux、windows、IOS系统;
支持二次开发:提供Android开发JAR包,Linux、windows下的动态库, iOS平台.a静态库开发包;
识别核验模式:人证1:1核验模式,无证人脸核验模式;
支持证件种类:二代身份证、护照、港澳通行证、居住证
1. 接口概要
接口文件在com\readTwoGeneralCard\OTGReadCardAPI.java中。
2. 调用流程图
3. 读取进度及状态回调处理
在使用本SDK前必须实现ActiveCallBack接口中的相关函数,原型如下:
public interface ActiveCallBack{void readProgress(int npaogress);void setUserInfo(String sztxt);
}void readProgress(int npaogress);//返回身份证读卡进度,一共20步。void setUserInfo(String sztxt);//函数空实现即可,有时会返回调试信息。
4. 接口
OTGReadCardAPI
接口初始化操作。
paramContext:android 的上下文
cb:实现回调的类
bNFC:统一写成false
GetVersion
获取当前版本号
setServerInfo
设置服务器列表(初始化后最先调用,必须)
twoCardServerList:身份证解码服务器列表
eidServerList:为null
bTestServer:统一填false
返回值:无
NfcReadCard
通过NFC读卡,同步操作,执行结束返回状态。
szAppID:APPID,每家商户的唯一ID(需要向本公司申请后获取)
userInfo:用户信息,暂时为空
intent:NFC句柄,OTG时填null
defaultType:只能填eTwoGeneralCard
userData:用户透传数据,如不需要,直接填“”
bAuth:填false
返回值:
41 – 失败
90 – 成功
GetCardType
返回NfcReadCard中读取的卡片类型。
返回值:
同NfcReadCard中的eCardType,返回eTwoGeneralCard
GetTwoCardInfo
当读卡为身份证类型的时候,获取身份证详细信息。
返回值:
public class TwoCardInfo {
public String szTwoIdName; // 姓名
public String szTwoIdSex; // 性别
public String szTwoIdNation; // 民族
public String szTwoIdBirthday; // 出生日期
public String szTwoIdAddress; // 住址
public String szTwoIdNo; // 身份证号码
public String szTwoIdSignedDepartment; // 签发机关
public String szTwoIdValidityPeriodBegin; // 有效期起始日期 YYYYMMDD
public String szTwoIdValidityPeriodEnd; // 有效期截止日期 YYYYMMDD 有效期为长期时存储“长期”
public String szTwoIdNewAddress; // 最新住址
public byte[] arrTwoIdPhoto; // 照片信息
public byte[] arrTwoIdFingerprint; // 指纹信息
public String szSNID;
public String szDNID;
public String szTwoOtherNO; // 通行证类号码
public String szTwoSignNum; // 签发次数
public String szTwoRemark1; // 预留区
public String szTwoType; // 证件类型标识
public String szTwoRemark2; // 预留区
}
GetErrorInfo
获取执行过程中的出错信息。
0 成功
0 < 失败
5. 调用样例
OTGReadCardAPI ReadCardAPI;
ReadCardAPI = new OTGReadCardAPI(getApplicationContext(), this, false);
ArrayList twoCardServerlist = new ArrayList();
twoCardServerlist.add(new Serverinfo(“xx.xxxx.xx”, 0000));
szFactory = “xxxxxxxxxxxxxxxxxx”;
ReadCardAPI.setServerInfo(twoCardServerlist, null, false);
if (ReadCardAPI.NfcReadCard(szFactory, null, inintent, eCardType.eTwoGeneralCard, “”, false) == 90)
{
// 解码成功
}
else
{
// 解码失败
}
完整源代码和资料:https://github.com/yzfuture/yzfuture