JsonHelper.cs 37 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067
  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. EncryptHelper encrypt = new EncryptHelper();
  247. string plainText = SignUtil.SortInput(JObject.Parse(txtData));
  248. Global.writeLog(infno + "【明文入参】:\r\n" + plainText);
  249. string signData = "";
  250. string output = encrypt.encrypt(txtData, ref signData);
  251. Global.writeLog(infno + "【密文入参】:\r\n" + output);
  252. return output;
  253. }
  254. /// <summary>
  255. /// 组织中心入参
  256. /// </summary>
  257. /// <param name="infno"></param>
  258. /// <param name="input"></param>
  259. /// <returns></returns>
  260. public static string setCenterInpar(string infno, JObject joInput)
  261. {
  262. dynamic Jo = new JObject();
  263. Jo.infno = infno;
  264. Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  265. Jo.msgid = Global.curEvt.msgid;
  266. if (string.IsNullOrEmpty(Global.inf.areaCode)) {
  267. Global.inf.areaCode = "340100";
  268. }
  269. if (string.IsNullOrEmpty(Global.pat.insuplc_admdvs))
  270. {
  271. Global.pat.insuplc_admdvs = Global.inf.areaCode;
  272. }
  273. // 参保地
  274. Jo.insuplc_admdvs = Global.pat.insuplc_admdvs;
  275. // 就医地
  276. Jo.mdtrtarea_admvs = Global.inf.areaCode;
  277. //if(Global.pat.insuplc_admdvs == "340001"&& infno=="1101"&& Global.inf.interfaceDr==12)
  278. //{
  279. // Jo.insuplc_admdvs = "349900";
  280. //}
  281. Jo.recer_sys_code = "MBS_LOCAL";
  282. Jo.dev_no = "2021";
  283. Jo.dev_safe_info = Global.inf.dev_safe_info; //设备编号
  284. Jo.signtype = "SM2"; ;
  285. Jo.infver = "v1.0";
  286. Jo.opter_type = Global.user.type; ;
  287. if(Global.inf.interfaceDr == 12)//安徽省基线版-瑶海
  288. {
  289. Jo.opter = "A05CA9455BE8BF66";
  290. }
  291. if (Global.inf.interfaceDr == 16)//合肥市基线版-瑶海
  292. {
  293. Jo.opter = "7571C4995A2F4290";
  294. }
  295. if (Global.inf.interfaceDr == 15)//安徽省基线版-蜀山老院
  296. {
  297. Jo.opter = "48664E4455CC0F8F";
  298. }
  299. if (Global.inf.interfaceDr == 17)//合肥市基线版-蜀山老院
  300. {
  301. Jo.opter = "4D91C975CF902EB2";
  302. }
  303. if (Global.inf.interfaceDr == 40)//合肥市基线版-庐江门诊
  304. {
  305. Jo.opter = "F7A80649CD515C55";
  306. }
  307. if (Global.inf.interfaceDr == 52)//合肥市基线版-经开区门诊
  308. {
  309. Jo.opter = "F2D71DD91690A813";
  310. }
  311. if ((Global.inf.interfaceDr == 63)|| (Global.inf.interfaceDr == 63))//医保电子处方测试
  312. {
  313. Jo.opter = "888888";
  314. }
  315. //Jo.opter = Global.user.ID; ;
  316. Jo.opter_name = Global.user.name; ;
  317. Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  318. Jo.fixmedins_code = Global.inf.hospitalNO;
  319. Jo.fixmedins_name = Global.inf.hospitalName;
  320. Jo.sign_no = Global.curEvt.signno;
  321. //Jo.app_id = "";
  322. Jo.enc_type = "";
  323. //Jo.pw_ecToken = "";
  324. // 报文签名(不包含cainfo和input)
  325. //EncryptHelper encrypt = new EncryptHelper();
  326. Jo.cainfo = ""; // encrypt.signWithSM2(Jo);
  327. if (joInput != null)
  328. {
  329. Jo.Add("input", joInput);
  330. }
  331. else
  332. {
  333. Jo.Add("input", "");
  334. }
  335. // 下载不需要wrapper
  336. if (("9102".Equals(infno)) || ("10001".Equals(infno)))
  337. {
  338. return JsonHelper.toJsonString(Jo);
  339. }
  340. var request = Utils.Wrapper(Jo);
  341. return JsonHelper.toJsonString(request);
  342. }
  343. /// <summary>
  344. /// 组织中心入参
  345. /// </summary>
  346. /// <param name="infno"></param>
  347. /// <param name="input"></param>
  348. /// <returns></returns>
  349. public static string setCenterInparF(string infno, JObject joInput)
  350. {
  351. dynamic Jo = new JObject();
  352. Jo.infno = infno;
  353. Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  354. Jo.msgid = Global.curEvt.msgid;
  355. if (string.IsNullOrEmpty(Global.inf.areaCode))
  356. {
  357. Global.inf.areaCode = "340100";
  358. }
  359. if (string.IsNullOrEmpty(Global.pat.insuplc_admdvs))
  360. {
  361. Global.pat.insuplc_admdvs = Global.inf.areaCode;
  362. }
  363. // 参保地
  364. Jo.insuplc_admdvs = Global.pat.insuplc_admdvs;
  365. // 就医地
  366. Jo.mdtrtarea_admvs = Global.inf.areaCode;
  367. //if(Global.pat.insuplc_admdvs == "340001"&& infno=="1101"&& Global.inf.interfaceDr==12)
  368. //{
  369. // Jo.insuplc_admdvs = "349900";
  370. //}
  371. Jo.recer_sys_code = "MBS_LOCAL";
  372. Jo.dev_no = "2021";
  373. Jo.dev_safe_info = Global.inf.dev_safe_info; //设备编号
  374. Jo.signtype = "SM2"; ;
  375. Jo.infver = "v1.0";
  376. Jo.opter_type = Global.user.type; ;
  377. if (Global.inf.interfaceDr == 12)//安徽省基线版-瑶海
  378. {
  379. Jo.opter = "A05CA9455BE8BF66";
  380. }
  381. if (Global.inf.interfaceDr == 16)//合肥市基线版-瑶海
  382. {
  383. Jo.opter = "7571C4995A2F4290";
  384. }
  385. if (Global.inf.interfaceDr == 15)//安徽省基线版-蜀山老院
  386. {
  387. Jo.opter = "48664E4455CC0F8F";
  388. }
  389. if (Global.inf.interfaceDr == 17)//合肥市基线版-蜀山老院
  390. {
  391. Jo.opter = "4D91C975CF902EB2";
  392. }
  393. if (Global.inf.interfaceDr == 40)//合肥市基线版-庐江门诊
  394. {
  395. Jo.opter = "F7A80649CD515C55";
  396. }
  397. if (Global.inf.interfaceDr == 52)//合肥市基线版-经开区门诊
  398. {
  399. Jo.opter = "F2D71DD91690A813";
  400. }
  401. if ((Global.inf.interfaceDr == 63) || (Global.inf.interfaceDr == 63))//医保电子处方测试
  402. {
  403. Jo.opter = "888888";
  404. }
  405. //Jo.opter = Global.user.ID; ;
  406. Jo.opter_name = Global.user.name; ;
  407. Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  408. Jo.fixmedins_code = Global.inf.hospitalNO;
  409. Jo.fixmedins_name = Global.inf.hospitalName;
  410. Jo.sign_no = Global.curEvt.signno;
  411. //Jo.app_id = "";
  412. Jo.enc_type = "";
  413. //Jo.pw_ecToken = "";
  414. // 报文签名(不包含cainfo和input)
  415. //EncryptHelper encrypt = new EncryptHelper();
  416. Jo.cainfo = infno; // encrypt.signWithSM2(Jo);
  417. if (joInput != null)
  418. {
  419. Jo.Add("input", joInput);
  420. }
  421. else
  422. {
  423. Jo.Add("input", "");
  424. }
  425. return JsonHelper.toJsonString(Jo);
  426. }
  427. /// <summary>
  428. /// 组织中心入参
  429. /// </summary>
  430. /// <param name="infno"></param>
  431. /// <param name="input"></param>
  432. /// <returns></returns>
  433. public static string setCenterInparFT(string infno, JObject joInput)
  434. {
  435. dynamic Jo = new JObject();
  436. Jo.cainfo = infno;
  437. Jo.dev_no = "string";
  438. Jo.dev_safe_info = "string";
  439. Jo.fixmedins_code = Global.inf.hospitalNO;
  440. Jo.fixmedins_name = Global.inf.hospitalName;
  441. Jo.inf_time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
  442. Jo.infno = "string";
  443. Jo.infver = "string";
  444. if (string.IsNullOrEmpty(Global.inf.areaCode))
  445. {
  446. Global.inf.areaCode = "340100";
  447. }
  448. if (string.IsNullOrEmpty(Global.pat.insuplc_admdvs))
  449. {
  450. Global.pat.insuplc_admdvs = Global.inf.areaCode;
  451. }
  452. // 参保地
  453. Jo.insuplc_admdvs = Global.pat.insuplc_admdvs;
  454. // 就医地
  455. Jo.mdtrtarea_admvs = Global.inf.areaCode;
  456. Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  457. Jo.msgid = Global.curEvt.msgid;
  458. if (Global.inf.interfaceDr == 12)//安徽省基线版-瑶海
  459. {
  460. Jo.opter = "A05CA9455BE8BF66";
  461. }
  462. if (Global.inf.interfaceDr == 16)//合肥市基线版-瑶海
  463. {
  464. Jo.opter = "7571C4995A2F4290";
  465. }
  466. if (Global.inf.interfaceDr == 15)//安徽省基线版-蜀山老院
  467. {
  468. Jo.opter = "48664E4455CC0F8F";
  469. }
  470. if (Global.inf.interfaceDr == 17)//合肥市基线版-蜀山老院
  471. {
  472. Jo.opter = "4D91C975CF902EB2";
  473. }
  474. if (Global.inf.interfaceDr == 40)//合肥市基线版-庐江门诊
  475. {
  476. Jo.opter = "F7A80649CD515C55";
  477. }
  478. if (Global.inf.interfaceDr == 52)//合肥市基线版-经开区门诊
  479. {
  480. Jo.opter = "F2D71DD91690A813";
  481. }
  482. if ((Global.inf.interfaceDr == 63) || (Global.inf.interfaceDr == 63))//医保电子处方测试
  483. {
  484. Jo.opter = "888888";
  485. }
  486. Jo.opter_name = Global.user.name; ;
  487. Jo.opter_type = Global.user.type;
  488. Jo.recer_sys_code = "MBS_LOCAL";
  489. Jo.sign_no = Global.curEvt.signno;
  490. if (joInput != null)
  491. {
  492. Jo.Add("input", joInput);
  493. }
  494. else
  495. {
  496. Jo.Add("input", "");
  497. }
  498. return JsonHelper.toJsonString(Jo);
  499. }
  500. /// <summary>
  501. /// 组织合肥医保慢病中心入参
  502. /// </summary>
  503. /// <param name="infno"></param>
  504. /// <param name="input"></param>
  505. /// <returns></returns>
  506. public static string setCenterInparMB(string infno, JObject joInput)
  507. {
  508. dynamic Jo = new JObject();
  509. Global.inf.MBkey = "";
  510. if (Global.inf.interfaceDr == 12)//安徽省基线版-瑶海Jo.appKey
  511. {
  512. Jo.appKey = "BM7T2y5QnPhteXzS";
  513. Global.inf.MBkey= "aYr5XNRKW5SFsDFY";
  514. }
  515. if (Global.inf.interfaceDr == 16)//合肥市基线版-瑶海
  516. {
  517. Jo.appKey = "BM7T2y5QnPhteXzS";
  518. Global.inf.MBkey = "aYr5XNRKW5SFsDFY";
  519. }
  520. if (Global.inf.interfaceDr == 15)//安徽省基线版-蜀山老院
  521. {
  522. Jo.appKey = "4SR6eFwdmsHGBkSQ";
  523. Global.inf.MBkey = "StCR87Mi8YM7XcYc";
  524. }
  525. if (Global.inf.interfaceDr == 17)//合肥市基线版-蜀山老院
  526. {
  527. Jo.appKey = "4SR6eFwdmsHGBkSQ";
  528. Global.inf.MBkey = "StCR87Mi8YM7XcYc";
  529. }
  530. //if (Global.inf.interfaceDr == 40)//合肥市基线版-庐江门诊
  531. //{
  532. // Jo.opter = "F7A80649CD515C55";
  533. //}
  534. //if (Global.inf.interfaceDr == 52)//合肥市基线版-经开区门诊
  535. //{
  536. // Jo.opter = "F2D71DD91690A813";
  537. //}
  538. Jo.channelCode = Global.inf.hospitalNO;
  539. Jo.apiCode = infno;
  540. if (joInput != null)
  541. {
  542. Jo.Add("args0", joInput);
  543. }
  544. else
  545. {
  546. Jo.Add("args0", "");
  547. }
  548. return JsonHelper.toJsonString(Jo);
  549. }
  550. /// <summary>
  551. /// 组织中心入参-医保电子处方流转
  552. /// </summary>
  553. /// <param name="infno"></param>
  554. /// <param name="input"></param>
  555. /// <returns></returns>
  556. public static string setCenterInparPresCirNew(JObject data)
  557. {
  558. #region【正式环境】
  559. //if (Global.inf.interfaceDr == 21) //兰2
  560. //{
  561. // //应用ID
  562. // Global.inf.appId = "4D967CAB5DA44E3583F4246D7FE897F0";
  563. // //应用秘钥
  564. // Global.inf.Secret = "586BD24D03E5481C8AE4FE9DD8424FFE";
  565. // //应用私钥
  566. // Global.inf.privateKey = "XTbX+Tt1np5Fma0+twhYi+vtM4J0UJ8VX5fFEZ7t/ro=";
  567. // //应用公钥
  568. // Global.inf.publicKey = "BIFd2+2CgjuPAj5FMj5L/L3azTWu86suPtlIJkCo8zjQ44R7SQUUkTgZGdVelRQCM5pW+x9tZGzDPaUNbfD499w=";
  569. //}
  570. //else if (Global.inf.interfaceDr == 25) //兰1
  571. //{
  572. // //应用ID
  573. // Global.inf.appId = "6C9B786AF7E848B29B0EF5783D630263";
  574. // //应用秘钥
  575. // Global.inf.Secret = "6055AE5A9CAD4D9BA8A98EB20431364E";
  576. // //应用私钥
  577. // Global.inf.privateKey = "AKReZmOYcTOdbrnlZZFIXn8LQSHPzdAK1Q0CXDnE4Jhk";
  578. // //应用公钥
  579. // Global.inf.publicKey = "BIFd2+2CgjuPAj5FMj5L/L3azTWu86suPtlIJkCo8zjQ44R7SQUUkTgZGdVelRQCM5pW+x9tZGzDPaUNbfD499w=";
  580. //}
  581. //Global.inf.presCenterURL = "http://10.126.34.36:8080/epc/api";
  582. IniFile ini = new IniFile(Global.curEvt.path + @"\INSUConfigure.ini");
  583. //医保电子处方密钥相关
  584. //应用ID
  585. Global.inf.appId = ini.ReadValue("PrescriptionCirculation", "appId");
  586. //应用秘钥
  587. Global.inf.Secret = ini.ReadValue("PrescriptionCirculation", "Secret");
  588. //应用私钥
  589. Global.inf.privateKey = ini.ReadValue("PrescriptionCirculation", "privateKey");
  590. //应用公钥
  591. Global.inf.publicKey = ini.ReadValue("PrescriptionCirculation", "publicKey");
  592. Global.inf.presCenterURL = ini.ReadValue("PrescriptionCirculation", "presCenterURL");
  593. #endregion
  594. Global.writeLog("密钥id:" + Global.inf.appId);
  595. Global.writeLog("密钥key:" + Global.inf.Secret);
  596. Global.writeLog("定点医药机构私钥:" + Global.inf.privateKey);
  597. Global.writeLog("医保电子处方中心公钥:" + Global.inf.publicKey);
  598. Global.writeLog("医保电子处方中心地址:" + Global.inf.presCenterURL);
  599. //Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  600. string timestamp = ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds).ToString();
  601. Global.curEvt.msgid = timestamp;
  602. JObject requestData = new JObject();
  603. requestData.Add("appId", Global.inf.appId);
  604. //requestData.Add("version", "2.0.1");
  605. requestData.Add("encType", "SM4");
  606. requestData.Add("signType", "SM2");
  607. requestData.Add("timestamp", timestamp);
  608. //MessageBox.Show("1:" + requestData.ToString());
  609. //加密
  610. String encData = SMUtil.encrypt(JsonConvert.SerializeObject(data, Formatting.None), Global.inf.appId, Global.inf.Secret);
  611. //Global.writeLog("入参加密前:" + "\r\n" + JsonConvert.DeserializeObject(data.ToString()) + "\r\n" + "入参加密后:" + "\r\n" + encData);
  612. //MessageBox.Show("2:" + encData.ToString());
  613. JObject signDto = (JObject)JObject.Parse(JsonConvert.SerializeObject(requestData, Formatting.None));
  614. signDto.Add("data", data);
  615. //加签
  616. String signData = SMUtil.sign(signDto, Global.inf.Secret, Global.inf.privateKey);
  617. Global.writeLog("签名结果:" + "\r\n" + signData);
  618. //MessageBox.Show("3:" + signData.ToString());
  619. //报文
  620. requestData.Add("encData", encData);
  621. requestData.Add("signData", signData);
  622. //MessageBox.Show("9:"+requestData.ToString());
  623. dynamic Jo = new JObject();
  624. Jo.appId = Global.inf.appId;
  625. Jo.timestamp = timestamp;
  626. Jo.encType = "SM4";
  627. Jo.signType = "SM2";
  628. Jo.signData = signDto.ToString();
  629. Jo.encData = data.ToString();
  630. Global.writeLog("signDto:" + signDto);
  631. Global.writeLog("data:" + data);
  632. //Global.writeLog("加密前报文:" + "\r\n" + Jo.ToString() + "\r\n" + "加密后报文:" + "\r\n" + JsonConvert.SerializeObject(requestData, Formatting.None));
  633. //本地解密
  634. //String decData = SMUtil.decrypt(encData, Global.inf.appId, Global.inf.Secret);
  635. //Global.writeLog("解密:" + decData);
  636. //使用应用公钥(publicKey示例默认值)对本地自签名的数据进行验签示例
  637. //Boolean isVerify = SMUtil.verify(signDto, Global.inf.Secret, Global.inf.publicKey, signData);
  638. //Global.writeLog("验签:" + isVerify);
  639. return requestData.ToString();
  640. }
  641. /// <summary>
  642. /// 组织Iris入参
  643. /// </summary>
  644. /// <param name="code"></param>
  645. /// <param name="joParam"></param>
  646. /// <returns></returns>
  647. public static JObject setIrisInparPres(string code, JObject joParam)
  648. {
  649. try
  650. {
  651. dynamic joInparam = new JObject();
  652. joInparam.code = code;
  653. dynamic joTmp = new JObject();
  654. JArray jaParam = new JArray();
  655. //// 去掉包装
  656. //JObject joInput = Utils.removeWrapper(joParam);
  657. //jaParam.Add(joInput);
  658. jaParam.Add(joParam);
  659. joInparam.Add("params", JArray.FromObject(jaParam));
  660. joInparam.Add("session", Global.curEvt.jaSession);
  661. return joInparam;
  662. }
  663. catch (Exception ex)
  664. {
  665. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  666. }
  667. }
  668. /// <summary>
  669. /// 组织Iris入参
  670. /// </summary>
  671. /// <param name="code"></param>
  672. /// <param name="joParam"></param>
  673. /// <returns></returns>
  674. public static JObject setIrisInpar(string code, JObject joParam)
  675. {
  676. try
  677. {
  678. dynamic joInparam = new JObject();
  679. joInparam.code = code;
  680. dynamic joTmp = new JObject();
  681. JArray jaParam = new JArray();
  682. // 去掉包装
  683. JObject joInput = Utils.removeWrapper(joParam);
  684. jaParam.Add(joInput);
  685. joInparam.Add("params", JArray.FromObject(jaParam));
  686. joInparam.Add("session", Global.curEvt.jaSession);
  687. return joInparam;
  688. }
  689. catch (Exception ex)
  690. {
  691. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  692. }
  693. }
  694. /// <summary>
  695. /// 组织Iris入参
  696. /// </summary>
  697. /// <param name="code"></param>
  698. /// <param name="joParam"></param>
  699. /// <returns></returns>
  700. public static JObject setIrisInpar(string code, JArray jaParams)
  701. {
  702. try
  703. {
  704. dynamic joInparam = new JObject();
  705. joInparam.code = code;
  706. dynamic joTmp = new JObject();
  707. joInparam.Add("params", jaParams);
  708. joInparam.Add("session", Global.curEvt.jaSession);
  709. return joInparam;
  710. }
  711. catch (Exception ex)
  712. {
  713. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  714. }
  715. }
  716. /// <summary>
  717. /// 解析医保电子处方中心返参
  718. /// </summary>
  719. /// <param name="joRtn"></param>
  720. /// <param name="errorMsg"></param>
  721. /// <returns></returns>
  722. public static int parseCenterRtnValuePresCir(JObject joRtn, out string errorMsg)
  723. {
  724. try
  725. {
  726. string errcode = getDestValue(joRtn, "errcode");
  727. string errorCode = getDestValue(joRtn, "errorCode");
  728. if (errcode != "")
  729. {
  730. errorMsg = getDestValue(joRtn, "message");
  731. return -1;
  732. }
  733. else if (errorCode != "")
  734. {
  735. errorMsg = getDestValue(joRtn, "errorMessage");
  736. return -2;
  737. }
  738. else
  739. {
  740. errorMsg = getDestValue(joRtn, "message");
  741. return int.Parse(getDestValue(joRtn, "code"));
  742. }
  743. }
  744. catch (Exception ex)
  745. {
  746. errorMsg = "解析中心返参发生异常:" + ex.Message;
  747. return -1;
  748. }
  749. }
  750. /// <summary>
  751. /// 解析中心返参
  752. /// </summary>
  753. /// <param name="joRtn"></param>
  754. /// <param name="errorMsg"></param>
  755. /// <returns></returns>
  756. public static int parseCenterRtnValue(JObject joRtn, out string errorMsg)
  757. {
  758. try
  759. {
  760. string errcode = getDestValue(joRtn, "errcode");
  761. string errorCode = getDestValue(joRtn, "errorCode");
  762. if (errcode != "")
  763. {
  764. errorMsg = getDestValue(joRtn, "errmsg");
  765. return -1;
  766. }
  767. else if (errorCode != "")
  768. {
  769. errorMsg = getDestValue(joRtn, "errorMessage");
  770. return -2;
  771. }
  772. else
  773. {
  774. errorMsg = getDestValue(joRtn, "err_msg");
  775. return int.Parse(getDestValue(joRtn, "infcode"));
  776. }
  777. }
  778. catch (Exception ex)
  779. {
  780. errorMsg = "解析中心返参发生异常:" + ex.Message;
  781. return -1;
  782. }
  783. }
  784. /// <summary>
  785. /// 解析移动返参
  786. /// </summary>
  787. /// <param name="joRtn"></param>
  788. /// <param name="errorMsg"></param>
  789. /// <returns></returns>
  790. public static int parseMPRtnValue(JObject joRtn, out string errorMsg)
  791. {
  792. try
  793. {
  794. string success = getDestValue(joRtn, "success");
  795. string message = getDestValue(joRtn, "message");
  796. string encData = getDestValue(joRtn, "encData");
  797. if (success != "True")
  798. {
  799. errorMsg = message;
  800. return -1;
  801. }
  802. else
  803. {
  804. errorMsg = joRtn.ToString();
  805. return 0;
  806. }
  807. }
  808. catch (Exception ex)
  809. {
  810. errorMsg = "解析中心返参发生异常:" + ex.Message;
  811. return -1;
  812. }
  813. }
  814. /// <summary>
  815. /// 组织IRIS返参
  816. /// </summary>
  817. /// <param name="errorCode"></param>
  818. /// <param name="errorMessage"></param>
  819. /// <param name="joResult"></param>
  820. /// <returns></returns>
  821. public static JObject setIrisReturnValue(int errorCode, string errorMessage, JObject joResult)
  822. {
  823. try
  824. {
  825. dynamic joRtn = new JObject();
  826. joRtn.errorCode = errorCode;
  827. joRtn.errorMessage = errorMessage;
  828. joRtn.Add("result", joResult);
  829. return joRtn;
  830. }
  831. catch (Exception ex)
  832. {
  833. return setExceptionJson(-1, "setIrisReturnValue:", ex.Message);
  834. }
  835. }
  836. /// <summary>
  837. /// 解析IRIS返参
  838. /// </summary>
  839. /// <param name="joRtn"></param>
  840. /// <param name="errorMsg"></param>
  841. /// <returns></returns>
  842. public static int parseIrisRtnValue(JObject joRtn, out string errorMsg)
  843. {
  844. try
  845. {
  846. errorMsg = getDestValue(joRtn, "errorMessage");
  847. return int.Parse(getDestValue(joRtn, "errorCode"));
  848. }
  849. catch (Exception ex)
  850. {
  851. errorMsg = "解析Iris返参发生异常:" + ex.Message;
  852. return -1;
  853. }
  854. }
  855. /// <summary>
  856. /// 解析业务JSON串(业务串固定格式为{errorCode = ,errorMessage = ,result ={}})
  857. /// </summary>
  858. /// <param name="json"></param>
  859. /// <param name="errorMsg"></param>
  860. /// <returns></returns>
  861. public static int parseCenterReturnJson(JObject json, out string errorMsg)
  862. {
  863. try
  864. {
  865. errorMsg = "";
  866. if (int.Parse(json["infcode"].ToString()) != 0)
  867. {
  868. errorMsg = json["err_msg"].ToString();
  869. }
  870. return int.Parse(json["infcode"].ToString());
  871. }
  872. catch (Exception ex)
  873. {
  874. errorMsg = "parseCenterReturnJson" + ex.Message;
  875. return -1;
  876. }
  877. }
  878. #region 一码付入参
  879. /// <summary>
  880. /// 一码付组织中心入参
  881. /// </summary>
  882. /// <param name="infno"></param>
  883. /// <param name="input"></param>
  884. /// <returns></returns>
  885. public static string setOneCodePayInpar(string jsonStr)
  886. {
  887. if (string.IsNullOrWhiteSpace(jsonStr))
  888. throw new ArgumentException("输入的 JSON 字符串不能为空", nameof(jsonStr));
  889. // 1. 获取时间戳
  890. string timestamp = SignUtils.CurrentTimeStamp().ToString();
  891. // 2. 若不确定,可在此处压缩:
  892. var compactJson = JsonConvert.SerializeObject(JsonConvert.DeserializeObject(jsonStr), Formatting.None);
  893. Global.inf.OneCodePay.apiSecretKey = "AC1BE7966FFEAFA8";
  894. string encData = OneCodePayEncryptUtil.encrypt(compactJson, Global.inf.OneCodePay.apiSecretKey);
  895. // 3. 构建外层请求对象
  896. var request = new JObject
  897. {
  898. ["reqtType"] = "sys&350000",
  899. ["encData"] = encData,
  900. ["orgId"] = "hnddyyjgxxxt",
  901. ["timestamp"] = timestamp,
  902. ["version"] = "1.0.0"
  903. };
  904. // 4. 输出紧凑 JSON(医保接口要求无空格)
  905. return request.ToString(Formatting.None);
  906. }
  907. public static string setOneCodePayInpar(JObject joInput)
  908. {
  909. return setOneCodePayInpar(joInput.ToString());
  910. }
  911. /// <summary>
  912. /// 解析一码付返参
  913. /// </summary>
  914. /// <param name="joRtn"></param>
  915. /// <param name="errorMsg"></param>
  916. /// {
  917. /// "code": 0,
  918. /// "type": "success",
  919. /// "message": "成功",
  920. /// "data": {
  921. /// "encData": "FD2C1AB3770A04FC7C833D52F2559D6DD8544BC9A6E677D474BF5FE8104B51E2EE106024829CE4765EAAEAF413EEE62F69A15618D90BB90145BA86367EA8F"
  922. /// }
  923. //}
  924. /// <returns></returns>
  925. public static int parseOneCodePayRtnValue(JObject joRtn, out string errorMsg)
  926. {
  927. try
  928. {
  929. string type = getDestValue(joRtn, "type");
  930. string code = getDestValue(joRtn, "code");
  931. string message = getDestValue(joRtn, "message");
  932. string encData = getDestValue(joRtn, "data.encData");
  933. if (code != "0")
  934. {
  935. errorMsg = message;
  936. return -1;
  937. }
  938. else
  939. {
  940. errorMsg = joRtn.ToString();
  941. return 0;
  942. }
  943. }
  944. catch (Exception ex)
  945. {
  946. errorMsg = "解析中心返参发生异常:" + ex.Message;
  947. return -1;
  948. }
  949. }
  950. #endregion
  951. }
  952. }