JsonHelper.cs 40 KB

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