JsonHelper.cs 38 KB

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