浏览代码

perf: 电子处方加密调整

zhengjie 1 年之前
父节点
当前提交
4b32a5c187
共有 7 个文件被更改,包括 73 次插入104 次删除
  1. 11 6
      Business/HisMainBusiness.cs
  2. 1 1
      Common/SignUtils.cs
  3. 9 1
      Forms/PrescriptionCirculation.cs
  4. 42 16
      Helper/InvokeHelper.cs
  5. 8 79
      Helper/JsonHelper.cs
  6. 1 1
      InsuBusiness.cs
  7. 1 0
      Variables/Struct.cs

+ 11 - 6
Business/HisMainBusiness.cs

@@ -257,7 +257,6 @@ namespace PTMedicalInsurance.Business
         public int readCard(out string outParam)
         {
             outParam = "";
-            string errorMsg = "";
             JObject joCardInfo = new JObject();
             ChooseCard cc = new ChooseCard();
             JObject joRtn = new JObject();
@@ -270,10 +269,14 @@ namespace PTMedicalInsurance.Business
                     //电子凭证
                     if (cc.cardType == "01")
                     {
-
                         Global.pat.mdtrtcertType = "01";
                         Global.businessType = cc.businessType;
                         outParam = ECTokenReader.ECQuery("1");
+                        if (string.IsNullOrEmpty(outParam))
+                        {
+                            outParam = "读电子凭证失败!";
+                            return -1;
+                        }
                         return 0;
                     }
                     //身份证
@@ -304,17 +307,19 @@ namespace PTMedicalInsurance.Business
                         // 重庆读卡合并到1161交易(取消1101)
                         return this.trade1161(out outParam);
                         #endregion
-
                     }
+
+                }
+                else {
+                    outParam = "取消读卡!";
                 }
-                return 0;
-                
             }
             catch (Exception ex)
             {
                 outParam = "异常:" + ex.Message;                
-                return -1;
             }
+
+            return -1;
         }
 
         private int trade1161(out string outParam)

+ 1 - 1
Common/SignUtils.cs

@@ -45,7 +45,7 @@ namespace PTMedicalInsurance.Common
 			jobject.Add("encType", "SM4");
 			jobject.Add("signType", "SM2");
 			jobject.Add("timestamp", ts); ;
-			jobject.Add("version", "2.0.1");
+			//jobject.Add("version", "2.0.1");
 
 			string signData = SMUtil.sign(jobject, appSecret, prvkey);
 			string encData = SMUtil.encrypt(data, appId, appSecret);

+ 9 - 1
Forms/PrescriptionCirculation.cs

@@ -92,7 +92,7 @@ namespace PTMedicalInsurance.Forms
         //    }   
         //}
 
-        public PrescriptionCirculation(string PatInfo)
+        public PrescriptionCirculation(string PatInfo = "")
         {
             InitializeComponent();
 
@@ -146,6 +146,12 @@ namespace PTMedicalInsurance.Forms
 
                 dgv_PrescriptionInfo.DataSource = dt2;
             }
+
+            Global.inf.appId = "8B7E69400A55431DAAE3043AD881B0B5";
+            Global.inf.secretKey = "5011A6002FA041AB8431DCB49854B7A8";
+            Global.inf.privateKey = "Cy4Fh9fdVSNfiPRp98W2c6nMxIcQ3PlwD8IvzRp7kLY=";
+            Global.inf.publicKey = "BCR/UBg3Jy7d2cR56rYl5tRv/fmlTm100GbCCMQVfyLZfwe+7RmU6Xx54HiIcDNk6VgVkQh3fBl60ZODjAeguSg=";
+
         }
 
         private void btnClose_Click(object sender, EventArgs e)
@@ -260,6 +266,8 @@ namespace PTMedicalInsurance.Forms
             #region【7101】电子处方上传预核验             
             JObject joInput = JObject.Parse(outParam);
             joInput["mdtrtinfo"]["mdtrtId"] = Global.pat.mdtrtID;  //取最新的2201医保挂号返回就诊ID
