123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530 |
- 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;
- }
- /// <summary>
- /// 判断字符串是否是业务代码格式(5位数字)
- /// </summary>
- /// <param name="code">要检查的字符串</param>
- /// <returns>是否是业务代码</returns>
- 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;
- }
- /// <summary>
- /// 将华视读卡器的数据格式转换为前端期望的"^"分隔字符串格式
- /// </summary>
- /// <param name="huashiResult">华视读卡器返回的JSON数据</param>
- /// <returns>转换后的标准格式</returns>
- 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;
- }
- /// <summary>
- /// 将江苏医保社保卡的数据格式转换为前端期望的"^"分隔字符串格式
- /// </summary>
- /// <param name="jiangsuResult">江苏医保返回的JSON数据</param>
- /// <returns>转换后的标准格式</returns>
- 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;
- }
- /// <summary>
- /// 将江苏医保电子凭证解码结果转换为前端期望的格式
- /// </summary>
- /// <param name="jiangsuEcResult">江苏医保电子凭证解码返回的JSON数据</param>
- /// <returns>转换后的标准格式</returns>
- 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;
- }
- /// <summary>
- /// 将江苏医保刷脸授权结果转换为前端期望的格式
- /// </summary>
- /// <param name="jiangsuFaceAuthResult">江苏医保刷脸授权返回的JSON数据</param>
- /// <returns>转换后的标准格式</returns>
- 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;
- }
- }
- }
|