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