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


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

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

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

    以下是C++实现代码:

    1. void CDonseeTestDlg::OnBnClickedButton19()
    2. {
    3. {
    4. m_bPhoto = FALSE;
    5. CRect r;
    6. HDC hDC;
    7. HPEN hPen, hPenOld;
    8. HBRUSH hBrush, hBrushOld;
    9. hDC = ::GetDC(m_Static_Photo.m_hWnd);
    10. m_Static_Photo.GetClientRect(&r);
    11. hPen = CreatePen(PS_NULL, 0, GetSysColor(COLOR_3DFACE)); // 不带黑边
    12. hPenOld = (HPEN)SelectObject(hDC, hPen);
    13. hBrush = GetSysColorBrush(COLOR_3DFACE);
    14. hBrushOld = (HBRUSH)SelectObject(hDC, hBrush);
    15. Rectangle(hDC, r.left+1, r.top+1, r.right-1, r.bottom-1);
    16. SelectObject(hDC, hBrushOld);
    17. SelectObject(hDC, hPenOld);
    18. ::ReleaseDC(m_Static_Photo.m_hWnd, hDC);
    19. }
    20. CWnd *pWnd;
    21. pWnd = GetDlgItem(IDC_STATIC_PHOTO);
    22. // pWnd->GetWindowRect(m_rtPicShow);
    23. // ScreenToClient(m_rtPicShow);
    24. m_bPhoto = FALSE;
    25. if ((m_isOpenUSB == false) && (m_isOpenCOM == false))
    26. {
    27. InsertInfo(L"EST-100身份证读卡器连接失败,请先打开USB或者COM端口") ;
    28. return ;
    29. }
    30. char t_arrMsg[256] ;
    31. char t_szPicPath[256] = "IDphoto.jpg";
    32. CString t_strTemp ;
    33. IDINFO idInfo ;
    34. memset(&idInfo,0,sizeof(IDINFO)) ;
    35. int t_nType = m_Combo5.GetCurSel() ;
    36. long t_nRe = Donsee_ReadIDCard(t_nType,t_szPicPath,&idInfo,t_arrMsg) ;
    37. if (t_nRe != 0 )
    38. {
    39. t_strTemp = t_arrMsg ;
    40. InsertInfo(L"身份证读取失败:" + t_strTemp) ;
    41. return ;
    42. }
    43. Donsee_Beep();
    44. CString strTempA ;
    45. CString strInfo ;
    46. CString strType ;
    47. strType = idInfo.certType ;
    48. if (strType == "Y") //新版本外国人永居证
    49. {
    50. //中文姓名
    51. t_strTemp = idInfo.name ;
    52. strTempA.Format(L"中文姓名:");
    53. strInfo = strTempA;
    54. strInfo += t_strTemp ;
    55. InsertInfo(strInfo);
    56. //性别
    57. t_strTemp = idInfo.sex ;
    58. strTempA.Format(L"性别:");
    59. strInfo = strTempA;
    60. strInfo += t_strTemp ;
    61. InsertInfo(strInfo);
    62. //换证次数
    63. t_strTemp = idInfo.certVersion ;
    64. strTempA.Format(L"换证次数:");
    65. strInfo = strTempA;
    66. strInfo += t_strTemp ;
    67. InsertInfo(strInfo);
    68. //出生日期
    69. t_strTemp = idInfo.birthday ;
    70. // strTempA.Format(L" IDINFO.birthday: ");
    71. strTempA.Format(L"出生:");
    72. strInfo = strTempA;
    73. strInfo += t_strTemp ;
    74. InsertInfo(strInfo);
    75. //英文姓名,需要和英文姓名备用组合起来才是完整英文姓名
    76. t_strTemp = idInfo.ENfullname ;
    77. strTempA.Format(L"英文姓名:");
    78. strInfo = strTempA;
    79. strInfo += t_strTemp ;
    80. strInfo += idInfo.Other ; //英文姓名备用
    81. InsertInfo(strInfo);
    82. //证件号码
    83. t_strTemp = idInfo.number ;
    84. strTempA.Format(L"永居证号码:");
    85. strInfo = strTempA;
    86. strInfo += t_strTemp ;
    87. InsertInfo(strInfo);
    88. //起始日期
    89. t_strTemp = idInfo.signdate ;
    90. strTempA.Format(L"有效期开始:");
    91. strInfo = strTempA;
    92. strInfo += t_strTemp ;
    93. InsertInfo(strInfo);
    94. //截止日期
    95. t_strTemp = idInfo.validterm ;
    96. // strTempA.Format(L" IDINFO.validterm: ");
    97. strTempA.Format(L"有效期结束:");
    98. strInfo = strTempA;
    99. strInfo += t_strTemp ;
    100. InsertInfo(strInfo);
    101. //国籍代码
    102. strTempA.Format(L"国籍:");
    103. t_strTemp = idInfo.people ;
    104. strInfo = strTempA;
    105. strInfo += t_strTemp ;
    106. strInfo += "/" ;
    107. t_strTemp = idInfo.Nationality ;
    108. strInfo += t_strTemp ;
    109. InsertInfo(strInfo);
    110. //当次申请受理机构
    111. t_strTemp = idInfo.organs;
    112. strTempA.Format(L"当次申请受理机构:");
    113. strInfo = strTempA;
    114. strInfo += t_strTemp;
    115. InsertInfo(strInfo);
    116. //证件标识符
    117. t_strTemp = idInfo.certType ;
    118. strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");
    119. strInfo = strTempA;
    120. strInfo += t_strTemp ;
    121. InsertInfo(strInfo);
    122. //既往版本
    123. if(strcmp(idInfo.address,"") == 0)
    124. InsertInfo(L"既往版本永居证号码:无");
    125. else
    126. {
    127. t_strTemp = idInfo.address;
    128. strTempA.Format(L"既往版本永居证号码:");
    129. strInfo = strTempA;
    130. strInfo += t_strTemp ;
    131. InsertInfo(strInfo);
    132. }
    133. }
    134. else if (strType == "I") //2017版外国人永居证
    135. {
    136. //英文姓名
    137. t_strTemp = idInfo.ENfullname ;
    138. strTempA.Format(L"英文姓名:");
    139. strInfo = strTempA;
    140. strInfo += t_strTemp ;
    141. InsertInfo(strInfo);
    142. //性别
    143. t_strTemp = idInfo.sex ;
    144. strTempA.Format(L"性别:");
    145. strInfo = strTempA;
    146. strInfo += t_strTemp ;
    147. InsertInfo(strInfo);
    148. //永久居住号
    149. t_strTemp = idInfo.number ;
    150. strTempA.Format(L"永居证号码:");
    151. strInfo = strTempA;
    152. strInfo += t_strTemp ;
    153. InsertInfo(strInfo);
    154. //国籍代码
    155. strTempA.Format(L"国籍:");
    156. t_strTemp = idInfo.people ;
    157. strInfo = strTempA;
    158. strInfo += t_strTemp ;
    159. strInfo += "/" ;
    160. t_strTemp = idInfo.Nationality ;
    161. strInfo += t_strTemp ;
    162. InsertInfo(strInfo);
    163. //中文姓名
    164. t_strTemp = idInfo.name ;
    165. strTempA.Format(L"中文姓名:");
    166. strInfo = strTempA;
    167. strInfo += t_strTemp ;
    168. InsertInfo(strInfo);
    169. //签发日期
    170. t_strTemp = idInfo.signdate ;
    171. strTempA.Format(L"有效期开始:");
    172. strInfo = strTempA;
    173. strInfo += t_strTemp ;
    174. InsertInfo(strInfo);
    175. //终止日期
    176. t_strTemp = idInfo.validterm ;
    177. strTempA.Format(L"有效期结束:");
    178. strInfo = strTempA;
    179. strInfo += t_strTemp ;
    180. InsertInfo(strInfo);
    181. //出生日期
    182. t_strTemp = idInfo.birthday ;
    183. strTempA.Format(L"出生:");
    184. strInfo = strTempA;
    185. strInfo += t_strTemp ;
    186. InsertInfo(strInfo);
    187. //证件版本
    188. t_strTemp = idInfo.certVersion ;
    189. strTempA.Format(L"证件版本:");
    190. strInfo = strTempA;
    191. strInfo += t_strTemp ;
    192. InsertInfo(strInfo);
    193. //当次申请受理机构
    194. t_strTemp = idInfo.organs ;
    195. strTempA.Format(L"当次申请受理机构:");
    196. strInfo = strTempA;
    197. strInfo += t_strTemp ;
    198. InsertInfo(strInfo);
    199. //证件标识符
    200. t_strTemp = idInfo.certType ;
    201. strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");
    202. strInfo = strTempA;
    203. strInfo += t_strTemp ;
    204. InsertInfo(strInfo);
    205. }
    206. else if (strType == "J") //港澳台居民居住证
    207. {
    208. //姓名
    209. t_strTemp = idInfo.name ;
    210. strTempA.Format(L"姓名:");
    211. strInfo = strTempA;
    212. strInfo += t_strTemp ;
    213. InsertInfo(strInfo);
    214. //性别
    215. t_strTemp = idInfo.sex ;
    216. strTempA.Format(L"性别:");
    217. strInfo = strTempA;
    218. strInfo += t_strTemp ;
    219. InsertInfo(strInfo);
    220. //出生日期
    221. t_strTemp = idInfo.birthday ;
    222. strTempA.Format(L"出生:");
    223. strInfo = strTempA;
    224. strInfo += t_strTemp ;
    225. InsertInfo(strInfo);
    226. //地址
    227. t_strTemp = idInfo.address;
    228. strTempA.Format(L"住址:");
    229. strInfo = strTempA;
    230. strInfo += t_strTemp;
    231. InsertInfo(strInfo);
    232. //证件号码
    233. t_strTemp = idInfo.number ;
    234. strTempA.Format(L"港澳台居住证号码:");
    235. strInfo = strTempA;
    236. strInfo += t_strTemp ;
    237. InsertInfo(strInfo);
    238. //签发机关
    239. t_strTemp = idInfo.organs ;
    240. strTempA.Format(L"签发机关:");
    241. strInfo = strTempA;
    242. strInfo += t_strTemp ;
    243. InsertInfo(strInfo);
    244. //起始日期
    245. t_strTemp = idInfo.signdate ;
    246. strTempA.Format(L"有效期开始:");
    247. strInfo = strTempA;
    248. strInfo += t_strTemp ;
    249. InsertInfo(strInfo);
    250. //截止日期
    251. t_strTemp = idInfo.validterm ;
    252. strTempA.Format(L"有效期结束:");
    253. strInfo = strTempA;
    254. strInfo += t_strTemp ;
    255. InsertInfo(strInfo);
    256. //通行证号
    257. t_strTemp = idInfo.passNu ;
    258. strTempA.Format(L"通行证号码:");
    259. strInfo = strTempA;
    260. strInfo += t_strTemp ;
    261. InsertInfo(strInfo);
    262. //签发次数
    263. t_strTemp = idInfo.signCount ;
    264. strTempA.Format(L"签发次数:");
    265. strInfo = strTempA;
    266. strInfo += t_strTemp ;
    267. InsertInfo(strInfo);
    268. //证件标识符
    269. t_strTemp = idInfo.certType ;
    270. strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");
    271. strInfo = strTempA;
    272. strInfo += t_strTemp ;
    273. InsertInfo(strInfo);
    274. }
    275. else //strType =="0" 居民身份证
    276. {
    277. //姓名
    278. t_strTemp = idInfo.name ;
    279. strTempA.Format(L"姓名:");
    280. strInfo = strTempA;
    281. strInfo += t_strTemp ;
    282. InsertInfo(strInfo);
    283. //性别
    284. t_strTemp = idInfo.sex ;
    285. strTempA.Format(L"性别:");
    286. strInfo = strTempA;
    287. strInfo += t_strTemp ;
    288. InsertInfo(strInfo);
    289. //民族
    290. t_strTemp = idInfo.people ;
    291. strTempA.Format(L"民族:");
    292. strInfo = strTempA;
    293. strInfo += t_strTemp ;
    294. InsertInfo(strInfo);
    295. //出生日期
    296. t_strTemp = idInfo.birthday ;
    297. strTempA.Format(L"出生:");
    298. strInfo = strTempA;
    299. strInfo += t_strTemp ;
    300. InsertInfo(strInfo);
    301. //住址
    302. t_strTemp = idInfo.address ;
    303. strTempA.Format(L"住址:");
    304. strInfo = strTempA;
    305. strInfo += t_strTemp ;
    306. InsertInfo(strInfo);
    307. //证件号码
    308. t_strTemp = idInfo.number ;
    309. strTempA.Format(L"身份证号码:");
    310. strInfo = strTempA;
    311. strInfo += t_strTemp ;
    312. InsertInfo(strInfo);
    313. //签发机关
    314. t_strTemp = idInfo.organs ;
    315. strTempA.Format(L"签发机关:");
    316. strInfo = strTempA;
    317. strInfo += t_strTemp ;
    318. InsertInfo(strInfo);
    319. //起始日期
    320. t_strTemp = idInfo.signdate ;
    321. strTempA.Format(L"有效期开始:");
    322. strInfo = strTempA;
    323. strInfo += t_strTemp ;
    324. InsertInfo(strInfo);
    325. //截止日期
    326. t_strTemp = idInfo.validterm ;
    327. strTempA.Format(L"有效期结束:");
    328. strInfo = strTempA;
    329. strInfo += t_strTemp ;
    330. InsertInfo(strInfo);
    331. //证件标识符
    332. t_strTemp = idInfo.certType ;
    333. strTempA.Format(L"证件类型(身份证为\"0\",港澳台为\"J\",外国人为\"I、Y)\":");
    334. strInfo = strTempA;
    335. strInfo += t_strTemp ;
    336. InsertInfo(strInfo);
    337. }
    338. CString t_str1 , t_str2 ;
    339. if (t_nType != 0)
    340. {
    341. t_str2 = idInfo.Photo ;
    342. strTempA.Format(L"头像信息1024字节截取50字节显示: ");
    343. strInfo = strTempA;
    344. strInfo += t_str2.Left(50);
    345. strInfo += "...";
    346. InsertInfo(strInfo);
    347. }
    348. if (t_nType == 2)
    349. {
    350. t_str2 = "" ;
    351. for (int i = 0 ; i < 1024 ; i ++)
    352. {
    353. t_str1.Format(_T("%02X"),(unsigned char)idInfo.figData[i]) ;
    354. t_str2 += t_str1 ;
    355. }
    356. strTempA.Format(L"指纹信息1024字节截取50字节显示: ");
    357. strInfo = strTempA;
    358. strInfo += t_str2.Left(50);
    359. strInfo += "...";
    360. InsertInfo(strInfo);
    361. }
    362. if (t_nType == 0x00)//此时不需要加载图片
    363. return ;
    364. int nLeft = m_rtPicShow.left + (m_rtPicShow.right-m_rtPicShow.left)/2 - 102/2;
    365. int nTop = m_rtPicShow.top + (m_rtPicShow.bottom-m_rtPicShow.top)/2 - 126/2;
    366. pWnd->SetWindowPos( NULL,nLeft,nTop,102,126,SWP_NOZORDER); //把编辑控件的大小设为(100,80),位置不变
    367. HDC hDC;
    368. int nWidth;
    369. int nHeight;
    370. if (!m_imPhoto.IsNull())
    371. m_imPhoto.Destroy();
    372. m_imPhoto.Load(CString(t_szPicPath));
    373. m_bPhoto = TRUE;
    374. m_Static_Photo.GetClientRect(&m_rPhoto);
    375. hDC = ::GetDC(m_Static_Photo.m_hWnd);
    376. nWidth = m_imPhoto.GetWidth();
    377. nHeight = m_imPhoto.GetHeight();
    378. m_rPhoto.left = (m_rPhoto.Width()-nWidth) / 2;
    379. m_rPhoto.right = m_rPhoto.left + nWidth;
    380. m_rPhoto.top = (m_rPhoto.Height()-nHeight) / 2;
    381. m_rPhoto.bottom = m_rPhoto.top + nHeight;
    382. m_imPhoto.Draw(hDC, m_rPhoto);
    383. ::ReleaseDC(m_Static_Photo.m_hWnd, hDC);
    384. // InsertInfo(L"获取身份证成功") ;
    385. return ;
    386. }

  • 相关阅读:
    系统集成项目管理总结(笔记)
    面试官:说说EventLoop事件循环、微任务、宏任务
    PHP代码审计系列(一)
    回文函数判断用
    GD32F4(10):GD32转RS422在115200下接收乱码分析
    python+django中小学课外知识在线学习网站pycharm
    微信小程序wxs标签 在wxml文件中编写JavaScript逻辑
    点成分享 | 当新冠病毒遇到器官芯片
    3个管理误区,新晋管理者一定要避免!
    数据结构——时间复杂度与空间复杂度
  • 原文地址:https://blog.csdn.net/cntianya/article/details/133885646