+            joInput["mdtrtinfo"]["fixmedinsCode"] = Global.inf.hospitalNO;
+            joInput["mdtrtinfo"]["fixmedinsName"] = Global.inf.hospitalName;
             joInput["mdtrtinfo"]["psnNo"] = Global.pat.psn_no;
             joInput["mdtrtinfo"]["medType"] = Global.pat.medType;
             joInput["insuPlcNo"] = Global.pat.insuplc_admdvs;          

+ 42 - 16
Helper/InvokeHelper.cs

@@ -44,11 +44,17 @@ namespace PTMedicalInsurance.Helper
             Global.inf.downURL = ini.ReadValue("CENTER", "download");
             Global.inf.ecURL = ini.ReadValue("CENTER", "ecToken");
             Global.inf.mobilePayURL = ini.ReadValue("CENTER", "mobilePay");
+            Global.inf.ecPrescURL = ini.ReadValue("CENTER", "prescription");
             if (string.IsNullOrEmpty(Global.inf.mobilePayURL))
             {
                 Global.inf.mobilePayURL = "http://10.123.185.12:8080";
             }
 
+            if (string.IsNullOrEmpty(Global.inf.ecPrescURL))
+            {
+                Global.inf.ecPrescURL = "http://10.123.185.12:8080/epc/api";
+            }
+
         }
 
 
@@ -497,9 +503,9 @@ namespace PTMedicalInsurance.Helper
         {
             JObject joRtn = new JObject();
             string outPar = "";
-
             try
             {
+                Global.curEvt.URL = Global.inf.ecPrescURL;
                 switch (funNO)
                 {
                     case "7101":
@@ -548,11 +554,6 @@ namespace PTMedicalInsurance.Helper
                             break;
                         }
                 }
-                Global.inf.appId = "8B7E69400A55431DAAE3043AD881B0B5";
-                Global.inf.secretKey = "5011A6002FA041AB8431DCB49854B7A8";
-                Global.inf.privateKey = "Cy4Fh9fdVSNfiPRp98W2c6nMxIcQ3PlwD8IvzRp7kLY=";
-                Global.inf.publicKey = "BCR/UBg3Jy7d2cR56rYl5tRv/fmlTm100GbCCMQVfyLZfwe+7RmU6Xx54HiIcDNk6VgVkQh3fBl60ZODjAeguSg=";
-
                 //Global.curEvt.URL = Global.inf.centerURL;
                 joRtn = invokeEPCenterService(data);
                 outPar = JsonHelper.Compress(joRtn);
@@ -602,20 +603,16 @@ namespace PTMedicalInsurance.Helper
                 //Resquest.headers.Add("x-tif-nonce", nonce);
                 //Resquest.body = signData;
 
-                // 加密参数
-                EncryptHelper encrypt = new EncryptHelper(Global.inf.appId,Global.inf.secretKey,Global.inf.publicKey,Global.inf.privateKey);
-                string signData = "";
-                string output = encrypt.encrypt(data, ref signData);
-
                 //HttpWebRequest req = signer.Sign(Resquest);
                 HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL);
