CardReader.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. /******************************************************************************
  2. * 文件名称: CardReader.cs
  3. * 文件说明: 读卡的封装,包括社保卡,身份证,电子凭证等等
  4. * 当前版本: V1.0
  5. * 创建日期: 2022-06-20
  6. *
  7. * * 2020-06-20: 增加 CardReader 类
  8. * ***** 2020-06-20: 增加 CardReader 方法,获取URL地址,USER信息,地方版SSCard.dll使用
  9. * ***** 2020-06-20: 增加 CardReader 方法重载,国家版电子凭证使用
  10. * ***** 2020-06-20: 增加 Init 方法,SSCard环境初始化
  11. * ***** 2020-06-20: 增加 ReadCardBas 方法,读社保卡
  12. * ***** 2020-06-20: 增加 VerifyPIN 方法,验证密码
  13. * ***** 2020-06-20: 增加 ChangePIN 方法,修改密码
  14. * ***** 2020-06-20: 增加 ReadSFZ 方法,读身份证
  15. * ***** 2020-06-20: 增加 GetQRBase 方法,读二维码
  16. * ***** 2020-06-20: 增加 NationEcTrans 方法,读电子凭证(国家版)
  17. ******************************************************************************/
  18. using System;
  19. using System.Collections.Generic;
  20. using System.Linq;
  21. using System.Reflection;
  22. using System.Runtime.InteropServices;
  23. using System.Text;
  24. using System.Threading.Tasks;
  25. using PTMedicalInsurance.Variables;
  26. namespace PTMedicalInsurance.Common
  27. {
  28. class CardReader
  29. {
  30. [DllImport("SSCard.dll", EntryPoint = "Init", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  31. static extern int Init(StringBuilder pURL, StringBuilder pUser);
  32. [DllImport("SSCard.dll", EntryPoint = "ReadCardBasGZ", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  33. static extern int ReadCardBas(StringBuilder pOutBuff, int nOutBuffLen, StringBuilder pSignBuff, int nSignBuffLen);
  34. [DllImport("SSCard.dll", EntryPoint = "ReadMedicalCardGZ", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  35. static extern int ReadMedicalCardGZ(StringBuilder pOutBuff, int nOutBuffLen, StringBuilder pSignBuff, int nSignBuffLen);
  36. [DllImport("SSCard.dll", EntryPoint = "VerifyPIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  37. static extern int VerifyPIN(StringBuilder pOutBuff, int nOutBuffLen);
  38. [DllImport("SSCard.dll", EntryPoint = "ChangePIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  39. static extern int ChangePIN(StringBuilder pOutBuff, int nOutBuffLen);
  40. [DllImport("SSCard.dll", EntryPoint = "ReadIDCardGZ", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  41. static extern int ReadSFZ(StringBuilder pOutBuff, int nOutBuffLen, StringBuilder pSignBuff, int nSignBuffLen);
  42. [DllImport("SSCard.dll", EntryPoint = "GetTwoBarCodes", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  43. static extern int GetQRBase(int nTimeout, StringBuilder pOutBuff, int nOutBuffLen, StringBuilder pSignBuff, int nSignBuffLen);
  44. //电子凭证
  45. [DllImport("NationECCode.dll", EntryPoint = "NationEcTrans", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  46. static extern IntPtr NationEcTrans(StringBuilder strUrl, StringBuilder InData, StringBuilder OutData);
  47. //SSCARDInterface.dll
  48. [DllImport("SSCARDInterface.dll", EntryPoint = "SetAutoQRcode", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  49. static extern int SetAutoQRcode(StringBuilder pOutBuff);
  50. [DllImport("SSCARDInterface.dll", EntryPoint = "CloseAutoQRcode", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  51. static extern int CloseAutoQRcode(StringBuilder pOutBuff);
  52. [DllImport("SSCARDInterface.dll", EntryPoint = "iOpenPort", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  53. static extern int iOpenPort(StringBuilder pOutBuff);
  54. [DllImport("SSCARDInterface.dll", EntryPoint = "iClosePort", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  55. static extern int iClosePort(StringBuilder pOutBuff);
  56. private string URL;
  57. private string User;
  58. public CardReader()
  59. {
  60. }
  61. public CardReader(string URL, string User)
  62. {
  63. this.URL = URL;
  64. this.User = User;
  65. }
  66. public int Init()
  67. {
  68. string errMsg = "";
  69. int result = -1;
  70. try
  71. {
  72. StringBuilder sbURL = new StringBuilder(URL);
  73. StringBuilder sbUSER = new StringBuilder(User);
  74. result = Init(sbURL, sbUSER);
  75. return result;
  76. }
  77. catch (Exception ex)
  78. {
  79. errMsg = ex.Message;
  80. return result;
  81. }
  82. finally
  83. {
  84. Global.writeLog("初始化", URL + ":" + User, result.ToString() + ":" + errMsg);
  85. }
  86. }
  87. public int ReadCardBas(out string basInfo, out string regInfo)
  88. {
  89. basInfo = ""; regInfo = "";
  90. int rtn = -1;
  91. try
  92. {
  93. StringBuilder sbBasInfo = new StringBuilder(1024);
  94. StringBuilder sbRegInfo = new StringBuilder(1024);
  95. rtn = ReadCardBas(sbBasInfo, 1024, sbRegInfo, 1024);
  96. basInfo = sbBasInfo.ToString();
  97. regInfo = sbRegInfo.ToString();
  98. return rtn;
  99. }
  100. catch (Exception ex)
  101. {
  102. basInfo = "ReadCardBas异常:" + ex.Message;
  103. return rtn;
  104. }
  105. finally
  106. {
  107. Global.writeLog("读社保卡(" + URL + ")", regInfo, basInfo);
  108. }
  109. }
  110. public int VerifyPIN(out string outBuff)
  111. {
  112. outBuff = "";
  113. int rtn = -1;
  114. try
  115. {
  116. StringBuilder sbOutBuff = new StringBuilder(10240);
  117. rtn = VerifyPIN(sbOutBuff, 1024);
  118. outBuff = sbOutBuff.ToString();
  119. return rtn;
  120. }
  121. catch (Exception ex)
  122. {
  123. outBuff = "VerifyPIN:" + ex.Message;
  124. return rtn;
  125. }
  126. }
  127. public int ChangePIN(out string outBuff)
  128. {
  129. outBuff = "";
  130. int rtn = -1;
  131. try
  132. {
  133. StringBuilder sbOutBuff = new StringBuilder(10240);
  134. rtn = ChangePIN(sbOutBuff, 1024);
  135. outBuff = sbOutBuff.ToString();
  136. return rtn;
  137. }
  138. catch (Exception ex)
  139. {
  140. outBuff = "ChangePIN:" + ex.Message;
  141. return rtn;
  142. }
  143. }
  144. public int ReadSFZ(out string OutBuff, out string SignBuff)
  145. {
  146. OutBuff = ""; SignBuff = "";
  147. int rtn = -1;
  148. try
  149. {
  150. StringBuilder sbOutBuff = new StringBuilder(10240);
  151. StringBuilder sbSignBuff = new StringBuilder(10240);
  152. rtn = ReadSFZ(sbOutBuff, 1024, sbSignBuff, 1024);
  153. OutBuff = sbOutBuff.ToString();
  154. SignBuff = sbSignBuff.ToString();
  155. return rtn;
  156. }
  157. catch (Exception ex)
  158. {
  159. OutBuff = "ReadSFZ 异常:" + ex.Message;
  160. return rtn;
  161. }
  162. }
  163. public int GetQRBase(out int timeout, out string OutBuff, out string SignBuff)
  164. {
  165. OutBuff = ""; SignBuff = "";
  166. timeout = 10;
  167. int rtn = -1;
  168. try
  169. {
  170. StringBuilder sbOutBuff = new StringBuilder(10240);
  171. StringBuilder sbSignBuff = new StringBuilder(10240);
  172. rtn = GetQRBase(timeout, sbOutBuff, 1024, sbSignBuff, 1024);
  173. OutBuff = sbOutBuff.ToString();
  174. SignBuff = sbSignBuff.ToString();
  175. Global.writeLog("GetQRBase:(" + URL + ")(" + User + ")", "OutBuff:" + OutBuff , "SignBuff" + SignBuff);
  176. return rtn;
  177. }
  178. catch (Exception ex)
  179. {
  180. OutBuff = "GetQRBase 异常:" + ex.Message;
  181. return rtn;
  182. }
  183. }
  184. public string NationEcTrans(string URL, string InData, out string OutData)
  185. {
  186. OutData = "";
  187. try
  188. {
  189. StringBuilder sbURL = new StringBuilder(URL);
  190. StringBuilder sbInData = new StringBuilder(InData);
  191. StringBuilder sbOutData = new StringBuilder(10240);
  192. IntPtr pRtn = NationEcTrans(sbURL, sbInData, sbOutData);
  193. OutData = sbOutData.ToString();
  194. string rtn = Marshal.PtrToStringAnsi(pRtn);
  195. return rtn;
  196. }
  197. catch (Exception ex)
  198. {
  199. OutData = "NationEcTrans 异常:" + ex.Message;
  200. return "-1";
  201. }
  202. finally
  203. {
  204. Global.writeLog("电子凭证(" + URL + ")", InData, OutData);
  205. }
  206. }
  207. public int SetAutoQRcode(out string errMsg)
  208. {
  209. errMsg = "";
  210. int rtn = -1;
  211. try
  212. {
  213. StringBuilder sbOutBuff = new StringBuilder(10240);
  214. rtn = SetAutoQRcode(sbOutBuff);
  215. errMsg = sbOutBuff.ToString();
  216. return rtn;
  217. }
  218. catch (Exception ex)
  219. {
  220. errMsg = "SetAutoQRcode 异常:" + ex.Message;
  221. return rtn;
  222. }
  223. finally
  224. {
  225. Global.writeLog("SetAutoQRcode", "",errMsg);
  226. }
  227. }
  228. public int CloseAutoQRcode(out string errMsg)
  229. {
  230. errMsg = "";
  231. int rtn = -1;
  232. try
  233. {
  234. StringBuilder sbOutBuff = new StringBuilder(10240);
  235. rtn = CloseAutoQRcode(sbOutBuff);
  236. errMsg = sbOutBuff.ToString();
  237. return rtn;
  238. }
  239. catch (Exception ex)
  240. {
  241. errMsg = "CloseAutoQRcode 异常:" + ex.Message;
  242. return rtn;
  243. }
  244. finally
  245. {
  246. Global.writeLog("CloseAutoQRcode", rtn.ToString(), errMsg);
  247. }
  248. }
  249. public int iOpenPort(out string errMsg)
  250. {
  251. errMsg = "";
  252. int rtn = -1;
  253. try
  254. {
  255. StringBuilder sbOutBuff = new StringBuilder(10240);
  256. rtn = iOpenPort(sbOutBuff);
  257. errMsg = sbOutBuff.ToString();
  258. return rtn;
  259. }
  260. catch (Exception ex)
  261. {
  262. errMsg = "iOpenPort 异常:" + ex.Message;
  263. return rtn;
  264. }
  265. finally
  266. {
  267. Global.writeLog("iOpenPort", rtn.ToString(), errMsg);
  268. }
  269. }
  270. public int iClosePort(out string errMsg)
  271. {
  272. errMsg = "";
  273. int rtn = -1;
  274. try
  275. {
  276. StringBuilder sbOutBuff = new StringBuilder(10240);
  277. rtn = iClosePort(sbOutBuff);
  278. errMsg = sbOutBuff.ToString();
  279. return rtn;
  280. }
  281. catch (Exception ex)
  282. {
  283. errMsg = "iClosePort 异常:" + ex.Message;
  284. return rtn;
  285. }
  286. finally
  287. {
  288. Global.writeLog("iClosePort", rtn.ToString(), errMsg);
  289. }
  290. }
  291. }
  292. class CardReader_HLJ
  293. {
  294. string progID = "SCardDriverHLJ.SCard";
  295. System.Type ComType;
  296. object ComInstance;
  297. public CardReader_HLJ()
  298. {
  299. ComType = Type.GetTypeFromProgID(progID);
  300. // 创建Com的实例
  301. if (ComType != null)
  302. {
  303. //创建实例
  304. ComInstance = Activator.CreateInstance(ComType);
  305. }
  306. }
  307. public string readCardBas(int type, string hospNO)
  308. {
  309. if (ComType == null)
  310. {
  311. return "ComType为空!";
  312. }
  313. if (ComInstance == null)
  314. {
  315. return "ComInstance为空!";
  316. }
  317. try
  318. {
  319. //设置需要设置的参数值
  320. object[] ParamArray = new object[2];
  321. ParamArray[0] = type;
  322. ParamArray[1] = hospNO;
  323. ParameterModifier[] ParamMods = new ParameterModifier[1];
  324. ParamMods[0] = new ParameterModifier(2); // 初始化为接口参数的个数
  325. ParamMods[0][0] = true;
  326. ParamMods[0][1] = true; // 设置第二个参数为返回参数,调用含有ParameterModifier数组的重载函数
  327. object o = ComType.InvokeMember("iReadCardBas", // 接口函数名
  328. BindingFlags.Default | BindingFlags.InvokeMethod,
  329. null,
  330. ComInstance, // 调用的COM组件
  331. ParamArray, // 参数数组
  332. ParamMods, // 指定返回参数的ParameterModifier数组
  333. null,
  334. null);
  335. //string Msg = "加载成功:" + ParamArray[1].ToString();
  336. //GlobalVariables.writeLog(Msg + "___" + ParamArray[0].ToString());
  337. return o.ToString();
  338. }
  339. catch (Exception ex)
  340. {
  341. return "异常:" + ex.Message;
  342. }
  343. }
  344. //验密
  345. public string VerifyPIN(int type, string password,string hospNO)
  346. {
  347. string psw = password + "|" + password + "|";
  348. string rtn = "";
  349. if (ComType == null)
  350. {
  351. return "ComType为空!";
  352. }
  353. if (ComInstance == null)
  354. {
  355. return "ComInstance为空!";
  356. }
  357. try
  358. {
  359. //设置需要设置的参数值
  360. object[] ParamArray = new object[3];
  361. ParamArray[0] = type;
  362. ParamArray[1] = psw;
  363. ParamArray[2] = hospNO;
  364. ParameterModifier[] ParamMods = new ParameterModifier[1];
  365. ParamMods[0] = new ParameterModifier(3); // 初始化为接口参数的个数
  366. //ParamMods[0][0] = true;
  367. //ParamMods[0][1] = true; //
  368. //ParamMods[0][2] = true;
  369. object o = ComType.InvokeMember("iVerifyPIN", // 接口函数名
  370. BindingFlags.Default | BindingFlags.InvokeMethod,
  371. null,
  372. ComInstance, // 调用的COM组件
  373. ParamArray, // 参数数组
  374. ParamMods, // 指定返回参数的ParameterModifier数组
  375. null,
  376. null);
  377. //string Msg = "加载成功:" + ParamArray[1].ToString();
  378. //GlobalVariables.writeLog(Msg + "___" + ParamArray[0].ToString());
  379. rtn = o.ToString();
  380. return rtn;
  381. }
  382. catch (Exception ex)
  383. {
  384. rtn = "异常:" + ex.Message;
  385. return rtn;
  386. }
  387. finally
  388. {
  389. Global.writeLog("VerifyPIN", type.ToString() + ":" + psw + ":" + hospNO, rtn);
  390. }
  391. }
  392. }
  393. }