| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258 | 
							- /******************************************************************************
 
-  * 文件名称: 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);
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 读社保卡
 
-         /// </summary>
 
-         /// <param name="basInfo"></param>
 
-         /// <returns></returns>
 
-         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);
 
-             }
 
-         }
 
-         /// <summary>
 
-         /// 读身份证
 
-         /// </summary>
 
-         /// <param name="OutBuff"></param>
 
-         /// <returns></returns>
 
-         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;
 
-         }
 
-         /// <summary>
 
-         /// 解析读卡结果
 
-         /// </summary>
 
-         /// <param name="outBuff"></param>
 
-         /// <returns></returns>
 
-         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);
 
-         //    }
 
-         //}
 
-     
 
-     }  
 
- }
 
 
  |