新版外国人永居证身份证读卡器C++开发SDK接口

近期,国家移民管理局对外国人永久居留身份证(以下简称永居证)进行了升级改造和便利化应用工作,新版永居证将于 2023年 12 月 1 日起正式签发。新版永居证调整了号码规则,改进了信
息储存,优化了图案设计,明确了在民航领域便利化应用事项。此外,新版永居证正式启动签发后,将停止签发 2017 版永居证,既往版本的永居证(含外国人永久居留证、2017 版永居证)在其有效期内仍可正常使用,有效期满后需换发新版永居证。

新版外国人永居证身份证读卡器C++开发SDK接口_第1张图片

据相关文件要求,必须更新身份证阅读器机具接口,实现对新版本外国人永居证的读取兼容。

C++读取新版本外国人永居证效果图:

新版外国人永居证身份证读卡器C++开发SDK接口_第2张图片

以下是C++实现代码:


void CDonseeTestDlg::OnBnClickedButton19()
{
	{
		m_bPhoto = FALSE;
		CRect r;
		HDC hDC;
		HPEN hPen, hPenOld;
		HBRUSH hBrush, hBrushOld;
		hDC = ::GetDC(m_Static_Photo.m_hWnd);
		m_Static_Photo.GetClientRect(&r);
		hPen = CreatePen(PS_NULL, 0, GetSysColor(COLOR_3DFACE));   // 不带黑边
		hPenOld = (HPEN)SelectObject(hDC, hPen);
		hBrush = GetSysColorBrush(COLOR_3DFACE);
		hBrushOld = (HBRUSH)SelectObject(hDC, hBrush);
		Rectangle(hDC, r.left+1, r.top+1, r.right-1, r.bottom-1);
		SelectObject(hDC, hBrushOld);
		SelectObject(hDC, hPenOld);
		::ReleaseDC(m_Static_Photo.m_hWnd, hDC);
	}

	CWnd *pWnd;
	pWnd = GetDlgItem(IDC_STATIC_PHOTO);
// 	pWnd->GetWindowRect(m_rtPicShow);
// 	ScreenToClient(m_rtPicShow);

	m_bPhoto = FALSE; 
	if ((m_isOpenUSB == false) && (m_isOpenCOM == false))
	{
		InsertInfo(L"EST-100身份证读卡器连接失败,请先打开USB或者COM端口") ;
		return ;
	}

	char t_arrMsg[256] ;
	char t_szPicPath[256] = "IDphoto.jpg";
	CString t_strTemp ;

	IDINFO idInfo ;
	memset(&idInfo,0,sizeof(IDINFO)) ;

	int t_nType = m_Combo5.GetCurSel() ;

	long t_nRe = Donsee_ReadIDCard(t_nType,t_szPicPath,&idInfo,t_arrMsg) ;
	if (t_nRe != 0 )
	{
		t_strTemp = t_arrMsg ;
		InsertInfo(L"身份证读取失败:" + t_strTemp) ;
		return ;
	}
  	Donsee_Beep();
	CString strTempA ;
	CString strInfo ;
	CString strType ;

	strType = idInfo.certType ;
	if (strType == "Y")  //新版本外国人永居证
	{
		//中文姓名
		t_strTemp = idInfo.name ;
		strTempA.Format(L"中文姓名:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//性别
		t_strTemp = idInfo.sex ;
		strTempA.Format(L"性别:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//换证次数
		t_strTemp = idInfo.certVersion ;
		strTempA.Format(L"换证次数:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//出生日期
		t_strTemp = idInfo.birthday ;
		// 	strTempA.Format(L"    IDINFO.birthday: ");
		strTempA.Format(L"出生:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//英文姓名,需要和英文姓名备用组合起来才是完整英文姓名
		t_strTemp = idInfo.ENfullname ;
		strTempA.Format(L"英文姓名:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		strInfo += idInfo.Other ;  //英文姓名备用
		InsertInfo(strInfo);

		//证件号码
		t_strTemp = idInfo.number ;
		strTempA.Format(L"永居证号码:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//起始日期
		t_strTemp = idInfo.signdate ;
		strTempA.Format(L"有效期开始:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//截止日期
		t_strTemp = idInfo.validterm ;
		// 	strTempA.Format(L"    IDINFO.validterm: ");
		strTempA.Format(L"有效期结束:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//国籍代码
		strTempA.Format(L"国籍:");
		t_strTemp = idInfo.people ;
		strInfo = strTempA;
		strInfo += t_strTemp ;
		strInfo += "/" ;
		t_strTemp = idInfo.Nationality ;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//当次申请受理机构
		t_strTemp = idInfo.organs;
		strTempA.Format(L"当次申请受理机构:");
		strInfo = strTempA;
		strInfo += t_strTemp;
		InsertInfo(strInfo);

		//证件标识符
		t_strTemp = idInfo.certType ;
		strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//既往版本
		if(strcmp(idInfo.address,"") == 0)
			InsertInfo(L"既往版本永居证号码:无");
		else
		{
			t_strTemp = idInfo.address;
			strTempA.Format(L"既往版本永居证号码:");
			strInfo = strTempA;
			strInfo += t_strTemp ;
			InsertInfo(strInfo);
		}
	}
	else if (strType == "I")  //2017版外国人永居证
	{
		//英文姓名
		t_strTemp = idInfo.ENfullname ;
		strTempA.Format(L"英文姓名:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//性别
		t_strTemp = idInfo.sex ;
		strTempA.Format(L"性别:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//永久居住号
		t_strTemp = idInfo.number ;
		strTempA.Format(L"永居证号码:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//国籍代码
		strTempA.Format(L"国籍:");
		t_strTemp = idInfo.people ;
		strInfo = strTempA;
		strInfo += t_strTemp ;
		strInfo += "/" ;
		t_strTemp = idInfo.Nationality ;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//中文姓名
		t_strTemp = idInfo.name ;
		strTempA.Format(L"中文姓名:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);


		//签发日期
		t_strTemp = idInfo.signdate ;
		strTempA.Format(L"有效期开始:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//终止日期
		t_strTemp = idInfo.validterm ;
		strTempA.Format(L"有效期结束:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//出生日期
		t_strTemp = idInfo.birthday ;
		strTempA.Format(L"出生:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//证件版本
		t_strTemp = idInfo.certVersion ;
		strTempA.Format(L"证件版本:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//当次申请受理机构
		t_strTemp = idInfo.organs ;
		strTempA.Format(L"当次申请受理机构:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);



		//证件标识符
		t_strTemp = idInfo.certType ;
		strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);
	}
	else if (strType == "J")  //港澳台居民居住证
	{
		//姓名
		t_strTemp = idInfo.name ;
		strTempA.Format(L"姓名:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//性别
		t_strTemp = idInfo.sex ;
		strTempA.Format(L"性别:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//出生日期
		t_strTemp = idInfo.birthday ;
		strTempA.Format(L"出生:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//地址
		t_strTemp = idInfo.address;
		strTempA.Format(L"住址:");
		strInfo = strTempA;
		strInfo += t_strTemp;
		InsertInfo(strInfo);


		//证件号码
		t_strTemp = idInfo.number ;
		strTempA.Format(L"港澳台居住证号码:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//签发机关
		t_strTemp = idInfo.organs ;
		strTempA.Format(L"签发机关:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//起始日期
		t_strTemp = idInfo.signdate ;
		strTempA.Format(L"有效期开始:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//截止日期
		t_strTemp = idInfo.validterm ;
		strTempA.Format(L"有效期结束:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//通行证号
		t_strTemp = idInfo.passNu ;
		strTempA.Format(L"通行证号码:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//签发次数
		t_strTemp = idInfo.signCount ;
		strTempA.Format(L"签发次数:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//证件标识符
		t_strTemp = idInfo.certType ;
		strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);
	}
	else   //strType =="0"  居民身份证
	{
		//姓名
		t_strTemp = idInfo.name ;
		strTempA.Format(L"姓名:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//性别
		t_strTemp = idInfo.sex ;
		strTempA.Format(L"性别:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//民族
		t_strTemp = idInfo.people ;
		strTempA.Format(L"民族:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//出生日期
		t_strTemp = idInfo.birthday ;
		strTempA.Format(L"出生:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//住址
		t_strTemp = idInfo.address ;
		strTempA.Format(L"住址:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//证件号码
		t_strTemp = idInfo.number ;
		strTempA.Format(L"身份证号码:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//签发机关
		t_strTemp = idInfo.organs ;
		strTempA.Format(L"签发机关:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//起始日期
		t_strTemp = idInfo.signdate ;
		strTempA.Format(L"有效期开始:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//截止日期
		t_strTemp = idInfo.validterm ;
		strTempA.Format(L"有效期结束:");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);

		//证件标识符
		t_strTemp = idInfo.certType ;
		strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");
		strInfo = strTempA;
		strInfo += t_strTemp ;
		InsertInfo(strInfo);
	}


	CString t_str1 , t_str2 ;
	if (t_nType != 0)
	{
		t_str2 = idInfo.Photo ;
		strTempA.Format(L"头像信息1024字节截取50字节显示: ");
		strInfo = strTempA;
		strInfo += t_str2.Left(50);
		strInfo += "...";

		InsertInfo(strInfo);
	}
	

	if (t_nType == 2)
	{

		t_str2 = "" ;
		for (int i = 0 ; i < 1024 ; i ++)
		{
			t_str1.Format(_T("%02X"),(unsigned char)idInfo.figData[i]) ;
			t_str2 += t_str1 ;
		}

		strTempA.Format(L"指纹信息1024字节截取50字节显示: ");
		strInfo = strTempA;
		strInfo += t_str2.Left(50);
		strInfo += "...";
		InsertInfo(strInfo);
	}

	if (t_nType == 0x00)//此时不需要加载图片
		return ;

	int nLeft = m_rtPicShow.left + (m_rtPicShow.right-m_rtPicShow.left)/2 - 102/2;
	int nTop = m_rtPicShow.top + (m_rtPicShow.bottom-m_rtPicShow.top)/2 - 126/2;
	pWnd->SetWindowPos( NULL,nLeft,nTop,102,126,SWP_NOZORDER);    //把编辑控件的大小设为(100,80),位置不变

	HDC hDC;
	int nWidth;
	int nHeight;

	if (!m_imPhoto.IsNull())
		m_imPhoto.Destroy();
	m_imPhoto.Load(CString(t_szPicPath));
	m_bPhoto = TRUE;
	m_Static_Photo.GetClientRect(&m_rPhoto);
	hDC = ::GetDC(m_Static_Photo.m_hWnd);
	nWidth = m_imPhoto.GetWidth();
	nHeight = m_imPhoto.GetHeight();
	m_rPhoto.left = (m_rPhoto.Width()-nWidth) / 2;
	m_rPhoto.right = m_rPhoto.left + nWidth;
	m_rPhoto.top = (m_rPhoto.Height()-nHeight) / 2;
	m_rPhoto.bottom = m_rPhoto.top + nHeight;
	m_imPhoto.Draw(hDC, m_rPhoto);
	::ReleaseDC(m_Static_Photo.m_hWnd, hDC);

// 	InsertInfo(L"获取身份证成功") ;
	return ;
}

你可能感兴趣的:(c++,身份证读卡器,社保卡,新版永居证)