/****************************************************************************** * 文件名称: 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 PTMedicalInsurance.Helper; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System.Windows.Forms; using Sunny.UI; using System.Security.Policy; using System.IO; namespace PTMedicalInsurance.Common { class CardReader { private string URL; private string User; public CardReader() { } public CardReader(string URL, string User) { this.URL = URL; this.User = User; } 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); 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 ChangChun_DRG { //长春市DRG付费管理 #region【长春东软DRG微服务版动态库相关调用】 [DllImport("HmaSiInterface.dll", EntryPoint = "INIT", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern int INIT_DRG(ref StringBuilder pErrMsg); //BASE64 编码函数 [DllImport("HmaSiInterface.dll", EntryPoint = "PASCAL EXPORT FileToBase64", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern int PASCALEXPORTFileToBase64_DRG(StringBuilder filePath, ref StringBuilder OutData, int len); //交易函数 [DllImport("HmaSiInterface.dll", EntryPoint = "BUSINESS_HANDLE", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] public static extern int BUSINESS_HANDLE_DRG(string InData, StringBuilder OutData); /// /// DRG动态库初始化-INIT /// /// /// public int Init_DRG(out string Msg) { string errMsg = ""; Msg = ""; int rnt = -1; JObject joRtn = new JObject(); try { StringBuilder sbReMsg = new StringBuilder(2048); rnt = INIT_DRG(ref sbReMsg); Msg = sbReMsg.ToString(); return rnt; } catch (Exception ex) { if (joRtn["infcode"] == null) { joRtn.Add("infcode", -1); } if (joRtn["err_msg"] == null) { joRtn.Add("err_msg", "INIT_DRG异常:" + ex.Message); } Msg = JsonHelper.Compress(joRtn); return rnt; } finally { Global.writeLog("Init_DRG初始化", "", rnt.ToString() + ": 无入参!"); } } /// /// DRG动态库交易函数调用-BUSINESS_HANDLE /// /// /// /// public int Business_DRG(string Input, out string OutPut) { string errMsg = ""; OutPut = ""; int rnt = -1; JObject joRtn = new JObject(); try { StringBuilder sbOutInfo = new StringBuilder(1024); MessageBox.Show("业务入参:"+Input); rnt = BUSINESS_HANDLE_DRG(Input, sbOutInfo); MessageBox.Show("返回值:"+ rnt.ToString()+ ", "+sbOutInfo.ToString()); OutPut = sbOutInfo.ToString(); return rnt; } catch (Exception ex) { if (joRtn["infcode"] == null) { joRtn.Add("infcode", -1); } if (joRtn["err_msg"] == null) { joRtn.Add("err_msg", "BUSINESS_HANDLE_DRG异常:" + ex.Message); } OutPut = JsonHelper.Compress(joRtn); return rnt; } finally { Global.writeLog("BUSINESS_HANDLE_DRG业务调用", Input, OutPut); } } /// /// DRG动态库交易函数调用-BUSINESS_HANDLE /// /// /// /// /// public int FileToBase64_DRG(string filePath, out string OutPut, int DataLen) { string errMsg = ""; OutPut = ""; int rnt = -1, retLen = 0; JObject joRtn = new JObject(); try { StringBuilder sbInputInfo = new StringBuilder(filePath); StringBuilder sbOutInfo = new StringBuilder(1024); retLen = DataLen; rnt = PASCALEXPORTFileToBase64_DRG(sbInputInfo, ref sbOutInfo, retLen); OutPut = sbOutInfo.ToString(); return rnt; } catch (Exception ex) { if (joRtn["infcode"] == null) { joRtn.Add("infcode", -1); } if (joRtn["err_msg"] == null) { joRtn.Add("err_msg", "PASCALEXPORTFileToBase64_DRG异常:" + ex.Message); } OutPut = JsonHelper.Compress(joRtn); return rnt; } finally { Global.writeLog("PASCALEXPORTFileToBase64_DRG业务调用", filePath, OutPut); } } #endregion } class CardReader_JIL { //吉林基线版东软读卡 #region //初始化 [DllImport("HeaSecReadInfo.dll", EntryPoint = "Init", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern int Init([MarshalAs(UnmanagedType.LPArray)] byte[] pInitInfo, [MarshalAs(UnmanagedType.LPArray)] byte[] pErrMsg); [DllImport("HeaSecReadInfo.dll", EntryPoint = "ReadCardBas", CharSet = CharSet.Auto, CallingConvention = CallingConvention.Cdecl)] public static extern int ReadCardBas([MarshalAs(UnmanagedType.LPArray)] byte[] pCardInfo, [MarshalAs(UnmanagedType.LPArray)] byte[] pBusiCardInfo); //[DllImport("NationECCode.dll", EntryPoint = "NationEcTrans", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] //public static extern long NationEcTrans(string strUrl, string InData, [MarshalAs(UnmanagedType.LPArray)] byte[] OutData); [DllImport("NationECCode.dll", EntryPoint = "NationEcTrans", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] static extern IntPtr NationEcTrans(StringBuilder strUrl, StringBuilder InData, StringBuilder OutData); [DllImport("HeaSecReadInfo.dll", EntryPoint = "VerifyPIN", CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)] public static extern int VerifyPIN([MarshalAs(UnmanagedType.LPArray)] byte[] pOutBuff); [DllImport("HeaSecReadInfo.dll", EntryPoint = "ReadSFZ", CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] public static extern int ReadSFZ([MarshalAs(UnmanagedType.LPArray)] byte[] pPath, [MarshalAs(UnmanagedType.LPArray)] byte[] pOutBuff, [MarshalAs(UnmanagedType.LPArray)] byte[] pOutBusiBuff); [DllImport("HeaSecReadInfo.dll", EntryPoint = "GetClientID", CharSet = CharSet.Auto, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] public static extern int GetClientID([MarshalAs(UnmanagedType.LPArray)] byte[] pOutBuff); // [DllImport("NationECCode.dll", EntryPoint = "NationEcTrans", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.StdCall)] // public static extern long NationEcTrans([MarshalAs(UnmanagedType.LPArray)] byte[] strUrl, [MarshalAs(UnmanagedType.LPArray)] byte[] InData, [MarshalAs(UnmanagedType.LPArray)] byte[] OutData); #endregion public int initCard() { int rtn = 0; try { string str = "{\"IP\":\"ddjk.jlhs.gov.cn\",\"PORT\":20215,\"TIMEOUT\":60,\"LOG_PATH\":\"C:/neu_log/\",\"SFZ_DRIVER_TYPE\":1}"; byte[] input = System.Text.Encoding.Default.GetBytes(str); byte[] output = new byte[300]; rtn = Init(input, output); } catch (Exception e) { rtn = -1; MessageBox.Show(e.Message); } return rtn; } public int readCard(out string Instr, out string outstr) { int rtn = 0; Instr = ""; outstr = ""; try { if (initCard() != 0) { rtn = -1; return rtn; } byte[] rin = new byte[500]; byte[] rout = new byte[500]; if (ReadCardBas(rin, rout) != 0) { rtn = -1; MessageBox.Show(System.Text.Encoding.Default.GetString(rin)); return rtn; } Instr = System.Text.Encoding.Default.GetString(rin); outstr = System.Text.Encoding.Default.GetString(rout); } catch (Exception e) { rtn = -1; MessageBox.Show(e.Message); } return rtn; } //读身份证 public int readSFZ(out string Instr, out string outstr) { int rtn = 0; Instr = ""; outstr = ""; string pth = @"D:/"; try { if (initCard() != 0) { rtn = -1; return rtn; } byte[] Pth = new byte[500]; byte[] rin = new byte[500]; byte[] rout = new byte[500]; Pth = System.Text.Encoding.Default.GetBytes(pth); if (ReadSFZ(Pth,rin, rout) != 0) { rtn = -1; MessageBox.Show(System.Text.Encoding.Default.GetString(rin)); return rtn; } Instr = System.Text.Encoding.Default.GetString(rin); outstr = System.Text.Encoding.Default.GetString(rout); } catch (Exception e) { rtn = -1; MessageBox.Show(e.Message); } return rtn; } public int getCid(out string outstr) { int rtn = 0; outstr = ""; try { if (initCard() != 0) { rtn = -1; return rtn; } byte[] rout = new byte[500]; GetClientID(rout); outstr = System.Text.Encoding.Default.GetString(rout); } catch (Exception e) { rtn = -1; MessageBox.Show(e.Message); } return rtn; } //public int InsuQRCodeQuery(string url,string instr,out string outpar) //{ // int rtn = 0; // string data = "{\"data\": {\"operatorId\": \"008\", \"operatorName\": \"TEST\", \"officeId\": \"01\",\"officeName\": \"内科\",\"orgId\": \"1234567\",\"businessType\": \"01101\", \"deviceType\": \"SelfService\"},\"orgId\": \"1234567\",\"transType\": \"ec.query\"}"; // url = ""; // JObject input = new JObject(); // byte[] str = new byte[500]; // //outstr = ""; // try // { // NationEcTrans(url, data, str); // outpar = System.Text.Encoding.Default.GetString(str); // dynamic outputObj = Newtonsoft.Json.JsonConvert.DeserializeObject(outpar); // MessageBox.Show(outpar); // } // catch (Exception e) // { // rtn = -1; MessageBox.Show(e.Message); // outpar = ""; // } // return rtn; //} public string InsuQRCodeQuery(string URL, string InData, out string OutData) { // MessageBox.Show("进入医保电子凭读卡"); // MessageBox.Show("入参:" + URL + ":" + InData); OutData = ""; try { StringBuilder sbURL = new StringBuilder(URL); StringBuilder sbInData = new StringBuilder(InData); StringBuilder sbOutData = new StringBuilder(2048); 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); } } //public string InsuQRCodeQuery(string url, string instr, out string outpar) //{ // string code = "0", message = "成功", outResult = ""; // //dynamic inputEmpParamsObj = Newtonsoft.Json.JsonConvert.DeserializeObject(inParams); // int initFlag = 0; // MessageBox.Show("进入医保电子凭读卡"); // MessageBox.Show("入参:"+ url + ":"+ instr); // try // { // MessageBox.Show("进入try"); // //string strUrl = inputEmpParamsObj.url.ToString(); // "http://10.38.22.15:8081/localcfc/api/hsecfc/localQrCodeQuery"; // string strUrl = url; // byte[] strUrlData = System.Text.Encoding.Default.GetBytes(strUrl); // //string inputStr = inputEmpParamsObj.inputData.ToString(); // string inputStr = instr; // //"{\"data\":{\"businessType\":\"01101\",\"deviceType\":\"\",\"officeId\":\"32760\",\"officeName\":\"消化内科\",\"operatorId\":\"test001\",\"operatorName\":\"超级管理员\",\"orgId\":\"3502031900111\"},\"orgId\":\"35020319001\",\"transType\":\"ec.query\"}"; // byte[] inputData = new byte[2048]; // byte[] ecUrl = new byte[2048]; // ecUrl= System.Text.Encoding.Default.GetBytes(strUrl); // inputData = System.Text.Encoding.Default.GetBytes(instr); // MessageBox.Show("进入try1"); // byte[] outputData = new byte[2048]; // string outputStr = ""; // long retData = NationEcTrans(ecUrl, inputData, outputData); // MessageBox.Show("进入try2"); // outputStr = System.Text.Encoding.Default.GetString(outputData); // outputStr = CheckStr(outputStr); // dynamic outputObj = Newtonsoft.Json.JsonConvert.DeserializeObject(outputStr); // MessageBox.Show("进入try3"); // if (outputObj.code != "0") // { // code = "-100"; // message = "读取医保电子凭证失败:" + outputObj.message; // MessageBox.Show("进入try4"); // } // else // { // MessageBox.Show("进入try5"); // message = ""; //ecQrCode // string ecToken = outputObj.data.ecToken; // string ecQrCode = outputObj.data.ecQrCode; // string ecIndexNo = outputObj.data.ecIndexNo; // var result = new { ecToken = ecToken, ecQrCode = ecQrCode, ecIndexNo = ecIndexNo }; // var resultObj = new { errorCode = "0", errorMessage = "", result = result }; // string resultStr = JsonConvert.SerializeObject(resultObj); // MessageBox.Show("进入try6"); // outpar = resultStr; // MessageBox.Show("电子凭证返参:"+ outpar); // return resultStr; // } // } // catch (Exception error) // { // code = "-1000"; // message = "产生异常" + error.ToString(); // } // var outlist = new { errorCode = code, errorMessage = message }; // string outSerialize = JsonConvert.SerializeObject(outlist); // outpar = ""; // return outSerialize; //} public static string CheckStr(string str) { int len = str.Length; string newStr = ""; for (var i = 0; i < len; i++) { if ((int)System.Text.Encoding.Default.GetBytes(str.Substring(i, 1))[0] > 0) { string ret = str.Substring(i, 1); newStr = newStr + ret; } } return newStr; } } }