+                req.Method = "POST";
                 req.ContentType = "application/json;charset=utf8";
                 req.Timeout = 5 * 10000;
 
                 try
                 {
                     var writer = new StreamWriter(req.GetRequestStream());
-                    writer.Write(signData);
+                    writer.Write(data);
                     writer.Flush();
                     HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
                     StreamReader reader = new StreamReader(resp.GetResponseStream());
@@ -623,11 +620,40 @@ namespace PTMedicalInsurance.Helper
                     string RtnStr = reader.ReadToEnd();
                     joRtn = JObject.Parse(RtnStr);
                     // 解密返回值
-                    JValue encDataObj = (JValue)joRtn.GetValue("encData");
-                    string encData = encDataObj.ToString();
-                    string decDatas = encrypt.decrypt(encData);
-                    joRtn = JObject.Parse(decDatas);
+                    EncryptHelper encrypt = new EncryptHelper(Global.inf.appId, Global.inf.secretKey, Global.inf.publicKey, Global.inf.privateKey);
+                    string encData = JsonHelper.getDestValue(joRtn, "encData");
+                    string signData = JsonHelper.getDestValue(joRtn, "signData");
+
+                    Global.writeLog("【密文出参】:\r\n" + RtnStr);
+
+                    if (!string.IsNullOrEmpty(encData) && !string.IsNullOrEmpty(signData))
+                    {
+                        joRtn.Remove("encData");
+                        joRtn.Remove("signData");
+                        joRtn.Remove("data");
+                        //解密
+                        string decData = encrypt.decrypt(encData);
+
+                        // 验签
+                        JsonConvert.DefaultSettings = () => new JsonSerializerSettings
+                        {
+                            FloatParseHandling = FloatParseHandling.Decimal
+                        };
+                        joRtn.Add("data", JToken.FromObject(JsonConvert.DeserializeObject(decData)));
+
+                        bool rtn = encrypt.verify(joRtn, signData);
+                        if (rtn)
+                        {
+                            Global.writeLog("【明文出参】:\r\n" + decData);
 
+                            joRtn = JObject.Parse(decData);
+                            joRtn.Add("success", "True");
+                        }
+                        else
+                        {
+                            Global.writeLog("验签失败,请核查!");
+                        }
+                    }
 
                     return joRtn;
                 }

+ 8 - 79
Helper/JsonHelper.cs

@@ -568,92 +568,21 @@ namespace PTMedicalInsurance.Helper
         /// <returns></returns>
         public static string setCenterInparPresCirNew(JObject data)
         {
-            #region【测试环境】
-            /*
-            //应用ID
-            Global.inf.appId = "6582E8493AFE477BB7C6F3A46B5CEB1A"; 
-            //Global.inf.appId = "57E2D561E97141A3871DEFB410ADD920"; 
-            //应用秘钥
-            Global.inf.Secret = "AD3731D4509A4186A177B8701DB4069F";
-            //Global.inf.Secret = "F30D0D261BA04063A0BCAEF19F8ADBCC";
-            //应用私钥
-            Global.inf.privateKey = "ANxsfa0qU4Oc4WBG/oA41Z4+goGfJW/ovzz47VQcunKd";    //中心邮件下发 
-            //Global.inf.privateKey = "AKyhfvPbT+tIJHJkZSDILrw7t+FOG1U58UcupYYTzCOj";  //中心Demo
-            //应用公钥
-            //Global.inf.publicKey = "BKRejz4MwM8G8Krc4hyIIvhphvwrQpnHIsGWTd0sn0TJYr2eKJGAv87AKnrT8pL50H6hdVHdU0FFaL18GApDEbU"; //中心邮件下发
-            Global.inf.publicKey = "BIFd2+2CgjuPAj5FMj5L/L3azTWu86suPtlIJkCo8zjQ44R7SQUUkTgZGdVelRQCM5pW+x9tZGzDPaUNbfD499w=";  //中心Demo
-           
-            Global.inf.cardURL = "http://10.126.105.66/hsa-hgs-adapt/api/card/initDll";   //测试环境
-            Global.inf.presCenterURL = "http://10.126.40.12:8080/epc/api";
-             */
-            #endregion
-
-            #region【正式环境】
-            if (Global.inf.interfaceDr == 21) //兰2
-            {
-                //应用ID
-                Global.inf.appId = "4D967CAB5DA44E3583F4246D7FE897F0";
-                //应用秘钥
-                Global.inf.privateKey = "586BD24D03E5481C8AE4FE9DD8424FFE";
-                //应用私钥
-                Global.inf.secretKey = "XTbX+Tt1np5Fma0+twhYi+vtM4J0UJ8VX5fFEZ7t/ro=";
-                //应用公钥            
-                Global.inf.publicKey = "BIFd2+2CgjuPAj5FMj5L/L3azTWu86suPtlIJkCo8zjQ44R7SQUUkTgZGdVelRQCM5pW+x9tZGzDPaUNbfD499w=";
-            }
-
-            Global.curEvt.URL = "http://10.126.34.36:8080/epc/api";
-            #endregion
-
-            Global.writeLog("密钥id:" + Global.inf.appId);
-            Global.writeLog("密钥key:" + Global.inf.secretKey);
-            Global.writeLog("定点医药机构私钥:" + Global.inf.privateKey);
-            Global.writeLog("医保电子处方中心公钥:" + Global.inf.publicKey);
+            EncryptHelper encrypt = new EncryptHelper();
 
-            //Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
-            string timestamp = ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds).ToString();
-            Global.curEvt.msgid = timestamp;
+            string txtData = JsonHelper.toJsonString(data);
 
