/******************************************************************************
* 文件名称: 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);
// }
//}
}
}