using Newtonsoft.Json.Linq;
using System.Web.Http;
namespace ThCardReader
{
public class EntryController : ApiController
{
public JObject Get(string param)
{
JObject result = new JObject();
if (param == null)
{
result.Add("code", 1001);
result.Add("message", "参数为空!");
return result;
}
string[] temps = param.Split(new char[] { '_' });
// 检查两段式前缀(如 jiangsu_face、jiangsu_qrcode)
string type;
if (temps.Length >= 2 && temps[0].Equals("jiangsu") &&
(temps[1].Equals("face") || temps[1].Equals("qrcode")))
{
type = temps[0] + "_" + temps[1]; // 组合成 jiangsu_face 或 jiangsu_qrcode
}
else
{
type = temps[0]; // 单段前缀
}
if (type.Equals("qrcode"))
{
result = NationalEcBusiness.ReadQrCode(temps[1]);
}
else if (type.Equals("qrcode2"))
{
result = NationalEcBusiness.ReadQrCode2(temps[1]);
}
else if (type.Equals("face"))
{
result = NationalEcBusiness.ReadFace(temps[1]);
}
else if (type.Equals("sicard"))
{
result = SsCardBusiness.ReadSiCard();
}
else if (type.Equals("idcard"))
{
result = SsCardBusiness.ReadIdCard();
}
else if (type.Equals("idcard2"))
{
result = NationalEcBusiness.ReadIdCard(temps[1]);
}
else if (type.Equals("huashi"))
{
// 华视读卡器调用
string action = temps.Length > 1 ? temps[1] : "readcard";
// 检查是否是业务代码格式(5位数字),如果是则默认为readcard操作
if (temps.Length > 1 && IsBusinessCode(temps[1]))
{
action = "readcard"; // 业务代码不影响华视读卡器操作,默认读卡
}
if (action.Equals("init"))
{
int port = temps.Length > 2 ? int.Parse(temps[2]) : 1001;
result = HuaShiIdCardBusiness.Initialize(port);
}
else if (action.Equals("readcard"))
{
// URL调用时启用自动关闭,模拟SSCard.dll的无状态行为
var huashiResult = HuaShiIdCardBusiness.ReadIdCard("", true);
result = ConvertHuaShiDataToStandardFormat(huashiResult);
}
else if (action.Equals("continuous"))
{
// URL调用时启用自动关闭,模拟SSCard.dll的无状态行为
var huashiResult = HuaShiIdCardBusiness.ReadIdCardContinuous("", true);
result = ConvertHuaShiDataToStandardFormat(huashiResult);
}
else if (action.Equals("status"))
{
result = HuaShiIdCardBusiness.GetDeviceStatus();
}
else if (action.Equals("close"))
{
result = HuaShiIdCardBusiness.Close();
}
else
{
result.Add("code", 1001);
result.Add("message", "华视读卡器操作【" + action + "】错误!允许的操作为【init、readcard、continuous、status、close】");
}
}
else if (type.Equals("jiangsu_face"))
{
// 江苏医保刷脸授权获取医保身份 - 使用NationECCode.dll与泰和完全一致
// URL格式: http://localhost:8321/readcard/entry?param=jiangsu_face_${nowbiztype}
string businessType = temps.Length > 2 ? temps[2] : "01101"; // 从URL参数获取业务类型(第3段)
// 验证业务类型格式
if (!JiangSuSocialCardBusiness.IsValidBusinessType(businessType))
{
result.Add("success", false);
result.Add("code", 1001);
result.Add("message", $"江苏医保刷脸业务类型【{businessType}】无效!支持的业务类型:01101(门诊挂号)、01301(门诊结算)、02121(药店购药)等");
result.Add("type", "face");
result.Add("device", "江苏医保刷脸认证器(NationECCode.dll)");
result.Add("businessType", businessType);
}
else
{
result = JiangSuSocialCardBusiness.ReadFace(businessType); // 使用NationECCode.dll与泰和完全一致
// 转换为前端期望的格式
result = ConvertJiangSuFaceAuthToStandardFormat(result);
}
}
else if (type.Equals("jiangsu_qrcode"))
{
// 江苏医保电子凭证解码(独立入口)
string businessType = temps.Length > 2 ? temps[2] : "01101"; // 从URL参数获取业务类型(第3段)
// 验证业务类型格式
if (!JiangSuSocialCardBusiness.IsValidBusinessType(businessType))
{
result.Add("success", false);
result.Add("code", 1001);
result.Add("message", $"江苏医保电子凭证业务类型【{businessType}】无效!支持的业务类型:01101(门诊挂号)、01301(门诊结算)、02121(药店购药)等");
result.Add("type", "qrcode");
result.Add("device", "江苏医保电子凭证解码器");
}
else
{
result = JiangSuSocialCardBusiness.ReadElectronicCertificate(businessType);
// 转换为前端期望的格式
result = ConvertJiangSuElectronicCertificateToStandardFormat(result);
}
}
else if (type.Equals("jiangsu"))
{
// 江苏医保社保卡读取
string action = temps.Length > 1 ? temps[1] : "readcard";
// 检查是否是业务代码格式(5位数字),如果是则默认为readcard操作
if (temps.Length > 1 && IsBusinessCode(temps[1]))
{
action = "readcard"; // 业务代码不影响江苏医保读卡操作,默认读卡
}
if (action.Equals("init"))
{
result = JiangSuSocialCardBusiness.Initialize();
}
else if (action.Equals("readcard"))
{
result = JiangSuSocialCardBusiness.ReadSocialCard(false);
// 转换为前端期望的格式
result = ConvertJiangSuDataToStandardFormat(result);
}
else if (action.Equals("readcard_pin"))
{
result = JiangSuSocialCardBusiness.ReadSocialCard(true);
result = ConvertJiangSuDataToStandardFormat(result);
}
else if (action.Equals("verifypin"))
{
result = JiangSuSocialCardBusiness.VerifyCardPIN();
}
else if (action.Equals("changepin"))
{
result = JiangSuSocialCardBusiness.ChangeCardPIN();
}
else if (action.Equals("status"))
{
result = JiangSuSocialCardBusiness.GetDeviceStatus();
}
else if (action.Equals("reset"))
{
result = JiangSuSocialCardBusiness.ResetSystemState();
}
else if (action.Equals("getpersoninfo"))
{
result = JiangSuSocialCardBusiness.GetPersonInfo("socialcard", "");
}
else if (action.Equals("checkdll"))
{
result = JiangSuSocialCardBusiness.CheckDllExists();
}
else if (action.Equals("qrcode") || action.Equals("ec"))
{
// 江苏医保电子凭证解码
string businessType = temps.Length > 2 ? temps[2] : "01101"; // 默认门诊挂号
// 验证业务类型格式
if (!JiangSuSocialCardBusiness.IsValidBusinessType(businessType))
{
result.Add("success", false);
result.Add("code", 1001);
result.Add("message", $"江苏医保电子凭证业务类型【{businessType}】无效!支持的业务类型:01101(门诊挂号)、01301(门诊结算)、02121(药店购药)等");
result.Add("type", "qrcode");
result.Add("device", "江苏医保电子凭证解码器");
}
else
{
result = JiangSuSocialCardBusiness.ReadElectronicCertificate(businessType);
// 转换为前端期望的格式(电子凭证不需要特殊转换,保持原格式)
result = ConvertJiangSuElectronicCertificateToStandardFormat(result);
}
}
else
{
result.Add("success", false);
result.Add("code", 1001);
result.Add("message", "江苏医保操作【" + action + "】错误!允许的操作为【init、readcard、readcard_pin、verifypin、changepin、status、reset、getpersoninfo、checkdll、qrcode、ec】");
}
}
else
{
result.Add("code", 1001);
result.Add("message", "读卡类别【" + type + "】错误!允许的类别为【sicard、idcard、idcard2、qrcode、qrcode2、face、huashi、jiangsu、jiangsu_qrcode、jiangsu_face】");
}
return result;
}
///
/// 判断字符串是否是业务代码格式(5位数字)
///
/// 要检查的字符串
/// 是否是业务代码
private bool IsBusinessCode(string code)
{
if (string.IsNullOrEmpty(code) || code.Length != 5)
{
return false;
}
// 检查是否是5位数字
foreach (char c in code)
{
if (!char.IsDigit(c))
{
return false;
}
}
return true;
}
///
/// 将华视读卡器的数据格式转换为前端期望的"^"分隔字符串格式
///
/// 华视读卡器返回的JSON数据
/// 转换后的标准格式
private JObject ConvertHuaShiDataToStandardFormat(JObject huashiResult)
{
JObject result = new JObject();
try
{
// 如果华视读卡器返回错误,直接返回错误信息
if ((int)huashiResult["code"] != 200)
{
return huashiResult;
}
// 提取华视读卡器返回的数据
var data = huashiResult["data"];
if (data == null)
{
result.Add("code", 1001);
result.Add("message", "华视读卡器返回数据为空");
return result;
}
// 按照前端期望的顺序组装数据:
// str1[0] = IDNumber (身份证号)
// str1[1] = Name (姓名)
// str1[2] = Sex (性别)
// str1[3] = Nation (民族)
// str1[4] = Birthday (生日)
// str1[5] = Address (地址)
// str1[6] = IDIssued (签发机关)
// str1[7] = IssuedData + ValidDate (签发日期+有效期,连续)
// str1[8] = Base64Photo (照片Base64)
string idNumber = data["idCode"]?.ToString() ?? "";
string name = data["name"]?.ToString() ?? "";
string sex = data["sex"]?.ToString() ?? "";
string nation = data["nation"]?.ToString() ?? "";
string birthday = data["birthday"]?.ToString() ?? "";
string address = data["address"]?.ToString() ?? "";
string department = data["department"]?.ToString() ?? "";
string startDate = data["startDate"]?.ToString() ?? "";
string endDate = data["endDate"]?.ToString() ?? "";
// 组合签发日期和有效期 (前端会用substring分割)
string dateInfo = startDate + endDate;
// 获取照片的Base64数据
string base64Photo = data["photoBase64"]?.ToString() ?? "";
// 按照前端期望的顺序用"^"连接
string formattedData = string.Join("^", new string[] {
idNumber, // [0] 身份证号
name, // [1] 姓名
sex, // [2] 性别
nation, // [3] 民族
birthday, // [4] 生日
address, // [5] 地址
department, // [6] 签发机关
dateInfo, // [7] 签发日期+有效期
base64Photo, // [8] 照片Base64
"", // [9] 预留空位,确保split后数组有足够元素
"" // [10] 预留空位
});
result.Add("code", 200);
result.Add("message", "华视读卡器读取成功(已转换为标准格式)");
result.Add("data", formattedData);
result.Add("device", "华视电子身份证读卡器");
result.Add("originalType", "huashi_idcard");
}
catch (System.Exception ex)
{
result.Add("code", 1001);
result.Add("message", $"华视数据格式转换异常: {ex.Message}");
}
return result;
}
///
/// 将江苏医保社保卡的数据格式转换为前端期望的"^"分隔字符串格式
///
/// 江苏医保返回的JSON数据
/// 转换后的标准格式
private JObject ConvertJiangSuDataToStandardFormat(JObject jiangsuResult)
{
JObject result = new JObject();
try
{
// 如果江苏医保返回错误,直接返回错误信息
if (!(bool)jiangsuResult["success"] || (int)jiangsuResult["code"] != 200)
{
// 保持原有的success和code字段,但调整为前端期望的格式
result.Add("code", jiangsuResult["code"]);
result.Add("message", jiangsuResult["message"]);
result.Add("device", "江苏医保社保卡读卡器");
return result;
}
// 提取江苏医保返回的数据
var data = jiangsuResult["data"];
if (data == null)
{
result.Add("code", 1001);
result.Add("message", "江苏医保返回数据为空");
return result;
}
// 按照前端期望的顺序组装社保卡数据:
// str1[0] = CardNumber (社保卡号)
// str1[1] = Name (姓名)
// str1[2] = IDNumber (身份证号)
// str1[3] = Sex (性别)
// str1[4] = Nation (民族)
// str1[5] = Birthday (生日)
// str1[6] = Address (地址)
// str1[7] = IssueDate (发卡日期)
// str1[8] = ValidDate (有效期)
// str1[9] = Department (发卡机构)
// str1[10] = Photo (照片Base64)
string cardNumber = data["cardNumber"]?.ToString() ?? "";
string name = data["name"]?.ToString() ?? "";
string idNumber = data["idNumber"]?.ToString() ?? "";
string sex = data["sex"]?.ToString() ?? "";
string nation = data["nation"]?.ToString() ?? "";
string birthday = data["birthday"]?.ToString() ?? "";
string address = data["address"]?.ToString() ?? "";
string issueDate = data["issueDate"]?.ToString() ?? "";
string validDate = data["validDate"]?.ToString() ?? "";
string department = data["department"]?.ToString() ?? "";
string photo = data["photo"]?.ToString() ?? "";
// 按照前端期望的顺序用"^"连接(社保卡格式)
string formattedData = string.Join("^", new string[] {
cardNumber, // [0] 社保卡号
name, // [1] 姓名
idNumber, // [2] 身份证号
sex, // [3] 性别
nation, // [4] 民族
birthday, // [5] 生日
address, // [6] 地址
issueDate, // [7] 发卡日期
validDate, // [8] 有效期
department, // [9] 发卡机构
photo, // [10] 照片Base64
"", // [11] 预留空位
"" // [12] 预留空位
});
result.Add("code", 200);
result.Add("message", "江苏医保社保卡读取成功(已转换为标准格式)");
result.Add("data", formattedData);
result.Add("device", "江苏医保社保卡读卡器");
result.Add("originalType", "jiangsu_socialcard");
}
catch (System.Exception ex)
{
result.Add("code", 1001);
result.Add("message", $"江苏医保数据格式转换异常: {ex.Message}");
}
return result;
}
///
/// 将江苏医保电子凭证解码结果转换为前端期望的格式
///
/// 江苏医保电子凭证解码返回的JSON数据
/// 转换后的标准格式
private JObject ConvertJiangSuElectronicCertificateToStandardFormat(JObject jiangsuEcResult)
{
JObject result = new JObject();
try
{
// 如果江苏医保电子凭证解码返回错误,直接返回错误信息
if (!(bool)jiangsuEcResult["success"] || (int)jiangsuEcResult["code"] != 200)
{
// 保持原有的字段,确保前端能正确处理
result.Add("code", jiangsuEcResult["code"]);
result.Add("message", jiangsuEcResult["message"]);
result.Add("device", jiangsuEcResult["device"]);
result.Add("type", jiangsuEcResult["type"]);
// 添加其他可能的错误信息字段
if (jiangsuEcResult["jiangsuErrorCode"] != null)
result.Add("jiangsuErrorCode", jiangsuEcResult["jiangsuErrorCode"]);
if (jiangsuEcResult["jiangsuErrorMessage"] != null)
result.Add("jiangsuErrorMessage", jiangsuEcResult["jiangsuErrorMessage"]);
if (jiangsuEcResult["suggestion"] != null)
result.Add("suggestion", jiangsuEcResult["suggestion"]);
return result;
}
// 电子凭证解码成功,保持原格式返回(前端直接使用JSON格式)
result.Add("code", jiangsuEcResult["code"]);
result.Add("message", jiangsuEcResult["message"]);
result.Add("device", jiangsuEcResult["device"]);
result.Add("type", jiangsuEcResult["type"]);
result.Add("originalType", jiangsuEcResult["originalType"]);
result.Add("timestamp", jiangsuEcResult["timestamp"]);
// 保持电子凭证的JSON数据格式(前端期望JSON而不是^分隔的字符串)
result.Add("data", jiangsuEcResult["data"]);
// 添加兼容字段:让前端可以统一处理
result.Add("readCardResult", jiangsuEcResult["readCardResult"]);
// 保留江苏医保相关信息
if (jiangsuEcResult["businessType"] != null)
result.Add("businessType", jiangsuEcResult["businessType"]);
if (jiangsuEcResult["interfaceVersion"] != null)
result.Add("interfaceVersion", jiangsuEcResult["interfaceVersion"]);
if (jiangsuEcResult["jiangsuOriginalData"] != null)
result.Add("jiangsuOriginalData", jiangsuEcResult["jiangsuOriginalData"]);
}
catch (System.Exception ex)
{
result.Add("code", 1001);
result.Add("message", $"江苏医保电子凭证数据格式转换异常: {ex.Message}");
result.Add("device", "江苏医保电子凭证解码器");
result.Add("type", "qrcode");
result.Add("exception", ex.GetType().Name);
}
return result;
}
///
/// 将江苏医保刷脸授权结果转换为前端期望的格式
///
/// 江苏医保刷脸授权返回的JSON数据
/// 转换后的标准格式
private JObject ConvertJiangSuFaceAuthToStandardFormat(JObject jiangsuFaceAuthResult)
{
JObject result = new JObject();
try
{
// 刷脸授权直接返回原JSON格式,不需要转换为^分隔字符串
// 因为刷脸返回的是结构化的医保身份信息,前端期望JSON格式
result.Add("code", jiangsuFaceAuthResult["code"]);
result.Add("message", jiangsuFaceAuthResult["message"]);
result.Add("type", "face");
result.Add("data", jiangsuFaceAuthResult["data"]?.ToString());
result.Add("sign", jiangsuFaceAuthResult["sign"]);
// 保留江苏医保特有字段
if (jiangsuFaceAuthResult["device"] != null)
result.Add("device", jiangsuFaceAuthResult["device"]);
if (jiangsuFaceAuthResult["businessType"] != null)
result.Add("businessType", jiangsuFaceAuthResult["businessType"]);
if (jiangsuFaceAuthResult["timestamp"] != null)
result.Add("timestamp", jiangsuFaceAuthResult["timestamp"]);
if (jiangsuFaceAuthResult["authNo"] != null)
result.Add("authNo", jiangsuFaceAuthResult["authNo"]);
if (jiangsuFaceAuthResult["interfaceVersion"] != null)
result.Add("interfaceVersion", jiangsuFaceAuthResult["interfaceVersion"]);
}
catch (System.Exception ex)
{
result.Add("code", 1001);
result.Add("message", $"江苏医保刷脸授权数据格式转换异常: {ex.Message}");
result.Add("device", "江苏医保刷脸认证器");
result.Add("type", "face");
result.Add("exception", ex.GetType().Name);
}
return result;
}
}
}