CardReader.cs 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190
  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信息,地方版HeaSecReadInfo.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. using System.Windows.Forms;
  27. namespace PTMedicalInsurance.Common
  28. {
  29. class CardReader
  30. {
  31. const string DllPath = @"FastReportFrom.dll";
  32. [DllImport("HeaSecReadInfo.dll", EntryPoint = "Init", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  33. static extern int Init(StringBuilder pInitInfo, StringBuilder pUser);
  34. [DllImport("HeaSecReadInfo.dll", EntryPoint = "ReadCardBas", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  35. static extern int ReadCardBas(StringBuilder pCardInfo, StringBuilder pBusiCardInfo);
  36. [DllImport("HeaSecReadInfo.dll", EntryPoint = "VerifyPIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  37. static extern int VerifyPIN(StringBuilder pErrorMsg);
  38. [DllImport("HeaSecReadInfo.dll", EntryPoint = "ChangePIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  39. static extern int ChangePIN(StringBuilder pErrorMsg);
  40. //电子凭证
  41. [DllImport("NationECCode.dll", EntryPoint = "NationEcTrans", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  42. static extern IntPtr NationEcTrans(StringBuilder strUrl, StringBuilder InData, StringBuilder OutData);
  43. private string InitInfo;
  44. private string User;
  45. public CardReader()
  46. {
  47. }
  48. public CardReader(string InitInfo, string User)
  49. {
  50. this.InitInfo = InitInfo;
  51. this.User = User;
  52. }
  53. public int Init()
  54. {
  55. string errMsg = "";
  56. int result = -1;
  57. try
  58. {
  59. StringBuilder sbInitInfo = new StringBuilder(InitInfo);
  60. StringBuilder sbUSER = new StringBuilder(User);
  61. result = Init(sbInitInfo, sbUSER);
  62. return result;
  63. }
  64. catch (Exception ex)
  65. {
  66. errMsg = ex.Message;
  67. return result;
  68. }
  69. finally
  70. {
  71. Global.writeLog("初始化", InitInfo + ":" + User, result.ToString() + ":" + errMsg);
  72. }
  73. }
  74. public int ReadCardBas(out string CardInfo, out string BusiCardInfo)
  75. {
  76. CardInfo = ""; BusiCardInfo = "";
  77. int rtn = -1;
  78. try
  79. {
  80. StringBuilder sbCardInfo = new StringBuilder(2048);
  81. StringBuilder sbBusiCardInfo = new StringBuilder(8192);
  82. rtn = ReadCardBas(sbCardInfo, sbBusiCardInfo);
  83. CardInfo = sbCardInfo.ToString();
  84. BusiCardInfo = sbBusiCardInfo.ToString();
  85. return rtn;
  86. }
  87. catch (Exception ex)
  88. {
  89. CardInfo = "ReadCardBas异常:" + ex.Message;
  90. return rtn;
  91. }
  92. finally
  93. {
  94. Global.writeLog("读社保卡(" + InitInfo + ")", CardInfo, BusiCardInfo);
  95. }
  96. }
  97. public int VerifyPIN(out string ErrMsg)
  98. {
  99. ErrMsg = "";
  100. int rtn = -1;
  101. try
  102. {
  103. StringBuilder sbErrMsg = new StringBuilder(1024);
  104. rtn = VerifyPIN(sbErrMsg);
  105. ErrMsg = sbErrMsg.ToString();
  106. return rtn;
  107. }
  108. catch (Exception ex)
  109. {
  110. ErrMsg = "VerifyPIN:" + ex.Message;
  111. return rtn;
  112. }
  113. }
  114. public int ChangePIN(out string outBuff)
  115. {
  116. outBuff = "";
  117. int rtn = -1;
  118. try
  119. {
  120. StringBuilder sbOutBuff = new StringBuilder(1024);
  121. rtn = ChangePIN(sbOutBuff);
  122. outBuff = sbOutBuff.ToString();
  123. return rtn;
  124. }
  125. catch (Exception ex)
  126. {
  127. outBuff = "ChangePIN:" + ex.Message;
  128. return rtn;
  129. }
  130. }
  131. public string NationEcTrans(string URL, string InData, out string OutData)
  132. {
  133. OutData = "";
  134. try
  135. {
  136. StringBuilder sbURL = new StringBuilder(URL);
  137. StringBuilder sbInData = new StringBuilder(InData);
  138. StringBuilder sbOutData = new StringBuilder(1024);
  139. IntPtr pRtn = NationEcTrans(sbURL, sbInData, sbOutData);
  140. OutData = sbOutData.ToString();
  141. string rtn = Marshal.PtrToStringAnsi(pRtn);
  142. return rtn;
  143. }
  144. catch (Exception ex)
  145. {
  146. OutData = "NationEcTrans 异常:" + ex.Message;
  147. return "-1";
  148. }
  149. finally
  150. {
  151. Global.writeLog("电子凭证(" + URL + ")", InData, OutData);
  152. }
  153. }
  154. }
  155. class CardReaderInitInfo
  156. {
  157. public string IP;
  158. public string PORT;
  159. public string TIMEOUT;
  160. public string LOG_PATH;
  161. public string SFZ_DRIVER_TYPE;
  162. }
  163. }