/****************************************************************************** * 文件名称: CardReader.cs * 文件说明: 读卡的封装,包括社保卡,身份证,电子凭证等等 * 当前版本: V1.0 * 创建日期: 2022-06-20 * * * 2020-06-20: 增加 CardReader 类 * ***** 2020-06-20: 增加 CardReader 方法,获取URL地址,USER信息,地方版SSCard.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 = @"D:\CardDLL\SSCard.dll"; [DllImport("SSCard.dll", EntryPoint = "Init", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int Init(StringBuilder pURL, StringBuilder pUser); [DllImport("SSCard.dll", EntryPoint = "ReadCardBas", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadCardBas(StringBuilder pOutBuff, int nOutBuffLen, StringBuilder pSignBuff, int nSignBuffLen); [DllImport("SSCard.dll", EntryPoint = "VerifyPIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int VerifyPIN(StringBuilder pOutBuff, int nOutBuffLen); [DllImport("SSCard.dll", EntryPoint = "ChangePIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ChangePIN(StringBuilder pOutBuff, int nOutBuffLen); [DllImport("SSCard.dll", EntryPoint = "ReadSFZ", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadSFZ(StringBuilder pOutBuff, int nOutBuffLen, StringBuilder pSignBuff, int nSignBuffLen); [DllImport("SSCard.dll", EntryPoint = "GetQRBase", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int GetQRBase(int nTimeout, StringBuilder pOutBuff, int nOutBuffLen, StringBuilder pSignBuff, int nSignBuffLen); //电子凭证 [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 URL; private string User; public CardReader() { } public CardReader(string URL, string User) { this.URL = URL; this.User = User; } public int Init() { string errMsg = ""; int result = -1; try { StringBuilder sbURL = new StringBuilder(URL); StringBuilder sbUSER = new StringBuilder(User); result = Init(sbURL, sbUSER); return result; } catch (Exception ex) { errMsg = ex.Message; return result; } finally { Global.writeLog("初始化", URL + ":" + User, result.ToString() + ":" + errMsg); } } public int ReadCardBas(out string basInfo, out string regInfo) { basInfo = ""; regInfo = ""; int rtn = -1; try { StringBuilder sbBasInfo = new StringBuilder(1024); StringBuilder sbRegInfo = new StringBuilder(1024); rtn = ReadCardBas(sbBasInfo, 1024, sbRegInfo, 1024); basInfo = sbBasInfo.ToString(); regInfo = sbRegInfo.ToString(); return rtn; } catch (Exception ex) { basInfo = "ReadCardBas异常:" + ex.Message; return rtn; } finally { Global.writeLog("读社保卡(" + URL + ")", regInfo, basInfo); } } public int VerifyPIN(out string outBuff) { outBuff = ""; int rtn = -1; try { StringBuilder sbOutBuff = new StringBuilder(1024); rtn = VerifyPIN(sbOutBuff, 1024); outBuff = sbOutBuff.ToString(); return rtn; } catch (Exception ex) { outBuff = "VerifyPIN:" + ex.Message; return rtn; } } public int ChangePIN(out string outBuff) { outBuff = ""; int rtn = -1; try { StringBuilder sbOutBuff = new StringBuilder(1024); rtn = ChangePIN(sbOutBuff, 1024); outBuff = sbOutBuff.ToString(); return rtn; } catch (Exception ex) { outBuff = "ChangePIN:" + ex.Message; return rtn; } } public int ReadSFZ(out string OutBuff, out string SignBuff) { OutBuff = ""; SignBuff = ""; int rtn = -1; try { StringBuilder sbOutBuff = new StringBuilder(1024); StringBuilder sbSignBuff = new StringBuilder(1024); rtn = ReadSFZ(sbOutBuff, 1024, sbSignBuff, 1024); OutBuff = sbOutBuff.ToString(); SignBuff = sbSignBuff.ToString(); return rtn; } catch (Exception ex) { OutBuff = "ReadSFZ 异常:" + ex.Message; return rtn; } } public int GetQRBase(int timeout, out string OutBuff, out string SignBuff) { OutBuff = ""; SignBuff = ""; int rtn = -1; try { StringBuilder sbOutBuff = new StringBuilder(1024); StringBuilder sbSignBuff = new StringBuilder(1024); rtn = GetQRBase(timeout, sbOutBuff, 1024, sbSignBuff, 1024); OutBuff = sbOutBuff.ToString(); SignBuff = sbSignBuff.ToString(); return rtn; } catch (Exception ex) { OutBuff = "GetQRBase 异常:" + 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 CardReader_HLJ { string progID = "SCardDriverHLJ.SCard"; System.Type ComType; object ComInstance; public CardReader_HLJ() { ComType = Type.GetTypeFromProgID(progID); // 创建Com的实例 if (ComType != null) { //创建实例 ComInstance = Activator.CreateInstance(ComType); } } public string readCardBas(int type, string hospNO) { if (ComType == null) { return "ComType为空!"; } if (ComInstance == null) { return "ComInstance为空!"; } try { //设置需要设置的参数值 object[] ParamArray = new object[2]; ParamArray[0] = type; ParamArray[1] = hospNO; ParameterModifier[] ParamMods = new ParameterModifier[1]; ParamMods[0] = new ParameterModifier(2); // 初始化为接口参数的个数 ParamMods[0][0] = true; ParamMods[0][1] = true; // 设置第二个参数为返回参数,调用含有ParameterModifier数组的重载函数 object o = ComType.InvokeMember("iReadCardBas", // 接口函数名 BindingFlags.Default | BindingFlags.InvokeMethod, null, ComInstance, // 调用的COM组件 ParamArray, // 参数数组 ParamMods, // 指定返回参数的ParameterModifier数组 null, null); //string Msg = "加载成功:" + ParamArray[1].ToString(); //Global.inf.writeLog(Msg + "___" + ParamArray[0].ToString()); return o.ToString(); } catch (Exception ex) { return "异常:" + ex.Message; } } } /// /// 河南读卡动态库调用 /// class CardReader_HN { //电子凭证 [DllImport("NationECCode.dll", EntryPoint = "NationEcTrans", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern IntPtr NationEcTrans(StringBuilder strUrl, StringBuilder InData, StringBuilder OutData); //社保卡-本地 [DllImport("SSCardDriver.dll", EntryPoint = "iReadCardBas", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadCardBas(int iType, StringBuilder pDevInfo, StringBuilder pOutInfo); //社保卡-异地1 [DllImport("SSCardDriver.dll", EntryPoint = "iReadCardBas_HSM_Step1", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadCardBas_HSM_Step1(int iType, StringBuilder pDevInfo, StringBuilder pOutInfo); //社保卡-异地2 [DllImport("SSCardDriver.dll", EntryPoint = "iReadCardBas_HSM_Step2", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadCardBas_HSM_Step2(StringBuilder pKey, StringBuilder pOutInfo); //社保卡-PIN校验 [DllImport("SSCardDriver.dll", EntryPoint = "iVerifyPIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int VerifyPIN(int iType, StringBuilder pOutInfo); public int ReadCardBas(int iType, string sDevInfo, out string sOutInfo) { sOutInfo = ""; int rtn = -1; try { StringBuilder bDevInfo = new StringBuilder(sDevInfo); StringBuilder bOutInfo = new StringBuilder(1024); rtn = ReadCardBas(iType, bDevInfo, bOutInfo); sOutInfo = bOutInfo.ToString(); return rtn; } catch (Exception ex) { sOutInfo = "ReadCardBas异常:" + ex.Message; return rtn; } finally { Global.writeLog("调用社保卡ReadCardBas函数:",sDevInfo, sOutInfo); } } public int VerifyPIN(int iType, out string sOutInfo) { sOutInfo = ""; int rtn = -1; try { StringBuilder bOutInfo = new StringBuilder(1024); rtn = VerifyPIN(iType, bOutInfo); sOutInfo = bOutInfo.ToString(); return rtn; } catch (Exception ex) { sOutInfo = "iVerifyPIN异常:" + ex.Message; return rtn; } finally { Global.writeLog("调用社保卡iVerifyPIN函数:", iType.ToString(), sOutInfo); } } public int ReadCardBas_HSM_Step1(int iType, string sDevInfo, out string sOutInfo) { sOutInfo = ""; int rtn = -1; try { StringBuilder bDevInfo = new StringBuilder(sDevInfo); StringBuilder bOutInfo = new StringBuilder(1024); rtn = ReadCardBas_HSM_Step1(iType, bDevInfo, bOutInfo); sOutInfo = bOutInfo.ToString(); return rtn; } catch (Exception ex) { sOutInfo = "ReadCardBas_HSM_Step1异常:" + ex.Message; return rtn; } finally { Global.writeLog("调用社保卡ReadCardBas_HSM_Step1函数:", iType+"|"+ sDevInfo, sOutInfo); } } public int ReadCardBas_HSM_Step2(string pKey, out string sOutInfo) { sOutInfo = ""; int rtn = -1; try { StringBuilder bPKey = new StringBuilder(pKey); StringBuilder bOutInfo = new StringBuilder(1024); rtn = ReadCardBas_HSM_Step2(bPKey, bOutInfo); sOutInfo = bOutInfo.ToString(); return rtn; } catch (Exception ex) { sOutInfo = "ReadCardBas_HSM_Step2异常:" + ex.Message; return rtn; } finally { Global.writeLog("调用社保卡ReadCardBas_HSM_Step2函数:", pKey, sOutInfo); } } 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(); //MessageBox.Show("电子凭证NationEcTrans返回的:" + pRtn); string rtn = Marshal.PtrToStringAnsi(pRtn); return rtn; } catch (Exception ex) { OutData = "NationEcTrans 异常:" + ex.Message; return ""; } finally { Global.writeLog("电子凭证(" + URL + ")", InData, OutData); } } } /// /// 陕西读卡动态库调用 /// class CardReader_SX { //电子凭证 [DllImport("NationECCode.dll", EntryPoint = "NationEcTrans", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern IntPtr NationEcTrans(StringBuilder strUrl, StringBuilder InData, StringBuilder OutData); //电子凭证 [DllImport("readcard.dll", EntryPoint = "Certificate", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern IntPtr Certificate(StringBuilder pname, StringBuilder paae011, StringBuilder porgId, StringBuilder paab034, StringBuilder pRetstr, StringBuilder perrinfo); //社保卡 [DllImport("readcard.dll", EntryPoint = "ReadSSECard_s", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadSSECard_s(StringBuilder pRetstr, StringBuilder perrinfo); //结算校验社保卡 [DllImport("readcard.dll", EntryPoint = "ReadydSSECard", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadydSSECard(StringBuilder pxfmx, StringBuilder paab034, StringBuilder pbaa001, StringBuilder pRetstr, StringBuilder perrinfo); //结算校验身份证 [DllImport("readcard.dll", EntryPoint = "readIDcard", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadIDcard(StringBuilder pidcard, StringBuilder pName, StringBuilder pRetstr, StringBuilder perrinfo); public int ReadCard(out string sRetstr, out string sErrinfo) { sRetstr = ""; sErrinfo = ""; int rtn = -1; try { StringBuilder pRetstr = new StringBuilder(1024); StringBuilder perrinfo = new StringBuilder(1024); rtn = ReadSSECard_s(pRetstr, perrinfo); sRetstr = pRetstr.ToString(); sErrinfo = perrinfo.ToString(); return rtn; } catch (Exception ex) { sErrinfo = "调用社保卡ReadSSECard_s函数异常:" + ex.Message; return rtn; } finally { Global.writeLog("调用社保卡ReadSSECard_s函数:", "", sRetstr); } } public int ReaddCard_JS(string sXFMX, out string sRetstr, out string sErrinfo) { sRetstr = ""; sErrinfo = ""; int rtn = -1; try { StringBuilder xfmx = new StringBuilder(sXFMX); StringBuilder aab034 = new StringBuilder(Global.pat.mdtrtarea_admvs); StringBuilder baa001 = new StringBuilder(Global.pat.insuplc_admdvs); StringBuilder pRetstr = new StringBuilder(1024); StringBuilder perrinfo = new StringBuilder(1024); rtn = ReadydSSECard(xfmx, aab034, baa001, pRetstr, perrinfo); sRetstr = pRetstr.ToString(); sErrinfo = perrinfo.ToString(); return rtn; } catch (Exception ex) { sErrinfo = "调用社保卡ReadydSSECard函数异常:" + ex.Message; return rtn; } finally { Global.writeLog("调用社保卡ReadydSSECard函数:", sXFMX, sRetstr); } } public int ReadIDcard_JS(string sSFZH,string sXM, out string sRetstr, out string sErrinfo) { sRetstr = ""; sErrinfo = ""; int rtn = -1; try { StringBuilder xSFZH = new StringBuilder(sSFZH); StringBuilder xXM = new StringBuilder(sXM); StringBuilder pRetstr = new StringBuilder(1024); StringBuilder perrinfo = new StringBuilder(1024); rtn = ReadIDcard(xSFZH, xXM, pRetstr, perrinfo); sRetstr = pRetstr.ToString(); sErrinfo = perrinfo.ToString(); return rtn; } catch (Exception ex) { sErrinfo = "调用身份证ReadIDCard函数异常:" + ex.Message; return rtn; } finally { Global.writeLog("调用身份证ReadIDCard函数:", sXM + sSFZH, sRetstr); } } 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(); //MessageBox.Show("电子凭证NationEcTrans返回的:" + pRtn); string rtn = Marshal.PtrToStringAnsi(pRtn); return rtn; } catch (Exception ex) { OutData = "NationEcTrans 异常:" + ex.Message; return ""; } finally { Global.writeLog("电子凭证(" + URL + ")", InData, OutData); } } public int CertDecode(string name, string aae011, string orgId, string aab034, out string Retstr, out string errinfo) { Retstr = ""; errinfo = ""; try { StringBuilder sName = new StringBuilder(name); StringBuilder sAae011 = new StringBuilder(aae011); StringBuilder sOrgId = new StringBuilder(orgId); StringBuilder sAab034 = new StringBuilder(aab034); StringBuilder sRetstr = new StringBuilder(1024); StringBuilder sErrinfo = new StringBuilder(1024); //MessageBox.Show(sName.ToString() + sAae011.ToString() + sOrgId.ToString() + sAab034.ToString()); IntPtr pRtn = Certificate(sName, sAae011, sOrgId, sAab034, sRetstr, sErrinfo); Retstr = sRetstr.ToString(); errinfo = sErrinfo.ToString(); //MessageBox.Show("电子凭证Certificate返回的:" + pRtn); if ((pRtn.ToString() == "0") && (errinfo == "") && (Retstr != "")) return 0; else return -1; //string rtn = Marshal.PtrToStringAnsi(pRtn); //return int.Parse(rtn); } catch (Exception ex) { Retstr = "Certificate 异常:" + ex.Message; return -1; } finally { Global.writeLog("电子凭证Certificate", name + "|" + aae011 + "|" + orgId + "|" + aab034, "sCardInfo:" + Retstr + "|" + "Error:" + errinfo); } } } }