JsonHelper.cs 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909
  1. /******************************************************************************
  2. * 文件名称: JsonHelper.cs
  3. * 文件说明: Json业务的封装,处理JSON串的封装,解析等
  4. * 当前版本: V1.0
  5. * 创建日期: 2022-04-14
  6. *
  7. * 2020-04-14: 增加 setIrisInpar 方法
  8. * 2020-04-14: 增加 setIrisInpar(重载) 方法
  9. * 2020-04-14: 增加 getIrisExceptionJson 方法
  10. * 2020-04-14: 增加 parseBusinessJson 方法
  11. ******************************************************************************/
  12. using Newtonsoft.Json.Linq;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.Linq;
  16. using System.Text;
  17. using System.Threading.Tasks;
  18. using PTMedicalInsurance.Common;
  19. using System.IO;
  20. using PTMedicalInsurance.Variables;
  21. using Newtonsoft.Json;
  22. using AnHuiMI.Common;
  23. using GMCrypto.Lib;
  24. using System.Windows.Forms;
  25. namespace PTMedicalInsurance.Helper
  26. {
  27. public class JsonHelper
  28. {
  29. public static string toJsonString(object obj,bool missingNull)
  30. {
  31. JsonSerializerSettings settings = new JsonSerializerSettings();
  32. if (missingNull)
  33. {
  34. settings.NullValueHandling = NullValueHandling.Ignore;
  35. }
  36. return JsonConvert.SerializeObject(obj, Formatting.Indented, settings);
  37. }
  38. public static string toJsonString(object obj)
  39. {
  40. return toJsonString(obj,true);
  41. }
  42. public static object toObject(string json)
  43. {
  44. return JsonConvert.DeserializeObject(json);
  45. }
  46. public static T getResult<T>(JObject response)
  47. {
  48. Response resp = response.ToObject<Response>();
  49. if (resp.errorCode == "0")
  50. {
  51. if (resp.result?.GetType() == typeof(JObject))
  52. {
  53. JObject ret = (JObject)resp.result;
  54. JArray lists = ret.Value<JArray>("rows");
  55. if (lists?.Count > 0)
  56. {
  57. return lists.ToObject<T>();
  58. }
  59. else {
  60. return ret.ToObject<T>();
  61. }
  62. }
  63. if (resp.result?.GetType() == typeof(JArray))
  64. {
  65. JArray lists = (JArray)resp.result;
  66. if (lists?.Count > 0)
  67. {
  68. return lists[0].ToObject<T>();
  69. }
  70. }
  71. }
  72. return default;
  73. }
  74. /// <summary>
  75. /// 根据JSonPath查找节点值,如果节点不存在则返回空值
  76. /// </summary>
  77. /// <param name="jo"></param>
  78. /// <param name="jsonPath"></param>
  79. /// <returns></returns>
  80. public static string getDestValue(JObject jo, string destPath)
  81. {
  82. JToken jt = jo.SelectToken("$." + destPath);
  83. if (jt != null)
  84. {
  85. return jt.ToString();
  86. }
  87. else
  88. {
  89. Global.writeLog(destPath + "的JToken属性值为空");
  90. return "";
  91. }
  92. }
  93. public static string getDestProperty(JObject jo, string propertyName)
  94. {
  95. JProperty jp = jo.Property(propertyName);
  96. if (jp != null)
  97. {
  98. string jpStr = jp.ToString();
  99. string rtnResult = "{ " + jpStr + "}";
  100. return rtnResult;
  101. }
  102. else
  103. {
  104. Global.writeLog(propertyName + "的JProperty属性值为空");
  105. return "";
  106. }
  107. }
  108. /// <summary>
  109. /// 压缩JSON,占用体积减小(重载)
  110. /// </summary>
  111. /// <param name="json"></param>
  112. /// <returns></returns>
  113. public static string Compress(string json)
  114. {
  115. StringBuilder sb = new StringBuilder();
  116. using (StringReader reader = new StringReader(json))
  117. {
  118. int ch = -1;
  119. int lastch = -1;
  120. bool isQuoteStart = false;
  121. while ((ch = reader.Read()) > -1)
  122. {
  123. if ((char) lastch != '\\' && (char) ch == '\"')
  124. {
  125. if (!isQuoteStart)
  126. {
  127. isQuoteStart = true;
  128. }
  129. else
  130. {
  131. isQuoteStart = false;
  132. }
  133. }
  134. if (!Char.IsWhiteSpace((char) ch) || isQuoteStart)
  135. {
  136. sb.Append((char) ch);
  137. }
  138. lastch = ch;
  139. }
  140. }
  141. return sb.ToString();
  142. }
  143. public static string Compress(JObject jsonObj)
  144. {
  145. //https://blog.csdn.net/yangjiaosun/article/details/103717256
  146. return Newtonsoft.Json.JsonConvert.SerializeObject(jsonObj);
  147. }
  148. /// <summary>
  149. /// 组织异常JSON串
  150. /// </summary>
  151. /// <param name="errorCode"></param>
  152. /// <param name="errorMessage"></param>
  153. /// <returns></returns>
  154. public static JObject setExceptionJson(int errorCode, string eventName, string errorMessage)
  155. {
  156. dynamic joRtn = new JObject();
  157. joRtn.errorCode = errorCode;
  158. joRtn.errorMessage = eventName + "提示:" + errorMessage;
  159. return joRtn;
  160. }
  161. /// <summary>
  162. /// 组织中心入参(明文)。部分代码是需要解析明文入参的,为了方便增加该方法
  163. /// </summary>
  164. /// <param name="infno"></param>
  165. /// <param name="input"></param>
  166. /// <returns></returns>
  167. public static string setCenterInpar_plain(string infno, string input)
  168. {
  169. return setCenterInpar_plain(infno, (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(input));
  170. }
  171. /// <summary>
  172. /// 组织中心入参(明文)。部分代码是需要解析明文入参的,为了方便增加该方法
  173. /// </summary>
  174. /// <param name="infno"></param>
  175. /// <param name="input"></param>
  176. /// <returns></returns>
  177. public static string setCenterInpar_plain(string infno, JObject joInput)
  178. {
  179. dynamic Jo = new JObject();
  180. Jo.infno = infno;
  181. Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  182. Jo.msgid = Global.curEvt.msgid;
  183. Jo.mdtrtarea_admvs = Global.inf.areaCode;
  184. Global.pat.mdtrtarea_admvs = Jo.mdtrtarea_admvs;
  185. Jo.insuplc_admdvs = Global.pat.insuplc_admdvs;
  186. Jo.recer_sys_code = Global.inf.recivedSystem;
  187. Jo.dev_no = Global.inf.dev_no;
  188. Jo.dev_safe_info = Global.inf.dev_safe_info; //设备编号
  189. Jo.cainfo = Global.inf.cainfo;//设备安全信息
  190. Jo.signtype = Global.inf.signatureType; ;
  191. Jo.infver = Global.inf.version; ;
  192. Jo.opter_type = Global.user.type; ;
  193. Jo.opter = Global.user.ID; ;
  194. Jo.opter_name = Global.user.name; ;
  195. Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  196. Jo.fixmedins_code = Global.inf.hospitalNO;
  197. Jo.fixmedins_name = Global.inf.hospitalName;
  198. Jo.sign_no = Global.curEvt.signno;
  199. Jo.enc_type = "";
  200. Jo.Add("input", joInput);
  201. var request = Utils.Wrapper(Jo);
  202. return request.ToString();
  203. }
  204. /// <summary>
  205. /// 组织中心入参
  206. /// </summary>
  207. /// <param name="infno"></param>
  208. /// <param name="input"></param>
  209. /// <returns></returns>
  210. public static string setCenterInpar(string infno, string input)
  211. {
  212. JObject joInput = (JObject)Newtonsoft.Json.JsonConvert.DeserializeObject(input);
  213. return setCenterInpar(infno, joInput);
  214. }
  215. /// <summary>
  216. /// 移动支付组织中心入参
  217. /// </summary>
  218. /// <param name="infno"></param>
  219. /// <param name="input"></param>
  220. /// <returns></returns>
  221. public static string setMPCenterInpar(string infno, JObject joInput)
  222. {
  223. return setMPCenterInpar(infno, joInput.ToString());
  224. }
  225. public static string setMPCenterInpar(string infno, string txtData)
  226. {
  227. EncryptHelper encrypt = new EncryptHelper();
  228. string plainText = SignUtil.SortInput(JObject.Parse(txtData));
  229. Global.writeLog(infno + "【明文入参】:\r\n" + plainText);
  230. string signData = "";
  231. string output = encrypt.encrypt(txtData, ref signData);
  232. Global.writeLog(infno + "【密文入参】:\r\n" + output);
  233. return output;
  234. }
  235. /// <summary>
  236. /// 组织中心入参
  237. /// </summary>
  238. /// <param name="infno"></param>
  239. /// <param name="input"></param>
  240. /// <returns></returns>
  241. public static string setCenterInpar(string infno, JObject joInput)
  242. {
  243. dynamic Jo = new JObject();
  244. Jo.infno = infno;
  245. Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  246. Jo.msgid = Global.curEvt.msgid;
  247. if (string.IsNullOrEmpty(Global.inf.areaCode)) {
  248. Global.inf.areaCode = "340100";
  249. }
  250. if (string.IsNullOrEmpty(Global.pat.insuplc_admdvs))
  251. {
  252. Global.pat.insuplc_admdvs = Global.inf.areaCode;
  253. }
  254. // 参保地
  255. Jo.insuplc_admdvs = Global.pat.insuplc_admdvs;
  256. // 就医地
  257. Jo.mdtrtarea_admvs = Global.inf.areaCode;
  258. //if(Global.pat.insuplc_admdvs == "340001"&& infno=="1101"&& Global.inf.interfaceDr==12)
  259. //{
  260. // Jo.insuplc_admdvs = "349900";
  261. //}
  262. Jo.recer_sys_code = "MBS_LOCAL";
  263. Jo.dev_no = "2021";
  264. Jo.dev_safe_info = Global.inf.dev_safe_info; //设备编号
  265. Jo.signtype = "SM2"; ;
  266. Jo.infver = "v1.0";
  267. Jo.opter_type = Global.user.type; ;
  268. if(Global.inf.interfaceDr == 12)//安徽省基线版-瑶海
  269. {
  270. Jo.opter = "A05CA9455BE8BF66";
  271. }
  272. if (Global.inf.interfaceDr == 16)//合肥市基线版-瑶海
  273. {
  274. Jo.opter = "7571C4995A2F4290";
  275. }
  276. if (Global.inf.interfaceDr == 15)//安徽省基线版-蜀山老院
  277. {
  278. Jo.opter = "48664E4455CC0F8F";
  279. }
  280. if (Global.inf.interfaceDr == 17)//合肥市基线版-蜀山老院
  281. {
  282. Jo.opter = "4D91C975CF902EB2";
  283. }
  284. if (Global.inf.interfaceDr == 40)//合肥市基线版-庐江门诊
  285. {
  286. Jo.opter = "F7A80649CD515C55";
  287. }
  288. if (Global.inf.interfaceDr == 52)//合肥市基线版-经开区门诊
  289. {
  290. Jo.opter = "F2D71DD91690A813";
  291. }
  292. if ((Global.inf.interfaceDr == 63)|| (Global.inf.interfaceDr == 63))//医保电子处方测试
  293. {
  294. Jo.opter = "888888";
  295. }
  296. //Jo.opter = Global.user.ID; ;
  297. Jo.opter_name = Global.user.name; ;
  298. Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  299. Jo.fixmedins_code = Global.inf.hospitalNO;
  300. Jo.fixmedins_name = Global.inf.hospitalName;
  301. Jo.sign_no = Global.curEvt.signno;
  302. //Jo.app_id = "";
  303. Jo.enc_type = "";
  304. //Jo.pw_ecToken = "";
  305. // 报文签名(不包含cainfo和input)
  306. //EncryptHelper encrypt = new EncryptHelper();
  307. Jo.cainfo = ""; // encrypt.signWithSM2(Jo);
  308. if (joInput != null)
  309. {
  310. Jo.Add("input", joInput);
  311. }
  312. else
  313. {
  314. Jo.Add("input", "");
  315. }
  316. // 下载不需要wrapper
  317. if (("9102".Equals(infno)) || ("10001".Equals(infno)))
  318. {
  319. return JsonHelper.toJsonString(Jo);
  320. }
  321. var request = Utils.Wrapper(Jo);
  322. return JsonHelper.toJsonString(request);
  323. }
  324. /// <summary>
  325. /// 组织中心入参
  326. /// </summary>
  327. /// <param name="infno"></param>
  328. /// <param name="input"></param>
  329. /// <returns></returns>
  330. public static string setCenterInparF(string infno, JObject joInput)
  331. {
  332. dynamic Jo = new JObject();
  333. Jo.infno = infno;
  334. Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  335. Jo.msgid = Global.curEvt.msgid;
  336. if (string.IsNullOrEmpty(Global.inf.areaCode))
  337. {
  338. Global.inf.areaCode = "340100";
  339. }
  340. if (string.IsNullOrEmpty(Global.pat.insuplc_admdvs))
  341. {
  342. Global.pat.insuplc_admdvs = Global.inf.areaCode;
  343. }
  344. // 参保地
  345. Jo.insuplc_admdvs = Global.pat.insuplc_admdvs;
  346. // 就医地
  347. Jo.mdtrtarea_admvs = Global.inf.areaCode;
  348. //if(Global.pat.insuplc_admdvs == "340001"&& infno=="1101"&& Global.inf.interfaceDr==12)
  349. //{
  350. // Jo.insuplc_admdvs = "349900";
  351. //}
  352. Jo.recer_sys_code = "MBS_LOCAL";
  353. Jo.dev_no = "2021";
  354. Jo.dev_safe_info = Global.inf.dev_safe_info; //设备编号
  355. Jo.signtype = "SM2"; ;
  356. Jo.infver = "v1.0";
  357. Jo.opter_type = Global.user.type; ;
  358. if (Global.inf.interfaceDr == 12)//安徽省基线版-瑶海
  359. {
  360. Jo.opter = "A05CA9455BE8BF66";
  361. }
  362. if (Global.inf.interfaceDr == 16)//合肥市基线版-瑶海
  363. {
  364. Jo.opter = "7571C4995A2F4290";
  365. }
  366. if (Global.inf.interfaceDr == 15)//安徽省基线版-蜀山老院
  367. {
  368. Jo.opter = "48664E4455CC0F8F";
  369. }
  370. if (Global.inf.interfaceDr == 17)//合肥市基线版-蜀山老院
  371. {
  372. Jo.opter = "4D91C975CF902EB2";
  373. }
  374. if (Global.inf.interfaceDr == 40)//合肥市基线版-庐江门诊
  375. {
  376. Jo.opter = "F7A80649CD515C55";
  377. }
  378. if (Global.inf.interfaceDr == 52)//合肥市基线版-经开区门诊
  379. {
  380. Jo.opter = "F2D71DD91690A813";
  381. }
  382. if ((Global.inf.interfaceDr == 63) || (Global.inf.interfaceDr == 63))//医保电子处方测试
  383. {
  384. Jo.opter = "888888";
  385. }
  386. //Jo.opter = Global.user.ID; ;
  387. Jo.opter_name = Global.user.name; ;
  388. Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  389. Jo.fixmedins_code = Global.inf.hospitalNO;
  390. Jo.fixmedins_name = Global.inf.hospitalName;
  391. Jo.sign_no = Global.curEvt.signno;
  392. //Jo.app_id = "";
  393. Jo.enc_type = "";
  394. //Jo.pw_ecToken = "";
  395. // 报文签名(不包含cainfo和input)
  396. //EncryptHelper encrypt = new EncryptHelper();
  397. Jo.cainfo = infno; // encrypt.signWithSM2(Jo);
  398. if (joInput != null)
  399. {
  400. Jo.Add("input", joInput);
  401. }
  402. else
  403. {
  404. Jo.Add("input", "");
  405. }
  406. return JsonHelper.toJsonString(Jo);
  407. }
  408. /// <summary>
  409. /// 组织中心入参
  410. /// </summary>
  411. /// <param name="infno"></param>
  412. /// <param name="input"></param>
  413. /// <returns></returns>
  414. public static string setCenterInparFT(string infno, JObject joInput)
  415. {
  416. dynamic Jo = new JObject();
  417. Jo.cainfo = infno;
  418. Jo.dev_no = "string";
  419. Jo.dev_safe_info = "string";
  420. Jo.fixmedins_code = Global.inf.hospitalNO;
  421. Jo.fixmedins_name = Global.inf.hospitalName;
  422. Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  423. Jo.infno = "string";
  424. Jo.infver = "string";
  425. if (string.IsNullOrEmpty(Global.inf.areaCode))
  426. {
  427. Global.inf.areaCode = "340100";
  428. }
  429. if (string.IsNullOrEmpty(Global.pat.insuplc_admdvs))
  430. {
  431. Global.pat.insuplc_admdvs = Global.inf.areaCode;
  432. }
  433. // 参保地
  434. Jo.insuplc_admdvs = Global.pat.insuplc_admdvs;
  435. // 就医地
  436. Jo.mdtrtarea_admvs = Global.inf.areaCode;
  437. Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  438. Jo.msgid = Global.curEvt.msgid;
  439. if (Global.inf.interfaceDr == 12)//安徽省基线版-瑶海
  440. {
  441. Jo.opter = "A05CA9455BE8BF66";
  442. }
  443. if (Global.inf.interfaceDr == 16)//合肥市基线版-瑶海
  444. {
  445. Jo.opter = "7571C4995A2F4290";
  446. }
  447. if (Global.inf.interfaceDr == 15)//安徽省基线版-蜀山老院
  448. {
  449. Jo.opter = "48664E4455CC0F8F";
  450. }
  451. if (Global.inf.interfaceDr == 17)//合肥市基线版-蜀山老院
  452. {
  453. Jo.opter = "4D91C975CF902EB2";
  454. }
  455. if (Global.inf.interfaceDr == 40)//合肥市基线版-庐江门诊
  456. {
  457. Jo.opter = "F7A80649CD515C55";
  458. }
  459. if (Global.inf.interfaceDr == 52)//合肥市基线版-经开区门诊
  460. {
  461. Jo.opter = "F2D71DD91690A813";
  462. }
  463. if ((Global.inf.interfaceDr == 63) || (Global.inf.interfaceDr == 63))//医保电子处方测试
  464. {
  465. Jo.opter = "888888";
  466. }
  467. Jo.opter_name = Global.user.name; ;
  468. Jo.opter_type = Global.user.type;
  469. Jo.recer_sys_code = "MBS_LOCAL";
  470. Jo.sign_no = Global.curEvt.signno;
  471. if (joInput != null)
  472. {
  473. Jo.Add("input", joInput);
  474. }
  475. else
  476. {
  477. Jo.Add("input", "");
  478. }
  479. return JsonHelper.toJsonString(Jo);
  480. }
  481. /// <summary>
  482. /// 组织中心入参-医保电子处方流转
  483. /// </summary>
  484. /// <param name="infno"></param>
  485. /// <param name="input"></param>
  486. /// <returns></returns>
  487. public static string setCenterInparPresCirNew(JObject data)
  488. {
  489. #region【正式环境】
  490. //if (Global.inf.interfaceDr == 21) //兰2
  491. //{
  492. // //应用ID
  493. // Global.inf.appId = "4D967CAB5DA44E3583F4246D7FE897F0";
  494. // //应用秘钥
  495. // Global.inf.Secret = "586BD24D03E5481C8AE4FE9DD8424FFE";
  496. // //应用私钥
  497. // Global.inf.privateKey = "XTbX+Tt1np5Fma0+twhYi+vtM4J0UJ8VX5fFEZ7t/ro=";
  498. // //应用公钥
  499. // Global.inf.publicKey = "BIFd2+2CgjuPAj5FMj5L/L3azTWu86suPtlIJkCo8zjQ44R7SQUUkTgZGdVelRQCM5pW+x9tZGzDPaUNbfD499w=";
  500. //}
  501. //else if (Global.inf.interfaceDr == 25) //兰1
  502. //{
  503. // //应用ID
  504. // Global.inf.appId = "6C9B786AF7E848B29B0EF5783D630263";
  505. // //应用秘钥
  506. // Global.inf.Secret = "6055AE5A9CAD4D9BA8A98EB20431364E";
  507. // //应用私钥
  508. // Global.inf.privateKey = "AKReZmOYcTOdbrnlZZFIXn8LQSHPzdAK1Q0CXDnE4Jhk";
  509. // //应用公钥
  510. // Global.inf.publicKey = "BIFd2+2CgjuPAj5FMj5L/L3azTWu86suPtlIJkCo8zjQ44R7SQUUkTgZGdVelRQCM5pW+x9tZGzDPaUNbfD499w=";
  511. //}
  512. //Global.inf.presCenterURL = "http://10.126.34.36:8080/epc/api";
  513. IniFile ini = new IniFile(Global.curEvt.path + @"\INSUConfigure.ini");
  514. //医保电子处方密钥相关
  515. //应用ID
  516. Global.inf.appId = ini.ReadValue("PrescriptionCirculation", "appId");
  517. //应用秘钥
  518. Global.inf.Secret = ini.ReadValue("PrescriptionCirculation", "Secret");
  519. //应用私钥
  520. Global.inf.privateKey = ini.ReadValue("PrescriptionCirculation", "privateKey");
  521. //应用公钥
  522. Global.inf.publicKey = ini.ReadValue("PrescriptionCirculation", "publicKey");
  523. Global.inf.presCenterURL = ini.ReadValue("PrescriptionCirculation", "presCenterURL");
  524. #endregion
  525. Global.writeLog("密钥id:" + Global.inf.appId);
  526. Global.writeLog("密钥key:" + Global.inf.Secret);
  527. Global.writeLog("定点医药机构私钥:" + Global.inf.privateKey);
  528. Global.writeLog("医保电子处方中心公钥:" + Global.inf.publicKey);
  529. Global.writeLog("医保电子处方中心地址:" + Global.inf.presCenterURL);
  530. //Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  531. string timestamp = ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds).ToString();
  532. Global.curEvt.msgid = timestamp;
  533. JObject requestData = new JObject();
  534. requestData.Add("appId", Global.inf.appId);
  535. //requestData.Add("version", "2.0.1");
  536. requestData.Add("encType", "SM4");
  537. requestData.Add("signType", "SM2");
  538. requestData.Add("timestamp", timestamp);
  539. //MessageBox.Show("1:" + requestData.ToString());
  540. //加密
  541. String encData = SMUtil.encrypt(JsonConvert.SerializeObject(data, Formatting.None), Global.inf.appId, Global.inf.Secret);
  542. //Global.writeLog("入参加密前:" + "\r\n" + JsonConvert.DeserializeObject(data.ToString()) + "\r\n" + "入参加密后:" + "\r\n" + encData);
  543. //MessageBox.Show("2:" + encData.ToString());
  544. JObject signDto = (JObject)JObject.Parse(JsonConvert.SerializeObject(requestData, Formatting.None));
  545. signDto.Add("data", data);
  546. //加签
  547. String signData = SMUtil.sign(signDto, Global.inf.Secret, Global.inf.privateKey);
  548. Global.writeLog("签名结果:" + "\r\n" + signData);
  549. //MessageBox.Show("3:" + signData.ToString());
  550. //报文
  551. requestData.Add("encData", encData);
  552. requestData.Add("signData", signData);
  553. //MessageBox.Show("9:"+requestData.ToString());
  554. dynamic Jo = new JObject();
  555. Jo.appId = Global.inf.appId;
  556. Jo.timestamp = timestamp;
  557. Jo.encType = "SM4";
  558. Jo.signType = "SM2";
  559. Jo.signData = signDto.ToString();
  560. Jo.encData = data.ToString();
  561. Global.writeLog("signDto:" + signDto);
  562. Global.writeLog("data:" + data);
  563. //Global.writeLog("加密前报文:" + "\r\n" + Jo.ToString() + "\r\n" + "加密后报文:" + "\r\n" + JsonConvert.SerializeObject(requestData, Formatting.None));
  564. //本地解密
  565. //String decData = SMUtil.decrypt(encData, Global.inf.appId, Global.inf.Secret);
  566. //Global.writeLog("解密:" + decData);
  567. //使用应用公钥(publicKey示例默认值)对本地自签名的数据进行验签示例
  568. //Boolean isVerify = SMUtil.verify(signDto, Global.inf.Secret, Global.inf.publicKey, signData);
  569. //Global.writeLog("验签:" + isVerify);
  570. return requestData.ToString();
  571. }
  572. /// <summary>
  573. /// 组织Iris入参
  574. /// </summary>
  575. /// <param name="code"></param>
  576. /// <param name="joParam"></param>
  577. /// <returns></returns>
  578. public static JObject setIrisInparPres(string code, JObject joParam)
  579. {
  580. try
  581. {
  582. dynamic joInparam = new JObject();
  583. joInparam.code = code;
  584. dynamic joTmp = new JObject();
  585. JArray jaParam = new JArray();
  586. //// 去掉包装
  587. //JObject joInput = Utils.removeWrapper(joParam);
  588. //jaParam.Add(joInput);
  589. jaParam.Add(joParam);
  590. joInparam.Add("params", JArray.FromObject(jaParam));
  591. joInparam.Add("session", Global.curEvt.jaSession);
  592. return joInparam;
  593. }
  594. catch (Exception ex)
  595. {
  596. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  597. }
  598. }
  599. /// <summary>
  600. /// 组织Iris入参
  601. /// </summary>
  602. /// <param name="code"></param>
  603. /// <param name="joParam"></param>
  604. /// <returns></returns>
  605. public static JObject setIrisInpar(string code, JObject joParam)
  606. {
  607. try
  608. {
  609. dynamic joInparam = new JObject();
  610. joInparam.code = code;
  611. dynamic joTmp = new JObject();
  612. JArray jaParam = new JArray();
  613. // 去掉包装
  614. JObject joInput = Utils.removeWrapper(joParam);
  615. jaParam.Add(joInput);
  616. joInparam.Add("params", JArray.FromObject(jaParam));
  617. joInparam.Add("session", Global.curEvt.jaSession);
  618. return joInparam;
  619. }
  620. catch (Exception ex)
  621. {
  622. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  623. }
  624. }
  625. /// <summary>
  626. /// 组织Iris入参
  627. /// </summary>
  628. /// <param name="code"></param>
  629. /// <param name="joParam"></param>
  630. /// <returns></returns>
  631. public static JObject setIrisInpar(string code, JArray jaParams)
  632. {
  633. try
  634. {
  635. dynamic joInparam = new JObject();
  636. joInparam.code = code;
  637. dynamic joTmp = new JObject();
  638. joInparam.Add("params", jaParams);
  639. joInparam.Add("session", Global.curEvt.jaSession);
  640. return joInparam;
  641. }
  642. catch (Exception ex)
  643. {
  644. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  645. }
  646. }
  647. /// <summary>
  648. /// 解析医保电子处方中心返参
  649. /// </summary>
  650. /// <param name="joRtn"></param>
  651. /// <param name="errorMsg"></param>
  652. /// <returns></returns>
  653. public static int parseCenterRtnValuePresCir(JObject joRtn, out string errorMsg)
  654. {
  655. try
  656. {
  657. string errcode = getDestValue(joRtn, "errcode");
  658. string errorCode = getDestValue(joRtn, "errorCode");
  659. if (errcode != "")
  660. {
  661. errorMsg = getDestValue(joRtn, "message");
  662. return -1;
  663. }
  664. else if (errorCode != "")
  665. {
  666. errorMsg = getDestValue(joRtn, "errorMessage");
  667. return -2;
  668. }
  669. else
  670. {
  671. errorMsg = getDestValue(joRtn, "message");
  672. return int.Parse(getDestValue(joRtn, "code"));
  673. }
  674. }
  675. catch (Exception ex)
  676. {
  677. errorMsg = "解析中心返参发生异常:" + ex.Message;
  678. return -1;
  679. }
  680. }
  681. /// <summary>
  682. /// 解析中心返参
  683. /// </summary>
  684. /// <param name="joRtn"></param>
  685. /// <param name="errorMsg"></param>
  686. /// <returns></returns>
  687. public static int parseCenterRtnValue(JObject joRtn, out string errorMsg)
  688. {
  689. try
  690. {
  691. string errcode = getDestValue(joRtn, "errcode");
  692. string errorCode = getDestValue(joRtn, "errorCode");
  693. if (errcode != "")
  694. {
  695. errorMsg = getDestValue(joRtn, "errmsg");
  696. return -1;
  697. }
  698. else if (errorCode != "")
  699. {
  700. errorMsg = getDestValue(joRtn, "errorMessage");
  701. return -2;
  702. }
  703. else
  704. {
  705. errorMsg = getDestValue(joRtn, "err_msg");
  706. return int.Parse(getDestValue(joRtn, "infcode"));
  707. }
  708. }
  709. catch (Exception ex)
  710. {
  711. errorMsg = "解析中心返参发生异常:" + ex.Message;
  712. return -1;
  713. }
  714. }
  715. /// <summary>
  716. /// 解析移动返参
  717. /// </summary>
  718. /// <param name="joRtn"></param>
  719. /// <param name="errorMsg"></param>
  720. /// <returns></returns>
  721. public static int parseMPRtnValue(JObject joRtn, out string errorMsg)
  722. {
  723. try
  724. {
  725. string success = getDestValue(joRtn, "success");
  726. string message = getDestValue(joRtn, "message");
  727. string encData = getDestValue(joRtn, "encData");
  728. if (success != "True")
  729. {
  730. errorMsg = message;
  731. return -1;
  732. }
  733. else
  734. {
  735. errorMsg = joRtn.ToString();
  736. return 0;
  737. }
  738. }
  739. catch (Exception ex)
  740. {
  741. errorMsg = "解析中心返参发生异常:" + ex.Message;
  742. return -1;
  743. }
  744. }
  745. /// <summary>
  746. /// 组织IRIS返参
  747. /// </summary>
  748. /// <param name="errorCode"></param>
  749. /// <param name="errorMessage"></param>
  750. /// <param name="joResult"></param>
  751. /// <returns></returns>
  752. public static JObject setIrisReturnValue(int errorCode, string errorMessage, JObject joResult)
  753. {
  754. try
  755. {
  756. dynamic joRtn = new JObject();
  757. joRtn.errorCode = errorCode;
  758. joRtn.errorMessage = errorMessage;
  759. joRtn.Add("result", joResult);
  760. return joRtn;
  761. }
  762. catch (Exception ex)
  763. {
  764. return setExceptionJson(-1, "setIrisReturnValue:", ex.Message);
  765. }
  766. }
  767. /// <summary>
  768. /// 解析IRIS返参
  769. /// </summary>
  770. /// <param name="joRtn"></param>
  771. /// <param name="errorMsg"></param>
  772. /// <returns></returns>
  773. public static int parseIrisRtnValue(JObject joRtn, out string errorMsg)
  774. {
  775. try
  776. {
  777. errorMsg = getDestValue(joRtn, "errorMessage");
  778. return int.Parse(getDestValue(joRtn, "errorCode"));
  779. }
  780. catch (Exception ex)
  781. {
  782. errorMsg = "解析Iris返参发生异常:" + ex.Message;
  783. return -1;
  784. }
  785. }
  786. /// <summary>
  787. /// 解析业务JSON串(业务串固定格式为{errorCode = ,errorMessage = ,result ={}})
  788. /// </summary>
  789. /// <param name="json"></param>
  790. /// <param name="errorMsg"></param>
  791. /// <returns></returns>
  792. public static int parseCenterReturnJson(JObject json, out string errorMsg)
  793. {
  794. try
  795. {
  796. errorMsg = "";
  797. if (int.Parse(json["infcode"].ToString()) != 0)
  798. {
  799. errorMsg = json["err_msg"].ToString();
  800. }
  801. return int.Parse(json["infcode"].ToString());
  802. }
  803. catch (Exception ex)
  804. {
  805. errorMsg = "parseCenterReturnJson" + ex.Message;
  806. return -1;
  807. }
  808. }
  809. }
  810. }