JsonHelper.cs 34 KB

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