| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324 |
- using System;
- using System.Text;
- using System.Runtime.InteropServices;
- using PTMedicalInsurance.Variables;
- public class CardReaderNew
- {
- // ========== DLL 导入 ==========
- [DllImport("SSCard.dll", EntryPoint = "Init", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private static extern int InitDll(StringBuilder pURL, StringBuilder pUser);
- [DllImport("SSCard.dll", EntryPoint = "ReadCardBasGZ", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private static extern int ReadCardBasGZ(StringBuilder pOutBuff, int nOutBuffLen, StringBuilder pSignBuff, int nSignBuffLen);
- [DllImport("SSCard.dll", EntryPoint = "ReadMedicalCardGZ", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private static extern int ReadMedicalCardGZ(StringBuilder pOutBuff, int nOutBuffLen, StringBuilder pSignBuff, int nSignBuffLen);
- [DllImport("SSCard.dll", EntryPoint = "VerifyPIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private static extern int VerifyPIN(StringBuilder pOutBuff, int nOutBuffLen);
- [DllImport("SSCard.dll", EntryPoint = "ChangePIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private static extern int ChangePIN(StringBuilder pOutBuff, int nOutBuffLen);
- [DllImport("SSCard.dll", EntryPoint = "ReadIDCardGZ", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private static extern int ReadSFZ(StringBuilder pOutBuff, int nOutBuffLen, StringBuilder pSignBuff, int nSignBuffLen);
- [DllImport("SSCard.dll", EntryPoint = "GetTwoBarCodes", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private 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)]
- private static extern IntPtr NationEcTrans(StringBuilder strUrl, StringBuilder InData, StringBuilder OutData);
- [DllImport("SSCARDInterface.dll", EntryPoint = "SetAutoQRcode", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private static extern int SetAutoQRcode(StringBuilder pOutBuff);
- [DllImport("SSCARDInterface.dll", EntryPoint = "CloseAutoQRcode", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private static extern int CloseAutoQRcode(StringBuilder pOutBuff);
- [DllImport("SSCARDInterface.dll", EntryPoint = "iOpenPort", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private static extern int iOpenPort(StringBuilder pOutBuff);
- [DllImport("SSCARDInterface.dll", EntryPoint = "iClosePort", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
- private static extern int iClosePort(StringBuilder pOutBuff);
- // ========== 单例实现 ==========
- private static readonly Lazy<CardReaderNew> _instance = new Lazy<CardReaderNew>(() =>
- {
- string url = Global.inf.cardURL ?? throw new InvalidOperationException("Global.inf.cardURL 未初始化");
- string user = Global.inf.areaCode ?? throw new InvalidOperationException("Global.inf.areaCode 未初始化");
- var reader = new CardReaderNew(url, user);
- reader.Initialize();
- return reader;
- });
- public static CardReaderNew Instance => _instance.Value;
- // ========== 实例成员 ==========
- private readonly string _url;
- private readonly string _user;
- private bool _isInited = false;
- // 私有构造函数(禁止外部 new)
- private CardReaderNew(string url, string user)
- {
- _url = url;
- _user = user;
- }
- // 初始化(仅执行一次)
- private void Initialize()
- {
- if (_isInited) return;
- string errMsg = "";
- int result = -1;
- try
- {
- var sbURL = new StringBuilder(_url);
- var sbUser = new StringBuilder(_user);
- result = InitDll(sbURL, sbUser);
- if (result == 0)
- {
- _isInited = true;
- }
- else
- {
- errMsg = $"Init 返回错误码: {result}";
- }
- }
- catch (Exception ex)
- {
- errMsg = ex.Message;
- result = -1;
- }
- finally
- {
- Global.writeLog("初始化", $"{_url}:{_user}", $"{result}:{errMsg}");
- }
- if (!_isInited)
- {
- throw new InvalidOperationException($"CardReaderNew 初始化失败: {errMsg}");
- }
- }
- // ========== 业务方法(全部修正缓冲区长度)==========
- private const int DEFAULT_BUFFER_SIZE = 2048; // 统一使用 2048,更安全
- public int ReadCardBas(out string basInfo, out string regInfo)
- {
- if (!_isInited) { basInfo = "未初始化"; regInfo = ""; return -1; }
- basInfo = ""; regInfo = "";
- try
- {
- var sbBas = new StringBuilder(DEFAULT_BUFFER_SIZE);
- var sbReg = new StringBuilder(DEFAULT_BUFFER_SIZE);
- int rtn = ReadCardBasGZ(sbBas, DEFAULT_BUFFER_SIZE, sbReg, DEFAULT_BUFFER_SIZE);
- basInfo = sbBas.ToString();
- regInfo = sbReg.ToString();
- return rtn;
- }
- catch (Exception ex)
- {
- basInfo = "ReadCardBas异常: " + ex.Message;
- return -1;
- }
- finally
- {
- Global.writeLog("读社保卡(" + _url + ")", regInfo, basInfo);
- }
- }
- public int VerifyPIN(out string outBuff)
- {
- if (!_isInited) { outBuff = "未初始化"; return -1; }
- outBuff = "";
- try
- {
- var sb = new StringBuilder(DEFAULT_BUFFER_SIZE);
- int rtn = VerifyPIN(sb, DEFAULT_BUFFER_SIZE);
- outBuff = sb.ToString();
- return rtn;
- }
- catch (Exception ex)
- {
- outBuff = "VerifyPIN: " + ex.Message;
- return -1;
- }
- }
- public int ChangePIN(out string outBuff)
- {
- if (!_isInited) { outBuff = "未初始化"; return -1; }
- outBuff = "";
- try
- {
- var sb = new StringBuilder(DEFAULT_BUFFER_SIZE);
- int rtn = ChangePIN(sb, DEFAULT_BUFFER_SIZE);
- outBuff = sb.ToString();
- return rtn;
- }
- catch (Exception ex)
- {
- outBuff = "ChangePIN: " + ex.Message;
- return -1;
- }
- }
- public int ReadSFZ(out string OutBuff, out string SignBuff)
- {
- if (!_isInited) { OutBuff = "未初始化"; SignBuff = ""; return -1; }
- OutBuff = ""; SignBuff = "";
- try
- {
- var sbOut = new StringBuilder(DEFAULT_BUFFER_SIZE);
- var sbSign = new StringBuilder(DEFAULT_BUFFER_SIZE);
- int rtn = ReadSFZ(sbOut, DEFAULT_BUFFER_SIZE, sbSign, DEFAULT_BUFFER_SIZE);
- OutBuff = sbOut.ToString();
- SignBuff = sbSign.ToString();
- return rtn;
- }
- catch (Exception ex)
- {
- OutBuff = "ReadSFZ 异常: " + ex.Message;
- return -1;
- }
- }
- public int GetQRBase(out int timeout, out string OutBuff, out string SignBuff)
- {
- if (!_isInited) { OutBuff = "未初始化"; SignBuff = ""; timeout = 0; return -1; }
- OutBuff = ""; SignBuff = ""; timeout = 10;
- try
- {
- var sbOut = new StringBuilder(DEFAULT_BUFFER_SIZE);
- var sbSign = new StringBuilder(DEFAULT_BUFFER_SIZE);
- int rtn = GetQRBase(timeout, sbOut, DEFAULT_BUFFER_SIZE, sbSign, DEFAULT_BUFFER_SIZE);
- OutBuff = sbOut.ToString();
- SignBuff = sbSign.ToString();
- return rtn;
- }
- catch (Exception ex)
- {
- OutBuff = "GetQRBase 异常: " + ex.Message;
- return -1;
- }
- finally
- {
- Global.writeLog("GetQRBase", $"Timeout={timeout}", $"Out:{OutBuff}, Sign:{SignBuff}");
- }
- }
- public string NationEcTrans(string url, string inData, out string outData)
- {
- outData = "";
- try
- {
- var sbUrl = new StringBuilder(url);
- var sbIn = new StringBuilder(inData);
- var sbOut = new StringBuilder(10240); // 此处保持较大,因电子凭证可能较长
- IntPtr pRtn = NationEcTrans(sbUrl, sbIn, sbOut);
- outData = sbOut.ToString();
- return Marshal.PtrToStringAnsi(pRtn) ?? "-1";
- }
- catch (Exception ex)
- {
- outData = "NationEcTrans 异常: " + ex.Message;
- return "-1";
- }
- finally
- {
- Global.writeLog("电子凭证", inData, outData);
- }
- }
- public int SetAutoQRcode(out string errMsg)
- {
- errMsg = "";
- try
- {
- var sb = new StringBuilder(DEFAULT_BUFFER_SIZE);
- int rtn = SetAutoQRcode(sb);
- errMsg = sb.ToString();
- return rtn;
- }
- catch (Exception ex)
- {
- errMsg = "SetAutoQRcode 异常: " + ex.Message;
- return -1;
- }
- finally
- {
- Global.writeLog("SetAutoQRcode", "", errMsg);
- }
- }
- public int CloseAutoQRcode(out string errMsg)
- {
- errMsg = "";
- int rtn = -1;
- try
- {
- var sb = new StringBuilder(DEFAULT_BUFFER_SIZE);
- rtn = CloseAutoQRcode(sb);
- errMsg = sb.ToString();
- return rtn;
- }
- catch (Exception ex)
- {
- errMsg = "CloseAutoQRcode 异常: " + ex.Message;
- return -1;
- }
- finally
- {
- Global.writeLog("CloseAutoQRcode", rtn.ToString(), errMsg);
- }
- }
- public int iOpenPort(out string errMsg)
- {
- errMsg = "";
- int rtn = -1;
- try
- {
- var sb = new StringBuilder(DEFAULT_BUFFER_SIZE);
- rtn = iOpenPort(sb);
- errMsg = sb.ToString();
- return rtn;
- }
- catch (Exception ex)
- {
- errMsg = "iOpenPort 异常: " + ex.Message;
- return -1;
- }
- finally
- {
- Global.writeLog("iOpenPort", rtn.ToString(), errMsg);
- }
- }
- public int iClosePort(out string errMsg)
- {
- errMsg = "";
- int rtn = -1;
- try
- {
- var sb = new StringBuilder(DEFAULT_BUFFER_SIZE);
- rtn = iClosePort(sb);
- errMsg = sb.ToString();
- return rtn;
- }
- catch (Exception ex)
- {
- errMsg = "iClosePort 异常: " + ex.Message;
- return -1;
- }
- finally
- {
- Global.writeLog("iClosePort", rtn.ToString(), errMsg);
- }
- }
- }
|