近期公司使用 精伦电子 iDR210、中国普天 CP IDMR02/TG、新中新 DKQ-A16D读卡器,对身份证读取。
于是便写了这个JS对身份证读卡器进行操作。
留意,在程序测试时,新中新的读卡器,貌似出问题了。奇怪的问题是,使用普天的驱动可以正常使用新中新的读卡器,而新中新的程序却不能识别自己的读卡器。
另外,普天读卡器,有时候拿不到身份证图片的 BASE64信息。建议禁用其他无关身份证读卡器加载项关闭IE重新打开,再试试。
另,已修复 IE8 console 报错问题。使用时,可以把 cardDebug 开关关闭。
需要注意的是,修复后的 console.log 并不是支持所有IE浏览器(IE8是显示了,IE11却不显示了),建议使用 Faux Console 来处理此问题。
在 HTML文件 HEAD部分加入:
idCard.js 源文件:
/* 执行流程 1、获取读卡器类型及报错信息 2、读取证件信息 3、post 数据 by un */ var cardDebug = false; // 调试开关 // 读取到的身份证信息 var persInfo = {txt_aac003 : '',txt_aac004 : '', txt_aac004n : '', txt_aac005 : '', txt_aac005n : '', txt_aac002 : '', txt_bab305 : '', baseimg : ''}; var jingLunInfo; // 精伦 读取到的身份证信息 var puTianInfo; // 普天 读取到的身份证信息 var xinZhongXinInfo; // 新中新 读取到的身份证信息 // 对 persInfo 置空 function initPersInfo() { persInfo.txt_aac003 = '';// 姓名 persInfo.txt_aac004 = ''; // 性别编号 persInfo.txt_aac004n= ''; // 性别 persInfo.txt_aac005 = ''; // 民族编号 persInfo.txt_aac005n= ''; // 民族 persInfo.txt_aac002 = ''; // 身份证号码 persInfo.txt_bab305 = ''; // 身份证个人地址 persInfo.baseimg = ''; // 身份证图片 Base64编码 } // 测试所有支持的读卡器 function testCard() { initPersInfo(); var data = ''; if (getCookie('cardType') == '') { data = testJingLunCard(); // 精伦 读卡器测试 if (cardDebug) { console.log("精伦 读卡器测试"); console.log("type " + data.type); console.log("status " + (data.status ? 'true' : 'false')); console.log("info " + data.info); } if (data.status == false) { data = testPuTianCard(); // 普天 读卡器测试 if (cardDebug) { console.log("普天 读卡器测试"); console.log("type " + data.type); console.log("status " + (data.status ? 'true' : 'false')); console.log("info " + data.info); } if (data.status == false) { // 新中新 读卡器有问题 忽略处理 (BT的是,使用演示程序 普天 可以顺利的使用新中新的读卡器) data = testXinZhongXinCard(); // 新中新 读卡器测试 if (cardDebug) { console.log("新中新 读卡器测试"); console.log("type " + data.type); console.log("status " + (data.status ? 'true' : 'false')); console.log("info " + data.info); } if (data.status == false) { alert(data.info); return false; } } } } else { if (cardDebug) { console.log("使用 Cookie 来操作读卡器 "+getCookie('cardType')); } switch (getCookie('cardType')) { case 'jinglun': // 精伦 data = testJingLunCard(); // 精伦 读卡器测试 break; case 'putian': // 普天 data = testPuTianCard(); // 普天 读卡器测试 break; case 'xinzhongxin':// 新中新 data = testXinZhongXinCard(); // 新中新 读卡器测试 break; } if (data.status == false) { alert(data.info); return false; } } setCookie('cardType',data.type, null); getCardVal(data); postInfo(); } function getCardVal(data) { // 数据置空 switch (data.type) { case 'jinglun': // 精伦 persInfo.txt_aac003 = JingLunCard.GetName();// 姓名 persInfo.txt_aac004 = JingLunCard.GetSexN(); // 性别编号 persInfo.txt_aac004n= JingLunCard.GetSex(); // 性别 persInfo.txt_aac005 = JingLunCard.GetFolkN(); // 民族编号 persInfo.txt_aac005n= JingLunCard.GetFolk(); // 民族 persInfo.txt_aac002 = JingLunCard.GetCode(); // 身份证号码 persInfo.txt_bab305 = JingLunCard.GetAddress(); // 身份证个人地址 persInfo.baseimg = JingLunCard.GetJPGPhotobuf(); // 身份证图片 Base64编码 break; case 'putian':// 普天 try { persInfo.txt_aac003 = PuTianCard.NameL();// 姓名 }catch(e) { data.status = false; data.info = "身份证信息读取失败 错误详情:"+e.name+":"+e.message; return data; } persInfo.txt_aac004 = PuTianCard.Sex(); // 性别编号 persInfo.txt_aac004n= PuTianCard.sexL(); // 性别 persInfo.txt_aac005 = PuTianCard.Nation(); // 民族编号 persInfo.txt_aac005n= PuTianCard.NationL(); // 民族 persInfo.txt_aac002 = PuTianCard.CardNo(); // 身份证号码 persInfo.txt_bab305 = PuTianCard.Address(); // 身份证个人地址 persInfo.baseimg = PuTianCard.GetImage(); // 身份证图片 Base64编码 break; case 'xinzhongxin':// 新中新 persInfo.txt_aac003 = XinZhongXinCard.NameA();// 姓名 persInfo.txt_aac004 = XinZhongXinCard.Sex(); // 性别编号 persInfo.txt_aac004n= persInfo.txt_aac004 == '1' ? '男' : '女'; // 性别 persInfo.txt_aac005n= XinZhongXinCard.Nation(); // 民族编号 persInfo.txt_aac005 = XinZhongXinCard.Nation(); // 民族 persInfo.txt_aac002 = XinZhongXinCard.CardNo(); // 身份证号码 persInfo.txt_bab305 = XinZhongXinCard.Address(); // 身份证个人地址 persInfo.baseimg = XinZhongXinCard.Base64Photo(); // 身份证图片 Base64编码 break; // 新中新读卡器有问题 default: if (cardDebug) { console.log("当前读卡器不被支持或不存在身份证读卡器!"); } return false; // 当前读卡器不被支持或不存在身份证读卡器 break; } if (cardDebug) { console.log("card type " + data.type); console.log("status " + (data.status ? 'true' : 'false')); console.log("info " + data.info); console.log("姓名 " + persInfo.txt_aac003); console.log("性别编号 " + persInfo.txt_aac004); console.log("性别 " + persInfo.txt_aac004n); console.log("民族编号 " + persInfo.txt_aac005); console.log("民族 " + persInfo.txt_aac005n); console.log("身份证号码 " + persInfo.txt_aac002); console.log("身份证个人地址 " + persInfo.txt_bab305); console.log("身份证图片 Base64编码 " + persInfo.baseimg); } } // POST 数据 function postInfo() { $.post("index.php?m=index&a=top",{ "txt_aac003":persInfo.txt_aac003, "txt_aac002":persInfo.txt_aac002, "txt_aac004":persInfo.txt_aac004, "txt_aac005":persInfo.txt_aac005, "txt_bab305":persInfo.txt_bab305, "txt_aac004n":persInfo.txt_aac004n+'性', "txt_aac005n":persInfo.txt_aac005n+'族', "baseimg":persInfo.baseimg },function(data){ window.top.topFrame.location.reload(); eval("var data='"+data+"'"); if(data.state == -1){ window.top.mainFrame.I2.location="index.php?m=personal&a=add&s=card"; window.top.mainFrame.I2.reload(); } }); } // 精伦 读卡器测试 function testJingLunCard() { // 执行结果与信息提示和读卡器类型 var result = {status : true, info : '', type : 'jinglun'}; // 精伦 读卡器 try { jingLunInfo = JingLunCard.ReadCard("1001","d:\\test\\test.bmp"); }catch(e) { result.status = false; result.info = "您未安装身份证读卡驱动!错误详情:"+e.name+":"+e.message; return result; } if (result.status == true && jingLunInfo == 1) { result.status = true; result.info = "操作成功!"; // 表明读取成功 } else { if (cardDebug) { console.log("精伦 返回值 " + jingLunInfo); } switch (jingLunInfo) { case 1:// 读取成功 使用 jingLunInfo 获取身份证信息 result.status = true; result.info = "操作成功!"; break; case -1: result.status = false; result.info = "端口初始化失败!"; break; case -2: result.status = false; result.info = "请重新将卡片放到读卡器上!"; break; case -3: result.status = false; result.info = "读取数据失败!"; break; case -4: result.status = false; result.info = "生成照片文件失败,请检查设定路径和磁盘空间!"; break; } } return result; } var isInit = false; function testPuTianCard() { // 执行结果与信息提示和读卡器类型 var result = {status : true, info : '', type : 'putian'}; //设置端口号,1表示串口1,2表示串口2,依此类推;1001表示USB。0表示自动选择 if(false == isInit) { try { PuTianCard.setPortNum(0); }catch(e) { result.status = false; result.info = "您未安装身份证读卡驱动!错误详情:"+e.name+":"+e.message; return result; } isInit=true; } //使用重复读卡功能 PuTianCard.Flag=0; // 读卡 try { puTianInfo = PuTianCard.ReadCard(); }catch(e) { result.status = false; result.info = "您未安装身份证读卡驱动!错误详情:"+e.name+":"+e.message; return result; } if (cardDebug) { console.log("普天 返回值 " + puTianInfo); } switch (puTianInfo) { case 0x90: // 读取成功 使用 puTianInfo 获取身份证信息 result.status = true; result.info = "操作成功!"; break; case 0x01: result.status = false; result.info = "端口初始化失败!"; break; case 0x02: // 超时 result.status = false; result.info = "读取数据失败!"; break; case 0x41:// 读卡失败 result.status = false; result.info = "请重新将卡片放到读卡器上!"; break; default: result.status = false; result.info = "未知错误!"; } return result; } function testXinZhongXinCard() { // 执行结果与信息提示和读卡器类型 var result = {status : true, info : '', type : 'xinzhongxin'}; try { var xinZhongXinStatus = XinZhongXinCard.FindReader(); }catch(e) { result.status = false; result.info = "您未安装身份证读卡驱动!错误详情:"+e.name+":"+e.message; return result; } if (cardDebug) { console.log("新中新 获取读卡器 " + tmpStatus); } if (xinZhongXinStatus > 0) { result.status = true; result.info = "操作成功!"; XinZhongXinCard.SetPhotoPath(2, 'C:\\Windows\\temp\\'); var tmpStatus = XinZhongXinCard.ReadCardMsg(); if (cardDebug) { console.log("新中新 返回值 " + tmpStatus); } if (tmpStatus == 0) { result.status = true; result.info = "操作成功!"; } else { result.status = false; result.info = "请重新将卡片放到读卡器上!"; } } else { result.status = false; result.info = "读卡器初始化失败!"; } return result; } /* * 读会员卡 */ function ICcard(){ var result; //注意:参数为对应的设备端口,iDR210为8159,iDR200 USB型为1001,iDR200串口型为1至16 try{ result=JingLunCard.ReadICCard("8159"); }catch(e) { alert("您未安装读卡驱动!错误详情:"+e.name+":"+e.message); return; } if (result==1){ var txt_cardmark = JingLunCard.GetICCardSN(); $.post("index.php?m=index&a=top",{ "txt_cardmark":txt_cardmark }, function(data){ var data = eval("data="+data); if(data.state==0){ alert(data.msg); }else{ window.top.topFrame.location.reload(); } }) }else{ if (result==-1) alert("端口初始化失败!"); if (result==-2) alert("读IC卡失败"); } } function CardById(id) { return document.getElementById(id); } // 设置 Cookie function setCookie(c_name,value,expiredays) { var exdate=new Date(); exdate.setDate(exdate.getDate()+expiredays); document.cookie=c_name+ "=" +escape(value)+((expiredays==null) ? "" : ";expires="+exdate.toGMTString()); } // 读取 Cookie 失败 返回 空 function getCookie(c_name) { if (document.cookie.length>0) { c_start=document.cookie.indexOf(c_name + "=") if (c_start!=-1) { c_start=c_start + c_name.length+1; c_end=document.cookie.indexOf(";",c_start); if (c_end==-1) c_end=document.cookie.length; return unescape(document.cookie.substring(c_start,c_end)); } } return ""; }