-            JObject requestData = new JObject();
-            requestData.Add("appId", Global.inf.appId);
-            //requestData.Add("version", "2.0.1");
-            requestData.Add("encType", "SM4");
-            requestData.Add("signType", "SM2");
-            requestData.Add("timestamp", timestamp);
+            string plainText = SignUtil.SortInput(data);
 
-            //加密
-            String encData = SMUtil.encrypt(JsonConvert.SerializeObject(data, Formatting.None), Global.inf.appId, Global.inf.secretKey);
-            //Global.writeLog("入参加密前:" + "\r\n" + JsonConvert.DeserializeObject(data.ToString()) + "\r\n" + "入参加密后:" + "\r\n" + encData);
+            Global.writeLog("【明文入参】:\r\n" + plainText);
 
-            JObject signDto = (JObject)JObject.Parse(JsonConvert.SerializeObject(requestData, Formatting.None));
-            signDto.Add("data", data);
+            string signData = "";
 
-            //加签
-            String signData = SMUtil.sign(signDto, Global.inf.secretKey, Global.inf.appId);
-            Global.writeLog("签名结果:" + "\r\n" + signData);
+            string output = encrypt.encrypt(txtData, ref signData);
 
-            //报文
-            requestData.Add("encData", encData);
-            requestData.Add("signData", signData);
+            Global.writeLog("【密文入参】:\r\n" + output);
 
-            dynamic Jo = new JObject();
-            Jo.appId = Global.inf.appId;
-            //Jo.version = "2.0.1";
-            Jo.timestamp = timestamp;
-            Jo.encType = "SM4";
-            Jo.signType = "SM2";
-            Jo.signData = signDto.ToString();
-            Jo.encData = data.ToString();
-
-            Global.writeLog("加密前报文:" + "\r\n" + Jo.ToString() + "\r\n" + "加密后报文:" + "\r\n" + JsonConvert.SerializeObject(requestData, Formatting.None));
-
-            //本地解密
-            //String decData = SMUtil.decrypt(encData, Global.inf.appId, Global.inf.Secret);
-            //Global.writeLog("解密:" + decData);
-            //使用应用公钥(publicKey示例默认值)对本地自签名的数据进行验签示例
-            //Boolean isVerify = SMUtil.verify(signDto, Global.inf.Secret, Global.inf.publicKey, signData);
-            //Global.writeLog("验签:" + isVerify);
-
-            return requestData.ToString();
+            return output;
         }
 
         /// <summary>

+ 1 - 1
InsuBusiness.cs

@@ -1558,7 +1558,7 @@ namespace PTMedicalInsurance
                         }
                     case "PrescribeCirculation"://处方流转
                         {
-                            PrescriptionCirculation PresCir = new PrescriptionCirculation("622426199404255223");
+                            PrescriptionCirculation PresCir = new PrescriptionCirculation();
                             PresCir.ShowDialog();
                             break;
                         }

+ 1 - 0
Variables/Struct.cs

@@ -43,6 +43,7 @@ namespace PTMedicalInsurance.Variables
         public string cardURL;
         public string mobilePayURL;
         public string ecURL;
+        public string ecPrescURL;
         public string areaCode;
         public string dllName;
         public string version;