/****************************************************************************** * 文件名称: JsonHelper.cs * 文件说明: Json业务的封装,处理JSON串的封装,解析等 * 当前版本: V1.0 * 创建日期: 2022-04-14 * * 2020-04-14: 增加 setIrisInpar 方法 * 2020-04-14: 增加 setIrisInpar(重载) 方法 * 2020-04-14: 增加 getIrisExceptionJson 方法 * 2020-04-14: 增加 parseBusinessJson 方法 ******************************************************************************/ using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using PTMedicalInsurance.Common; using System.IO; using PTMedicalInsurance.Variables; using System.Windows.Forms; using Org.BouncyCastle.Crypto.Parameters; using Org.BouncyCastle.Crypto.Engines; using Org.BouncyCastle.Crypto.Modes; using Org.BouncyCastle.Crypto.Paddings; using Org.BouncyCastle.Security; namespace PTMedicalInsurance.Helper { class JsonHelper { /// /// 根据JSonPath查找节点值,如果节点不存在则返回空值 /// /// /// /// public static string getDestValue(JObject jo, string destPath) { JToken jt = jo.SelectToken("$." + destPath); if (jt != null) { return jt.ToString(); } else { Global.writeLog(destPath + "的JToken属性值为空"); return ""; } } public static string getDestProperty(JObject jo, string propertyName) { JProperty jp = jo.Property(propertyName); if (jp != null) { string jpStr = jp.ToString(); string rtnResult = "{ " + jpStr + "}"; return rtnResult; } else { Global.writeLog(propertyName + "的JProperty属性值为空"); return ""; } } /// /// 压缩JSON,占用体积减小(重载) /// /// /// public static string Compress(string json) { StringBuilder sb = new StringBuilder(); using (StringReader reader = new StringReader(json)) { int ch = -1; int lastch = -1; bool isQuoteStart = false; while ((ch = reader.Read()) > -1) { if ((char) lastch != '\\' && (char) ch == '\"') { if (!isQuoteStart) { isQuoteStart = true; } else { isQuoteStart = false; } } if (!Char.IsWhiteSpace((char) ch) || isQuoteStart) { sb.Append((char) ch); } lastch = ch; } } return sb.ToString(); } public static string Compress(JObject jsonObj) { //https://blog.csdn.net/yangjiaosun/article/details/103717256 return Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj); } /// /// 组织异常JSON串 /// /// /// /// public static JObject setExceptionJson(int errorCode, string eventName, string errorMessage) { dynamic joRtn = new JObject(); joRtn.errorCode = errorCode; joRtn.errorMessage = eventName + "提示:" + errorMessage; return joRtn; } public static string GetinPar(string sInpar, int i) { string Str = ""; if (i == 0) { Str = @""; return Str + "" + sInpar + ""; } else if (i == 1) { Str = @""; return Str + "" + sInpar + ""; } else if (i == 2) { Str = @" "; return Str + "" + sInpar + ""; } else { return ""; } } public static string setCenterInpar_SX(string infno, string input) { dynamic Jo = new JObject(); //Global.curEvt.msgid = Global.inf.hospitalNO + "00" + DateTime.Now.ToString("yyyyMMddHHmmss") + DateTime.Now.ToString("ffff"); Global.curEvt.msgid = "0411000101" + "00" + DateTime.Now.ToString("yyyyMMddHHmmss") + DateTime.Now.ToString("ffff"); JObject joInput = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(input); Jo.INF_VER = "V1.0"; //接口版本号 Jo.HOSP_CODE = "0411000101"; //院区编码 Jo.MSG_NO = Global.curEvt.msgid; //处理流水编号 Jo.MSG_TYPE = infno; //报文编号 string sInput = Global.curEvt.msgid + infno + input; string keyHex = "6353F58575D242CC99F84E231578F756"; //6353F58575D242CC99F84E231578F756 // 将密钥从十六进制字符串转换为字节数组 byte[] key = HexToBytes(keyHex); // 加密明文 byte[] encrypted = Encrypt(sInput, key); // 将字节数组转换为Base64字符串 string base64String = Convert.ToBase64String(encrypted); Jo.Add("IN_DATA", base64String); // //输入参数 return Jo.ToString(); } private static readonly int BlockSize = 16; // SM4 block size is 16 bytes // 使用 SM4 加密字符串 public static byte[] Encrypt(string plainText, byte[] key) { // 将明文转换为字节数组 byte[] inputBytes = Encoding.UTF8.GetBytes(plainText); // 创建 SM4 引擎并配置为 CBC 模式和 PKCS7 填充 var engine = new SM4Engine(); var blockCipher = new CbcBlockCipher(engine); var cipher = new PaddedBufferedBlockCipher(blockCipher, new Pkcs7Padding()); // 使用密钥和初始化向量(IV)初始化加密器 var keyParam = new KeyParameter(key); var iv = new byte[BlockSize]; // IV 通常设置为全零 var keyParamWithIV = new ParametersWithIV(keyParam, iv); cipher.Init(true, keyParamWithIV); // 加密数据 byte[] outputBytes = new byte[cipher.GetOutputSize(inputBytes.Length)]; int length = cipher.ProcessBytes(inputBytes, 0, inputBytes.Length, outputBytes, 0); cipher.DoFinal(outputBytes, length); return outputBytes; } // 将十六进制字符串转换为字节数组 public static byte[] HexToBytes(string hex) { if (hex.Length % 2 != 0) throw new ArgumentException("十六进制字符串的长度必须是偶数。"); byte[] bytes = new byte[hex.Length / 2]; for (int i = 0; i < bytes.Length; i++) { bytes[i] = Convert.ToByte(hex.Substring(i * 2, 2), 16); } return bytes; } /// /// 组织中心入参(明文)。部分代码是需要解析明文入参的,为了方便增加该方法 /// /// /// /// public static string setCenterInpar_plain(string infno, string input) { dynamic Jo = new JObject(); Jo.infno = infno; Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff"); Jo.msgid = Global.curEvt.msgid; Jo.mdtrtarea_admvs = "110100"; Global.pat.mdtrtarea_admvs = "110100"; Jo.insuplc_admdvs = Global.pat.insuplc_admdvs; Jo.recer_sys_code = Global.inf.recivedSystem; Jo.dev_safe_info = Global.inf.dev_safe_info; //设备编号 Jo.cainfo = Global.inf.cainfo;//设备安全信息 Jo.signtype = Global.inf.signatureType; ; Jo.infver = Global.inf.version; ; Jo.opter_type = Global.user.type; ; Jo.opter = Global.user.ID; ; Jo.opter_name = Global.user.name; ; Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Jo.fixmedins_code = Global.inf.hospitalNO; Jo.fixmedins_name = Global.inf.hospitalName; Jo.sign_no = Global.curEvt.signno; JObject joInput = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(input); Jo.Add("input", JObject.FromObject(joInput)); return Jo.ToString(); } /// /// 组织中心入参(明文)。部分代码是需要解析明文入参的,为了方便增加该方法 /// /// /// /// public static string setCenterInpar_plain(string infno, JObject joInput) { dynamic Jo = new JObject(); Jo.infno = infno; Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff"); Jo.msgid = Global.curEvt.msgid; Jo.insuplc_admdvs = Global.pat.insuplc_admdvs; Jo.mdtrtarea_admvs = "419900"; Global.pat.mdtrtarea_admvs = "419900"; Jo.recer_sys_code = Global.inf.recivedSystem; Jo.dev_no = Global.inf.dev_no; Jo.dev_safe_info = Global.inf.dev_safe_info; //设备编号 Jo.cainfo = Global.inf.cainfo;//设备安全信息 Jo.signtype = Global.inf.signatureType; ; Jo.infver = Global.inf.version; ; Jo.opter_type = Global.user.type; ; Jo.opter = Global.user.ID; ; Jo.opter_name = Global.user.name; ; Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Jo.fixmedins_code = Global.inf.hospitalNO; Jo.fixmedins_name = Global.inf.hospitalName; Jo.sign_no = Global.curEvt.signno; Jo.Add("input", joInput); return Jo.ToString(); } /// /// 组织中心入参--签到 /// /// /// /// public static string setCenterInpar(string infno, string input) { dynamic Jo = new JObject(); Jo.infno = infno; Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff"); Jo.msgid = Global.curEvt.msgid; if (Global.inf.areaCode == "") { Global.inf.areaCode = "419900"; } if (Global.pat.insuplc_admdvs == "") { Global.pat.insuplc_admdvs = Global.inf.areaCode; } Jo.insuplc_admdvs = Global.pat.insuplc_admdvs; Jo.mdtrtarea_admvs = "419900"; //郑州 市医保、省内异地、跨省异地就医地都传419900 Global.pat.mdtrtarea_admvs = "419900"; Jo.recer_sys_code = "HeNan"; Jo.dev_no = Global.curEvt.mac; Jo.dev_safe_info = Global.inf.dev_safe_info; //设备编号 Jo.cainfo = Global.inf.cainfo ;// Jo.signtype = "SM3"; ; Jo.infver = "v1.0"; Jo.opter_type = Global.user.type; ; Jo.opter = Global.user.ID; ; Jo.opter_name = Global.user.name; ; Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Jo.fixmedins_code = Global.inf.hospitalNO; Jo.fixmedins_name = Global.inf.hospitalName; Jo.sign_no = Global.curEvt.signno; if (input != "") { JObject joInput = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(input); Jo.cainfo = ""; Jo.Add("input", JObject.FromObject(joInput)); } else { Jo.cainfo = ""; Jo.Add("input", ""); } return Jo.ToString(); } /// /// 组织中心入参 /// /// /// /// public static string setCenterInpar(string infno, JObject joInput) { dynamic Jo = new JObject(); Jo.infno = infno; Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff"); Jo.msgid = Global.curEvt.msgid; if (Global.pat.insuplc_admdvs == "") { Global.pat.insuplc_admdvs = Global.inf.areaCode; } Jo.insuplc_admdvs = Global.pat.insuplc_admdvs; Jo.mdtrtarea_admvs = "419900"; //郑州 市医保、省内异地、跨省异地就医地都传419900 Global.pat.mdtrtarea_admvs = "419900"; Jo.recer_sys_code = "HeNan"; Jo.dev_no = Global.curEvt.mac; Jo.dev_safe_info = Global.inf.dev_safe_info; //设备编号 Jo.cainfo = Global.inf.cainfo;// Jo.signtype = "asn1"; ; Jo.infver = "v1.0"; Jo.opter_type = Global.user.type; ; Jo.opter = Global.user.ID; Jo.opter_name = Global.user.name; ; Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"); Jo.fixmedins_code = Global.inf.hospitalNO; Jo.fixmedins_name = Global.inf.hospitalName; Jo.sign_no = Global.curEvt.signno; Jo.cainfo = ""; Jo.Add("input", JObject.FromObject(joInput)); return Jo.ToString(); } /// /// 组织中心入参-电子发票上传 /// /// /// /// public static string setCenterInpar_InvNO(string infno, JObject joInput) { dynamic Jo = new JObject(); Global.curEvt.msgid = "01" + DateTime.Now.ToString("yyyyMMddHHmmssffff"); Jo.INF_VER = "v1.0"; Jo.HOSP_CODE = Global.inf.hospitalNO + "01"; Jo.MSG_NO = Global.curEvt.msgid; Jo.MSG_TYPE = infno; Jo.Add("IN_DATA", JObject.FromObject(joInput)); return Jo.ToString(); } /// /// 组织Iris入参 /// /// /// /// public static JObject setIrisInpar(string code, JObject joParam) { try { //dynamic joInparam = new JObject(); //joInparam.code = code; JObject joInparam = new JObject(); joInparam.Add("code", code); if (!joInparam.ContainsKey("interfaceDr")) { joInparam.Add("interfaceDr", Global.inf.interfaceDr); } if (!joInparam.ContainsKey("hospitalDr")) { joInparam.Add("hospitalDr", Global.inf.hospitalDr); } dynamic joTmp = new JObject(); JArray jaParam = new JArray(); jaParam.Add(joParam); joInparam.Add("params", JArray.FromObject(jaParam)); joInparam.Add("session", Global.curEvt.jaSession); return joInparam; } catch (Exception ex) { return setExceptionJson(-1, "setIrisInpar:", ex.Message); } } /// /// 组织Iris入参 /// /// /// /// public static JObject setIrisInpar(string code, JArray jaParams) { try { dynamic joInparam = new JObject(); joInparam.code = code; if (!joInparam.ContainsKey("interfaceDr")) { joInparam.Add("interfaceDr", Global.inf.interfaceDr); } if (!joInparam.ContainsKey("hospitalDr")) { joInparam.Add("hospitalDr", Global.inf.hospitalDr); } dynamic joTmp = new JObject(); joInparam.Add("params", jaParams); joInparam.Add("session", Global.curEvt.jaSession); return joInparam; } catch (Exception ex) { return setExceptionJson(-1, "setIrisInpar:", ex.Message); } } /// /// 解析中心返参 /// /// /// /// public static int parseCenterRtnValue(JObject joRtn, out string errorMsg) { try { string errcode = getDestValue(joRtn, "errcode"); string errorCode = getDestValue(joRtn, "errorCode"); if (errcode != "") { errorMsg = getDestValue(joRtn, "errmsg"); return -1; } else if (errorCode != "") { errorMsg = getDestValue(joRtn, "errorMessage"); return -2; } else { errorMsg = getDestValue(joRtn, "err_msg"); return int.Parse(getDestValue(joRtn, "infcode")); } } catch (Exception ex) { errorMsg = "解析中心返参发生异常:" + ex.Message; return -1; } } /// /// 组织IRIS返参 /// /// /// /// /// public static JObject setIrisReturnValue(int errorCode, string errorMessage, JObject joResult) { try { dynamic joRtn = new JObject(); joRtn.errorCode = errorCode; joRtn.errorMessage = errorMessage; joRtn.Add("result", joResult); return joRtn; } catch (Exception ex) { return setExceptionJson(-1, "setIrisReturnValue:", ex.Message); } } /// /// 组织IRIS返参 /// /// /// /// /// public static JObject setIrisReturnValueNew(int errorCode, string errorMessage, string sResult) { try { dynamic joRtn = new JObject(); joRtn.errorCode = errorCode; joRtn.errorMessage = errorMessage; joRtn.Add("result", sResult); return joRtn; } catch (Exception ex) { return setExceptionJson(-1, "setIrisReturnValueNew:", ex.Message); } } /// /// 解析IRIS返参 /// /// /// /// public static int parseIrisRtnValue(JObject joRtn, out string errorMsg) { try { errorMsg = getDestValue(joRtn, "errorMessage"); return int.Parse(getDestValue(joRtn, "errorCode")); } catch (Exception ex) { errorMsg = "解析Iris返参发生异常:" + ex.Message; return -1; } } /// /// 解析业务JSON串(业务串固定格式为{errorCode = ,errorMessage = ,result ={}}) /// /// /// /// public static int parseCenterReturnJson(JObject json, out string errorMsg) { try { errorMsg = ""; if (int.Parse(json["infcode"].ToString()) != 0) { errorMsg = json["err_msg"].ToString(); } return int.Parse(json["infcode"].ToString()); } catch (Exception ex) { errorMsg = "parseCenterReturnJson" + ex.Message; return -1; } } } }