/****************************************************************************** * 文件名称: CardReader.cs * 文件说明: 读卡的封装,包括社保卡,身份证,电子凭证等等 * 当前版本: V1.0 * 创建日期: 2022-06-20 * * * 2020-06-20: 增加 CardReader 类 * ***** 2020-06-20: 增加 CardReader 方法,获取URL地址,USER信息,地方版HeaSecReadInfo.dll使用 * ***** 2020-06-20: 增加 CardReader 方法重载,国家版电子凭证使用 * ***** 2020-06-20: 增加 Init 方法,SSCard环境初始化 * ***** 2020-06-20: 增加 ReadCardBas 方法,读社保卡 * ***** 2020-06-20: 增加 VerifyPIN 方法,验证密码 * ***** 2020-06-20: 增加 ChangePIN 方法,修改密码 * ***** 2020-06-20: 增加 ReadSFZ 方法,读身份证 * ***** 2020-06-20: 增加 GetQRBase 方法,读二维码 * ***** 2020-06-20: 增加 NationEcTrans 方法,读电子凭证(国家版) ******************************************************************************/ using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using System.Runtime.InteropServices; using System.Text; using System.Threading.Tasks; using PTMedicalInsurance.Variables; using System.Windows.Forms; namespace PTMedicalInsurance.Common { class CardReader { const string DllPath = @"FastReportFrom.dll"; [DllImport("HeaSecReadInfo.dll", EntryPoint = "Init", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int Init(StringBuilder pInitInfo, StringBuilder pUser); [DllImport("HeaSecReadInfo.dll", EntryPoint = "ReadCardBas", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadCardBas(StringBuilder pCardInfo, StringBuilder pBusiCardInfo); [DllImport("HeaSecReadInfo.dll", EntryPoint = "VerifyPIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int VerifyPIN(StringBuilder pErrorMsg); [DllImport("HeaSecReadInfo.dll", EntryPoint = "ChangePIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ChangePIN(StringBuilder pErrorMsg); //电子凭证 [DllImport("NationECCode.dll", EntryPoint = "NationEcTrans", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern IntPtr NationEcTrans(StringBuilder strUrl, StringBuilder InData, StringBuilder OutData); private string InitInfo; private string User; public CardReader() { } public CardReader(string InitInfo, string User) { this.InitInfo = InitInfo; this.User = User; } public int Init() { string errMsg = ""; int result = -1; try { StringBuilder sbInitInfo = new StringBuilder(InitInfo); StringBuilder sbUSER = new StringBuilder(User); result = Init(sbInitInfo, sbUSER); return result; } catch (Exception ex) { errMsg = ex.Message; return result; } finally { Global.writeLog("初始化", InitInfo + ":" + User, result.ToString() + ":" + errMsg); } } public int ReadCardBas(out string CardInfo, out string BusiCardInfo) { CardInfo = ""; BusiCardInfo = ""; int rtn = -1; try { StringBuilder sbCardInfo = new StringBuilder(2048); StringBuilder sbBusiCardInfo = new StringBuilder(8192); rtn = ReadCardBas(sbCardInfo, sbBusiCardInfo); CardInfo = sbCardInfo.ToString(); BusiCardInfo = sbBusiCardInfo.ToString(); return rtn; } catch (Exception ex) { CardInfo = "ReadCardBas异常:" + ex.Message; return rtn; } finally { Global.writeLog("读社保卡(" + InitInfo + ")", CardInfo, BusiCardInfo); } } public int VerifyPIN(out string ErrMsg) { ErrMsg = ""; int rtn = -1; try { StringBuilder sbErrMsg = new StringBuilder(1024); rtn = VerifyPIN(sbErrMsg); ErrMsg = sbErrMsg.ToString(); return rtn; } catch (Exception ex) { ErrMsg = "VerifyPIN:" + ex.Message; return rtn; } } public int ChangePIN(out string outBuff) { outBuff = ""; int rtn = -1; try { StringBuilder sbOutBuff = new StringBuilder(1024); rtn = ChangePIN(sbOutBuff); outBuff = sbOutBuff.ToString(); return rtn; } catch (Exception ex) { outBuff = "ChangePIN:" + ex.Message; return rtn; } } public string NationEcTrans(string URL, string InData, out string OutData) { OutData = ""; try { StringBuilder sbURL = new StringBuilder(URL); StringBuilder sbInData = new StringBuilder(InData); StringBuilder sbOutData = new StringBuilder(1024); IntPtr pRtn = NationEcTrans(sbURL, sbInData, sbOutData); OutData = sbOutData.ToString(); string rtn = Marshal.PtrToStringAnsi(pRtn); return rtn; } catch (Exception ex) { OutData = "NationEcTrans 异常:" + ex.Message; return "-1"; } finally { Global.writeLog("电子凭证(" + URL + ")", InData, OutData); } } } class CardReaderInitInfo { public string IP; public string PORT; public string TIMEOUT; public string LOG_PATH; public string SFZ_DRIVER_TYPE; } }