当前位置: 移动技术网 > IT编程>开发语言>Java > web读取身份证信息(java语言)

web读取身份证信息(java语言)

2020年07月14日  | 移动技术网IT编程  | 我要评论

其实实现读取身份证信息,代码其实没有多难,关键需要和硬件的厂商协调好,看他们的硬件是否支持二次开发(一般都支持)。如果支持我们需要和他们拿到他们底层的jar包和api(接口文档),要是有demo就更好了。

下面分享一下我实现的过程:

一:实现思路

1:和硬件的研发沟通好,拿到jar

因为需要动态库,会使用到dll,这个研发也会给我们,我们根据他们要求放在对应的位置就可以。dll怎么实现我们不需要理会,我们只要使用jar调用就可以。

2:把jar放到你的项目,build一下

3:新建对应的对象,调取函数,实现身份证读取

注意需要的参数,一般需要端口等,我这里需要的是端口,超时设置,头像路径。注意返回来的数据类型,最好是json数据格式,这样我们方便读取数据,我这里所有的信息合在一起返回来String类型。这里就需要我们做数据解析,我使用了数据分割,和截取数据长度,拿到自己想要的数据。

4:将信息返回前段,显示在from表单里面。

5:项目结束

二:具体代码

1:前段按钮触发

按钮

<div class="am-u-sm-3 am-u-sm-push-3">
 <button type="button"  onclick="checkNull()"  class="am-btn am-btn-primary">提取信息</button>
 </div>

js(ajax触发)

三种情况:

请求成功,显示在对应的from表单

请求失败,读取身份证有误

证件到期日小于一年,提醒使用者,注意到期日

//请求身份证信息
function checkNull(){
		$.ajax({
		       url:"test/test",//后台的接口地址
		       type:"post",//post请求方式
		       success:function(data) {
		    	   var status=data.status
		    	   if(status==="error"){
		    		   alert("读取失败,重新读卡")
		    	   }else if(status==="error"){
		    		   alert("核查身份证到期日")
		    	   }else{
		    		 //获取信息
		    		   var add=data.status
			    	   var name=data.name
			    	   var idnum=data.idnum
			    	   var sex=data.sex
			    	   //将信息展示在from表单
			    		$("#user-name").val(name);
			    	   $("#user-sex").val(sex);
			    	   $("#user-num").val(idnum);
			    	   $("#user-add").val(add);
		    	   }
		    	  
		       },error:function (data) {
		  	       layer.close(index);
		           layer.msg('上传失败', {icon: 1});
		       }
		   })	
		
}

2:后端对应的controller处理

新建对象,调用硬件的接口,设置需要传入的参数

//新建ctid对象
CT_IDCard ctid=new CT_IDCard();
//1001代表的sdt端口  20读取器超时设置  null头像的路径
String[] readCard_t2 = ctid.ReadCard_t2(1001,5, null);

根据返回状态,判断读取是否成功

0是成功,1是失败。0时,做数据解析,1返回前段,告诉使用者重新刷身份证。

//获取返回状态
String n=readCard_t2[0];

判断身份证当前日期和到期日期是否大于一年,提示使用者。写代码时考虑一下到期日为长期的结果。

所有实现代码

//读取身份证信息
	@RequestMapping("test")
	@ResponseBody
	public JSONObject test(HttpServletRequest request) throws UnsupportedEncodingException, ParseException {
		Map<String, String> map=new HashMap<String, String>();
		
		//新建ctid对象
		CT_IDCard ctid=new CT_IDCard();
		//1001代表的sdt端口  20读取器超时设置  null头像的路径
		String[] readCard_t2 = ctid.ReadCard_t2(1001,5, null);
		
		//获取返回状态
		String n=readCard_t2[0];
		//n==0时,读取成功,其它读取失败  
		if(n.equals("0")) {
			//使用spilt去把数据分割开
			String a[] = readCard_t2[1].split(":|,");  
			
			//获取身份证到期日期
			int length0 = a[9].length();
			String stime = a[9].substring(2, length0-1);
			System.out.println("身份证到期日期:"+stime);
			
			/*
			 * 判断身份证是否为长期
			 * 长期不做数据校验
			 */
			if(stime.equals("长期")) {//身份证为长期
				//获取想要的数据
				int length = a[1].length();
				String add = a[1].substring(2, length-1);
				System.out.println("地址:"+add);
				
				int length1 = a[13].length();
				String name = a[13].substring(2, length1-1);
				System.out.println("姓名:"+name);
				
				int length2 = a[29].length();
				String idnum = a[29].substring(2, length2-1);
				System.out.println("身份证号:"+idnum);
				
				int length3 = a[33].length();
				String sex = a[33].substring(2, length3-1);
				System.out.println("性别:"+sex);
				
				map.put("status", add);
				map.put("name", name);
				map.put("idnum", idnum);
				map.put("sex", sex);
			}else {
				//拆分年月日
				String substring = stime.substring(0, 4);
				String substring2 = stime.substring(4, 6);
				String substring3 = stime.substring(6, 8);
				System.out.println("年"+substring+"月"+substring2+"日"+substring3);
				//转化为****-**-**格式
				String sfztime=substring+"-"+substring2+"-"+substring3;
				
				//新建time对象
				TimeUtils time=new TimeUtils();
				
				//转化身份证到期日为时间戳
				String ztime=time.dateToStamp(sfztime);
				long i = Long.parseLong(ztime);
				//获取当前的时间戳
				String nowtime=time.getstampTime();
				long i1 = Long.parseLong(nowtime);
				System.out.println("ztime"+ztime+"nowtime"+nowtime);
				
				//身份证到期如与当前时间做差
				long i2=i-i1;
				//身份证到期日与当前时间差大于一年
				if(i2>=31536000) {
					//获取想要的数据
					int length = a[1].length();
					String add = a[1].substring(2, length-1);
					System.out.println("地址:"+add);
					
					int length1 = a[13].length();
					String name = a[13].substring(2, length1-1);
					System.out.println("姓名:"+name);
					
					int length2 = a[29].length();
					String idnum = a[29].substring(2, length2-1);
					System.out.println("身份证号:"+idnum);
					
					int length3 = a[33].length();
					String sex = a[33].substring(2, length3-1);
					System.out.println("性别:"+sex);
					
					map.put("status", add);
					map.put("name", name);
					map.put("idnum", idnum);
					map.put("sex", sex);
				}else {//身份证到期日与当前时间差不大于一年  提醒信贷员考虑合同是否往下做
					map.put("status", "error1");
				}
			}
		}else {//数据获取失败
			map.put("status", "error");
		}
			
//		String flag= new String(readCard_t2[1].getBytes("gbk"),"utf-8");
//		System.out.println(flag);		
		//String flag= new String(readCard_t2[1].getBytes("ISO-8859-1"),"gbk");
		//String flag1= new String(flag.getBytes("gbk"),"utf-8");
			

		JSONObject json=JSONObject.fromObject(map);
		return json;
	}

三:结语

代码不是很重要,重要的实现的思路。关键你要明白,如何读取我们一般调用硬件的底层,所以和研发沟通是很重要的。还有一定得读懂接口文档。

更多的经典案例和实现效果关注下面公众号查看:
在这里插入图片描述

本文地址:https://blog.csdn.net/baidu_38978508/article/details/107299833

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网