/****************************************************************************** * 文件名称: 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; using PTMedicalInsurance.Entity.Local; using PTMedicalInsurance.Helper; using PTMedicalInsurance.Entity; namespace PTMedicalInsurance.Common { class CardReader { const string DllPath = @"HeaSecReadInfo.dll"; private static bool initilaized = false; [DllImport(DllPath, EntryPoint = "Init", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int Init(StringBuilder pInitInfo, StringBuilder pErrMsg); [DllImport(DllPath, EntryPoint = "ReadCardBas", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadCardBas(StringBuilder pCardInfo,StringBuilder pBusiCardInfo); [DllImport(DllPath, EntryPoint = "ReadSFZ", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern int ReadSFZ(StringBuilder pOutBuff, StringBuilder pOutBusiBuff); [DllImport(DllPath, EntryPoint = "DailySinIn", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern IntPtr DailySinIn(StringBuilder OutData); //电子凭证 [DllImport(DllPath, EntryPoint = "EcQuery", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] public static extern int NationEcTrans(StringBuilder InData, StringBuilder OutData); public CardReader() { CardReader.Init(); } public static int Init() { if (initilaized) return 0; string errMsg = ""; int result = -1; try { ReadCardInitInfo initInfo = new ReadCardInitInfo(); StringBuilder sbInitInfo = new StringBuilder(); StringBuilder sbUSER = new StringBuilder(4096); sbInitInfo.Append(JsonHelper.toJsonString(initInfo)); result = Init(sbInitInfo, sbUSER); initilaized = true; return result; } catch (Exception ex) { errMsg = ex.Message; return result; } finally { Global.writeLog("初始化","", result.ToString() + ":" + errMsg); } } /// /// 读社保卡 /// /// /// public int ReadCardBas(out string basInfo) { basInfo = ""; int rtn = -1; try { StringBuilder sbCardInfo = new StringBuilder(1024); StringBuilder sbBusiCardInfo = new StringBuilder(8192); rtn = ReadCardBas(sbCardInfo, sbBusiCardInfo); // 解析返回读卡信息 basInfo = parseCardInfo(sbCardInfo.ToString()); Global.pat.card.BusinessCode = sbBusiCardInfo.ToString(); return rtn; } catch (Exception ex) { basInfo = "ReadCardBas异常:" + ex.Message; return rtn; } finally { Global.writeLog("读社保卡", "",basInfo); } } /// /// 读身份证 /// /// /// public int ReadSFZ(out string OutBuff) { OutBuff = ""; int rtn = -1; try { StringBuilder sbOutBuff = new StringBuilder(10240); StringBuilder sbBusiCardBuff = new StringBuilder(10240); rtn = ReadSFZ(sbOutBuff, sbBusiCardBuff); // 解析返回读卡信息 OutBuff = parseCardInfo(sbOutBuff.ToString()); Global.pat.card.BusinessCode = sbBusiCardBuff.ToString(); return rtn; } catch (Exception ex) { OutBuff = "ReadSFZ 异常:" + ex.Message; return rtn; } } /// /// 解析读卡结果 /// /// /// private string parseCardInfo(string inBuff) { //卡类型、发卡地区行政区划代码(卡识别码前6位)、社会保障号码、卡号、卡识别码、姓名、卡复位信息(仅取历史字节)、规范版本、发卡日期、卡有效期、终端机编号、终端设备号。各数据项之间以“|”分割,且最后一个数据项以“|”结尾 string[] data = inBuff.Split("|".ToCharArray()); CardInfo card = new CardInfo(); card.certno = data[2]; card.cardno = data[3]; card.card_sn = data[4]; card.psn_name = data[5]; Global.pat.insuplc_admdvs = data[1]; //行政区划 Global.pat.card.SN = card.card_sn; Global.pat.certNO = card.certno; Global.pat.name = card.psn_name; Global.pat.card.NO = card.cardno; Global.pat.mdtrtcertNO = card.certno; string outParam = JsonHelper.toJsonString(card); Global.writeLog("读卡返回:", inBuff, outParam); return outParam; } //public string FastReportPrint(out string OutData) //{ // OutData = ""; // try // { // StringBuilder sbOutData = new StringBuilder(1024); // IntPtr pRtn = FastReportDll(sbOutData); // OutData = sbOutData.ToString(); // string rtn = Marshal.PtrToStringAnsi(pRtn); // return rtn; // } // catch (Exception ex) // { // OutData = "FastReportDll调用异常:" + ex.Message; // return "-1"; // } // finally // { // Global.writeLog("调用FastReportDll打印结算单)", "", OutData); // } //} } }