/****************************************************************************** * 文件名称: 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; using Newtonsoft.Json.Linq; namespace PTMedicalInsurance.Common { class CardReader { const string DllPath = @"SSCard.dll"; private bool initilaized = false; [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() { if (initilaized) return 0; string errMsg = ""; int result = -1; try { StringBuilder sbURL = new StringBuilder(URL); StringBuilder sbUSER = new StringBuilder(User); Global.writeLog(string.Format("读卡初始化:{0},{1}",URL,User)); result = Init(sbURL, 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,1024, sbBusiCardInfo,8192); if (rtn == 0) { // 解析返回读卡信息 basInfo = parseCardInfo(sbCardInfo.ToString(),0); Global.pat.card.BusinessCode = sbBusiCardInfo.ToString(); } else { basInfo = sbCardInfo.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(1024); StringBuilder sbBusiCardBuff = new StringBuilder(1024); rtn = ReadSFZ(sbOutBuff,1024,sbBusiCardBuff, 1024); // 解析返回读卡信息 OutBuff = parseCardInfo(sbOutBuff.ToString(),0); Global.pat.card.BusinessCode = sbBusiCardBuff.ToString(); return rtn; } catch (Exception ex) { OutBuff = "ReadSFZ 异常:" + ex.Message; return rtn; } } public int ReadECToken(string URL,string inputParam,out string sOutPar) { sOutPar = ""; StringBuilder sbURL = new StringBuilder(URL); StringBuilder sbInput = new StringBuilder(inputParam); Global.writeLog("开始调用ECToken:" + inputParam); StringBuilder sbOut = new StringBuilder(40960); IntPtr pInt = CardReader.NationEcTrans(sbURL,sbInput, sbOut); string outputData = sbOut.ToString(); Global.writeLog("EcToken返回:" + pInt.ToInt32(), inputParam, outputData); sOutPar = parseECTokenOutput(outputData); if (JsonHelper.getDestValue(JObject.Parse(outputData), "code") != "0") { Global.writeLog("调用认证接口失败:" + outputData); return -1; } return 0; } private static string parseECTokenOutput(string data) { JObject joRtn = JObject.Parse(data); Global.pat.ecToken = JsonHelper.getDestValue(joRtn, "data.ecToken"); Global.pat.certNO = JsonHelper.getDestValue(joRtn, "data.idNo"); //身份证 Global.pat.name = JsonHelper.getDestValue(joRtn, "data.userName"); Global.pat.certType = JsonHelper.getDestValue(joRtn, "data.idType"); Global.pat.insuplc_admdvs = JsonHelper.getDestValue(joRtn, "data.insuOrg"); // 令牌 Global.pat.mdtrtcertNO = Global.pat.ecToken; return data; } /// /// 解析读卡结果 /// /// /// private string parseCardInfo(string inBuff,int startIndex = 1) { // 360100 | 362502198603060820 | B04D4C6B2 | 360100D156000005B04D4C6BF99AC1BD | 李凌 | 0081544C9386841907267A0FD6 | 2.00 | 20200612 | 20300612 | 369900906440 || string[] data = inBuff.Split("|".ToCharArray()); CardInfo card = new CardInfo(); card.certno = data[startIndex+1]; card.cardno = data[startIndex + 2]; card.card_sn = data[startIndex + 3]; card.psn_name = data[startIndex + 4]; Global.pat.insuplc_admdvs = data[startIndex]; //行政区划 Global.pat.card.SN = card.card_sn; Global.pat.certType = "01"; 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); // } //} } }