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; } } }