JsonHelper.cs 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930
  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 setCenterInparPresCirNew(JObject data)
  506. {
  507. #region【正式环境】
  508. //if (Global.inf.interfaceDr == 21) //兰2
  509. //{
  510. // //应用ID
  511. // Global.inf.appId = "4D967CAB5DA44E3583F4246D7FE897F0";
  512. // //应用秘钥
  513. // Global.inf.Secret = "586BD24D03E5481C8AE4FE9DD8424FFE";
  514. // //应用私钥
  515. // Global.inf.privateKey = "XTbX+Tt1np5Fma0+twhYi+vtM4J0UJ8VX5fFEZ7t/ro=";
  516. // //应用公钥
  517. // Global.inf.publicKey = "BIFd2+2CgjuPAj5FMj5L/L3azTWu86suPtlIJkCo8zjQ44R7SQUUkTgZGdVelRQCM5pW+x9tZGzDPaUNbfD499w=";
  518. //}
  519. //else if (Global.inf.interfaceDr == 25) //兰1
  520. //{
  521. // //应用ID
  522. // Global.inf.appId = "6C9B786AF7E848B29B0EF5783D630263";
  523. // //应用秘钥
  524. // Global.inf.Secret = "6055AE5A9CAD4D9BA8A98EB20431364E";
  525. // //应用私钥
  526. // Global.inf.privateKey = "AKReZmOYcTOdbrnlZZFIXn8LQSHPzdAK1Q0CXDnE4Jhk";
  527. // //应用公钥
  528. // Global.inf.publicKey = "BIFd2+2CgjuPAj5FMj5L/L3azTWu86suPtlIJkCo8zjQ44R7SQUUkTgZGdVelRQCM5pW+x9tZGzDPaUNbfD499w=";
  529. //}
  530. //Global.inf.presCenterURL = "http://10.126.34.36:8080/epc/api";
  531. IniFile ini = new IniFile(Global.curEvt.path + @"\INSUConfigure.ini");
  532. //医保电子处方密钥相关
  533. //应用ID
  534. Global.inf.appId = ini.ReadValue("PrescriptionCirculation", "appId");
  535. //应用秘钥
  536. Global.inf.Secret = ini.ReadValue("PrescriptionCirculation", "Secret");
  537. //应用私钥
  538. Global.inf.privateKey = ini.ReadValue("PrescriptionCirculation", "privateKey");
  539. //应用公钥
  540. Global.inf.publicKey = ini.ReadValue("PrescriptionCirculation", "publicKey");
  541. Global.inf.presCenterURL = ini.ReadValue("PrescriptionCirculation", "presCenterURL");
  542. #endregion
  543. Global.writeLog("密钥id:" + Global.inf.appId);
  544. Global.writeLog("密钥key:" + Global.inf.Secret);
  545. Global.writeLog("定点医药机构私钥:" + Global.inf.privateKey);
  546. Global.writeLog("医保电子处方中心公钥:" + Global.inf.publicKey);
  547. Global.writeLog("医保电子处方中心地址:" + Global.inf.presCenterURL);
  548. //Global.curEvt.msgid = Global.inf.hospitalNO + DateTime.Now.ToString("yyyyMMddHHmmssffff");
  549. string timestamp = ((long)(DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)).TotalMilliseconds).ToString();
  550. Global.curEvt.msgid = timestamp;
  551. JObject requestData = new JObject();
  552. requestData.Add("appId", Global.inf.appId);
  553. //requestData.Add("version", "2.0.1");
  554. requestData.Add("encType", "SM4");
  555. requestData.Add("signType", "SM2");
  556. requestData.Add("timestamp", timestamp);
  557. //MessageBox.Show("1:" + requestData.ToString());
  558. //加密
  559. String encData = SMUtil.encrypt(JsonConvert.SerializeObject(data, Formatting.None), Global.inf.appId, Global.inf.Secret);
  560. //Global.writeLog("入参加密前:" + "\r\n" + JsonConvert.DeserializeObject(data.ToString()) + "\r\n" + "入参加密后:" + "\r\n" + encData);
  561. //MessageBox.Show("2:" + encData.ToString());
  562. JObject signDto = (JObject)JObject.Parse(JsonConvert.SerializeObject(requestData, Formatting.None));
  563. signDto.Add("data", data);
  564. //加签
  565. String signData = SMUtil.sign(signDto, Global.inf.Secret, Global.inf.privateKey);
  566. Global.writeLog("签名结果:" + "\r\n" + signData);
  567. //MessageBox.Show("3:" + signData.ToString());
  568. //报文
  569. requestData.Add("encData", encData);
  570. requestData.Add("signData", signData);
  571. //MessageBox.Show("9:"+requestData.ToString());
  572. dynamic Jo = new JObject();
  573. Jo.appId = Global.inf.appId;
  574. Jo.timestamp = timestamp;
  575. Jo.encType = "SM4";
  576. Jo.signType = "SM2";
  577. Jo.signData = signDto.ToString();
  578. Jo.encData = data.ToString();
  579. Global.writeLog("signDto:" + signDto);
  580. Global.writeLog("data:" + data);
  581. //Global.writeLog("加密前报文:" + "\r\n" + Jo.ToString() + "\r\n" + "加密后报文:" + "\r\n" + JsonConvert.SerializeObject(requestData, Formatting.None));
  582. //本地解密
  583. //String decData = SMUtil.decrypt(encData, Global.inf.appId, Global.inf.Secret);
  584. //Global.writeLog("解密:" + decData);
  585. //使用应用公钥(publicKey示例默认值)对本地自签名的数据进行验签示例
  586. //Boolean isVerify = SMUtil.verify(signDto, Global.inf.Secret, Global.inf.publicKey, signData);
  587. //Global.writeLog("验签:" + isVerify);
  588. return requestData.ToString();
  589. }
  590. /// <summary>
  591. /// 组织Iris入参
  592. /// </summary>
  593. /// <param name="code"></param>
  594. /// <param name="joParam"></param>
  595. /// <returns></returns>
  596. public static JObject setIrisInparPres(string code, JObject joParam)
  597. {
  598. try
  599. {
  600. dynamic joInparam = new JObject();
  601. joInparam.code = code;
  602. dynamic joTmp = new JObject();
  603. JArray jaParam = new JArray();
  604. //// 去掉包装
  605. //JObject joInput = Utils.removeWrapper(joParam);
  606. //jaParam.Add(joInput);
  607. jaParam.Add(joParam);
  608. joInparam.Add("params", JArray.FromObject(jaParam));
  609. joInparam.Add("session", Global.curEvt.jaSession);
  610. return joInparam;
  611. }
  612. catch (Exception ex)
  613. {
  614. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  615. }
  616. }
  617. /// <summary>
  618. /// 组织Iris入参
  619. /// </summary>
  620. /// <param name="code"></param>
  621. /// <param name="joParam"></param>
  622. /// <returns></returns>
  623. public static JObject setIrisInpar(string code, JObject joParam)
  624. {
  625. try
  626. {
  627. dynamic joInparam = new JObject();
  628. joInparam.code = code;
  629. dynamic joTmp = new JObject();
  630. JArray jaParam = new JArray();
  631. // 去掉包装
  632. JObject joInput = Utils.removeWrapper(joParam);
  633. jaParam.Add(joInput);
  634. joInparam.Add("params", JArray.FromObject(jaParam));
  635. joInparam.Add("session", Global.curEvt.jaSession);
  636. return joInparam;
  637. }
  638. catch (Exception ex)
  639. {
  640. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  641. }
  642. }
  643. /// <summary>
  644. /// 组织Iris入参
  645. /// </summary>
  646. /// <param name="code"></param>
  647. /// <param name="joParam"></param>
  648. /// <returns></returns>
  649. public static JObject setIrisInpar(string code, JArray jaParams)
  650. {
  651. try
  652. {
  653. dynamic joInparam = new JObject();
  654. joInparam.code = code;
  655. dynamic joTmp = new JObject();
  656. joInparam.Add("params", jaParams);
  657. joInparam.Add("session", Global.curEvt.jaSession);
  658. return joInparam;
  659. }
  660. catch (Exception ex)
  661. {
  662. return setExceptionJson(-1, "setIrisInpar:", ex.Message);
  663. }
  664. }
  665. /// <summary>
  666. /// 解析医保电子处方中心返参
  667. /// </summary>
  668. /// <param name="joRtn"></param>
  669. /// <param name="errorMsg"></param>
  670. /// <returns></returns>
  671. public static int parseCenterRtnValuePresCir(JObject joRtn, out string errorMsg)
  672. {
  673. try
  674. {
  675. string errcode = getDestValue(joRtn, "errcode");
  676. string errorCode = getDestValue(joRtn, "errorCode");
  677. if (errcode != "")
  678. {
  679. errorMsg = getDestValue(joRtn, "message");
  680. return -1;
  681. }
  682. else if (errorCode != "")
  683. {
  684. errorMsg = getDestValue(joRtn, "errorMessage");
  685. return -2;
  686. }
  687. else
  688. {
  689. errorMsg = getDestValue(joRtn, "message");
  690. return int.Parse(getDestValue(joRtn, "code"));
  691. }
  692. }
  693. catch (Exception ex)
  694. {
  695. errorMsg = "解析中心返参发生异常:" + ex.Message;
  696. return -1;
  697. }
  698. }
  699. /// <summary>
  700. /// 解析中心返参
  701. /// </summary>
  702. /// <param name="joRtn"></param>
  703. /// <param name="errorMsg"></param>
  704. /// <returns></returns>
  705. public static int parseCenterRtnValue(JObject joRtn, out string errorMsg)
  706. {
  707. try
  708. {
  709. string errcode = getDestValue(joRtn, "errcode");
  710. string errorCode = getDestValue(joRtn, "errorCode");
  711. if (errcode != "")
  712. {
  713. errorMsg = getDestValue(joRtn, "errmsg");
  714. return -1;
  715. }
  716. else if (errorCode != "")
  717. {
  718. errorMsg = getDestValue(joRtn, "errorMessage");
  719. return -2;
  720. }
  721. else
  722. {
  723. errorMsg = getDestValue(joRtn, "err_msg");
  724. return int.Parse(getDestValue(joRtn, "infcode"));
  725. }
  726. }
  727. catch (Exception ex)
  728. {
  729. errorMsg = "解析中心返参发生异常:" + ex.Message;
  730. return -1;
  731. }
  732. }
  733. /// <summary>
  734. /// 解析移动返参
  735. /// </summary>
  736. /// <param name="joRtn"></param>
  737. /// <param name="errorMsg"></param>
  738. /// <returns></returns>
  739. public static int parseMPRtnValue(JObject joRtn, out string errorMsg)
  740. {
  741. try
  742. {
  743. string success = getDestValue(joRtn, "success");
  744. string message = getDestValue(joRtn, "message");
  745. string encData = getDestValue(joRtn, "encData");
  746. if (success != "True")
  747. {
  748. errorMsg = message;
  749. return -1;
  750. }
  751. else
  752. {
  753. errorMsg = joRtn.ToString();
  754. return 0;
  755. }
  756. }
  757. catch (Exception ex)
  758. {
  759. errorMsg = "解析中心返参发生异常:" + ex.Message;
  760. return -1;
  761. }
  762. }
  763. /// <summary>
  764. /// 组织IRIS返参
  765. /// </summary>
  766. /// <param name="errorCode"></param>
  767. /// <param name="errorMessage"></param>
  768. /// <param name="joResult"></param>
  769. /// <returns></returns>
  770. public static JObject setIrisReturnValue(int errorCode, string errorMessage, JObject joResult)
  771. {
  772. try
  773. {
  774. dynamic joRtn = new JObject();
  775. joRtn.errorCode = errorCode;
  776. joRtn.errorMessage = errorMessage;
  777. joRtn.Add("result", joResult);
  778. return joRtn;
  779. }
  780. catch (Exception ex)
  781. {
  782. return setExceptionJson(-1, "setIrisReturnValue:", ex.Message);
  783. }
  784. }
  785. /// <summary>
  786. /// 解析IRIS返参
  787. /// </summary>
  788. /// <param name="joRtn"></param>
  789. /// <param name="errorMsg"></param>
  790. /// <returns></returns>
  791. public static int parseIrisRtnValue(JObject joRtn, out string errorMsg)
  792. {
  793. try
  794. {
  795. errorMsg = getDestValue(joRtn, "errorMessage");
  796. return int.Parse(getDestValue(joRtn, "errorCode"));
  797. }
  798. catch (Exception ex)
  799. {
  800. errorMsg = "解析Iris返参发生异常:" + ex.Message;
  801. return -1;
  802. }
  803. }
  804. /// <summary>
  805. /// 解析业务JSON串(业务串固定格式为{errorCode = ,errorMessage = ,result ={}})
  806. /// </summary>
  807. /// <param name="json"></param>
  808. /// <param name="errorMsg"></param>
  809. /// <returns></returns>
  810. public static int parseCenterReturnJson(JObject json, out string errorMsg)
  811. {
  812. try
  813. {
  814. errorMsg = "";
  815. if (int.Parse(json["infcode"].ToString()) != 0)
  816. {
  817. errorMsg = json["err_msg"].ToString();
  818. }
  819. return int.Parse(json["infcode"].ToString());
  820. }
  821. catch (Exception ex)
  822. {
  823. errorMsg = "parseCenterReturnJson" + ex.Message;
  824. return -1;
  825. }
  826. }
  827. }
  828. }