一、服务能力
服务名称 | 输入 | 输出 | 说明 |
云识读服务 | 通过NFC非接模式读取证件芯片中的信息完成证件信息的读取 | 身份文本信息和证件照片信息 | 身份文本信息包括姓名、身份证号、性别、民族、出生日期、住址、有效日期、签发机关 |
二、准备接入
1、应用申请:点击进入申请界面
2、客户端解码SDK及使用手册:点击下载
3、服务端查询SDK及使用手册:点击下载
三、实现流程
四、流程说明
流程1: 读取证件信息
手机使用客户端读卡SDK完成证件信息读取,参照读卡SDK文档以下内容:
A. 读卡初始化
EidLinkSE eid = EidLinkSEFactory.getEidLinkSE(mHandler, this, APPID, IP,PORT,1,ENVIDCODE);
// uiHandler SDK调用者传入Handler,用于处理返回信息
// mContext上下文
// APPID: 应用APPID 云识读分配的APPID
// ip地址 云识读分配的IP地址:testnidocr.eidlink.com
// port端口号 云识读分配的端口:9989
// readtimes读卡次数,readtimes大于0,建议:1~5次
// ENVIDCODE 环境识别码:默认26814
B. 开始读卡
readIDCard(Intent)
方法定义
public void readIDCard(Intent intent);
方法说明
NFC 读取身份证,读卡过程中产生的状态和结果,用Handler传递结果。
根据Android Api,NFC两种实现方式:第一种见4.1.41,第二种readIDCard(Intent intent)
详情见Android api
参数
Intent - NFC 读卡,读卡过程中产生的状态和结果,用Handler传递结果。
返回值 无
例
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
/*注意事项: nfcAdapter.enableForegroundDispatch(this, pi, mFilters, mTechLists);
* 中根据mFilters和mTechLists配置参数不同,intent.getAction()返回值可能不同*/
if (NfcAdapter.ACTION_TECH_DISCOVERED.equals(intent.getAction())) {
try{
eid.readIDCard(intent);
}catch (Exception e){
e.printStackTrace();
}
}
}
C. 读卡结果获取
private final Handler mHandler = new Handler(Looper.getMainLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case READ_CARD_START:
tv_msg.setText("开始读卡");
starttime = System.currentTimeMillis();
break;
case READ_CARD_FAILED:
int s = msg.arg1;
tv_msg.setText("读卡失败: "+s);
break;
case READ_CARD_SUCCESS:
endtime = System.currentTimeMillis() - starttime;
String reqid = (String) msg.obj;
tv_msg.setText("读卡成功 "+reqid+"\n耗时: "+endtime+"ms");
break;
default:
break;
}
}
};
流程2: 查询证件信息
服务端使用查询SDK进行查询身份信息结果。
业务参数说明
参数 | 命名 | 是否必填 | 描述 |
身份信息查询ID | reqID | 是 | 业务流水号,应用方生成,针对本次请求的唯一标识。 |
查询属性选项 | qryType | 否 |
0:仅返回数字身份 3或空:姓名+ 公民身份号码 4:照片base64编码 7:姓名+ 公民身份号码+照片base64编码 511:全信息 |
数字信封加密时方式 | algorithmType | 否 | 0:ECB 1:CBC |
查询身份信息代码样例
public void idCardCheckTest() {
String eIDServerIp = "testnidocr.eidlink.com";
int eIDServerPort = 443;
String appId = ""; //云识读分配的appid
String appKey = ""; //云识读分配的appKey
Config.setBasicInfo(eIDServerIp,eIDServerPort,appId,appKey);
String reqID = "";//读卡成功reqid,次参数内容由读卡sdk提供
/**
*qryType 查询属性选项
* 0:仅返回数字身份
* 3 返回姓名+ 公民身份号码
* 4:返回照片base64编码
* 7:返回姓名+ 公民身份号码+照片base64编码
* 511:全信息
*/
String qryType = "";
String algorithmType = ""; //数字信封加密时方式: 0:ECB 1:CBC 空默认ECB
PublicParam publicParam = new PublicParam();
IdCardCheckParam idCardCheckParam = new IdCardCheckParam(publicParam, reqID ,qryType,algorithmType);
CommonResult result = EidlinkService.idCardCheck(idCardCheckParam);
// 00:返回正确结果
if ("00".equals(result.getResult())) {
System.out.println("===== 身份查询返回结果正常:" + result.getResult() + " === " + result.getResult_detail());
} else {
System.out.println("===== 身份查询返回结果异常:" + result.getResult() + " === " + result.getResult_detail());
}
System.out.println(JSONObject.fromObject(result).toString());
}
查询身份信息返回样例
{"appEidCode":"",,"biz_sequence_id":"hoYfG0gCdjdnbvlGE0Y","ciphertext":"{\"infoencode\":\"15acbd2c77be279243ae33d90422e59bd3925ffc827bc365bd5c56df88c386a70f82256a5f3d74dbfcfede3e9557497bcebc2a65bae7e1266cf899f35ea4f9ee5ba46ad554bbbc1c385c3d20512cce833543f2635abe77b5ec003f86dbff441e7e893e315d585f4424b30cfa3ca819f89dab7bbac8ad556791b92c999fac9d94ccfb36cb6047324365e4cb8a3398b6e11d21fd1230fba4e3d984326c8dfccbddbf5aecb440e8a66e197f9df9e49bdf7323ede8f013049a0711985ab9b5ac3a98099f77a6151e8193d2da155eab054e86bdf1ebf5ebdb63a65224def673d031aef2bb5a1cba05ac60215fdae8dfe640515b24715a657679257bbcc8d4bfe05f81b96e50dbed630ab0a325e70bed62b7d772f63fd1f7c0490c99f643b471f7e69b\",\"randomencode\":\"BDNEX58zfPjVSir2UWp1Yc2hl/GhbfA/s8nRkKAk6t+dyhUmGaYGY92hyY4g/aHanEMPyiNAaupN7NN2d2hhi1kdE8KibqIFpHW66xHNg5AR2GYfrfbLXDF0Rw7+SjFOCMj+x7OcPHk64Izh4ox8HUkQotq29btb1I8pKhu90URX\",\"pubkeymd5\":\"uFlXUvqiXu6S2sACDZ3xMQ==\"}","result":"00","result_detail":"0000000","result_msg":"","result_time":"20200430175716","version":"2.0.0"}
解密身份信息参考代码
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeySpecException {
String privateKey = ""; //填写P10私钥,用于解密信息
PKCS8EncodedKeySpec keySpecB = new PKCS8EncodedKeySpec(Base64.decodeBase64(privateKey));
KeyFactory keyFactoryB = KeyFactory.getInstance("EC",new BouncyCastleProvider());
PrivateKey pkB = keyFactoryB.generatePrivate(keySpecB);
String randomencode = "";//填写随机数密文
String random = SM2Utils.decrypt(randomencode, pkB); //解密随机数密文
System.out.println("随机数明文:" + random);
String infoencode = "";//填写身份密文信息
dexECB(infoencode, random);//ECB解密身份信息
// dexCBC(infoencode, random); //CBC解密身份信息
}