InvokeHelper.cs 36 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956
  1. /******************************************************************************
  2. * 文件名称: InvokeHelper.cs
  3. * 文件说明: 调用助手,调用方法的封装
  4. * 当前版本: V1.0
  5. * 创建日期: 2022-04-12
  6. *
  7. * 2020-04-12: 增加 businessDLLInvoke 方法
  8. * 2020-04-12: 增加 writeLog 方法
  9. * 2020-04-14: 增加 businessDLLInvoke(重载) 方法
  10. * 2020-04-14: 增加 irisServiceInvoke 方法
  11. ******************************************************************************/
  12. using Newtonsoft.Json.Linq;
  13. using System;
  14. using System.Collections.Generic;
  15. using System.IO;
  16. using System.Linq;
  17. using System.Net;
  18. using System.Text;
  19. using System.Threading.Tasks;
  20. using System.Windows.Forms;
  21. using PTMedicalInsurance.Helper;
  22. using Newtonsoft.Json;
  23. using PTMedicalInsurance.Common;
  24. using PTMedicalInsurance.Variables;
  25. using System.Runtime.InteropServices;
  26. using PTMedicalInsurance.Forms;
  27. using Org.BouncyCastle.Utilities.Encoders;
  28. using System.Text.RegularExpressions;
  29. namespace PTMedicalInsurance.Helper
  30. {
  31. public class InvokeHelper
  32. {
  33. private string serviceURL;
  34. private string authorization;
  35. public InvokeHelper()
  36. {
  37. //LoadCenterURL(false);
  38. }
  39. /// <summary>
  40. /// API密钥
  41. /// </summary>
  42. private void LoadAPIKey(string prefix)
  43. {
  44. byte[] b = Base64.Decode(Global.inf.centerURL2);
  45. string centerURL2 = System.Text.Encoding.UTF8.GetString(b);
  46. JObject joCenterURL2 = JObject.Parse(centerURL2);
  47. Global.inf.AK = JsonHelper.getDestValue(joCenterURL2, $"{prefix}.ak");
  48. Global.inf.SK = JsonHelper.getDestValue(joCenterURL2, $"{prefix}.sk");
  49. Global.writeLog($"AK:{Global.inf.AK},SK:{Global.inf.SK}");
  50. }
  51. /// <summary>
  52. /// 核心接口密钥
  53. /// </summary>
  54. private void LoadCoreAPIKey()
  55. {
  56. LoadAPIKey("core");
  57. }
  58. /// <summary>
  59. /// 移动支付密钥
  60. /// </summary>
  61. private void LoadMobileAPIKey()
  62. {
  63. LoadAPIKey("mobilePay");
  64. }
  65. #region 内部服务调用
  66. /// <summary>
  67. /// iris服务调用的封装
  68. /// </summary>
  69. /// <param name="data"></param>
  70. /// <returns></returns>
  71. public JObject invokeIrisService(string data, string serviceDesc)
  72. {
  73. string rtn = "", url = "";
  74. JObject joRtn = new JObject();
  75. try
  76. {
  77. //先根据用户请求的uri构造请求地址
  78. url = serviceURL;
  79. ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
  80. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
  81. //创建Web访问对象
  82. HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
  83. //把用户传过来的数据转成“UTF-8”的字节流
  84. byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
  85. //添加头部信息
  86. myRequest.Method = "POST";
  87. myRequest.ContentLength = buf.Length;
  88. myRequest.ContentType = "application/json";
  89. myRequest.Headers.Add("Authorization", authorization);
  90. myRequest.MaximumAutomaticRedirections = 1;
  91. myRequest.AllowAutoRedirect = true;
  92. //发送请求
  93. Stream stream = myRequest.GetRequestStream();
  94. stream.Write(buf, 0, buf.Length);
  95. stream.Close();
  96. //获取接口返回值
  97. //通过Web访问对象获取响应内容
  98. HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
  99. rtn = getResponseData(myResponse);
  100. joRtn = JObject.Parse(rtn);
  101. return joRtn;
  102. }
  103. catch (Exception ex)
  104. {
  105. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  106. rtn = JsonConvert.SerializeObject(joRtn);
  107. return joRtn;
  108. }
  109. }
  110. /// <summary>
  111. /// HIS服务调用的封装
  112. /// </summary>
  113. /// <param name="data"></param>
  114. /// <returns></returns>
  115. ///
  116. public JObject invokeHISService(string data, string serviceDesc)
  117. {
  118. JObject joRtn = new JObject();
  119. try
  120. {
  121. //先根据用户请求的uri构造请求地址
  122. serviceURL = string.Format("{0}/{1}", Global.hisConfig.ip, Global.hisConfig.url);
  123. authorization = Global.hisConfig.authorization;
  124. joRtn = invokeIrisService(data, serviceDesc);
  125. return joRtn;
  126. }
  127. catch (Exception ex)
  128. {
  129. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  130. return joRtn;
  131. }
  132. finally
  133. {
  134. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), JsonHelper.Compress(joRtn));
  135. }
  136. }
  137. /// <summary>
  138. /// 医保平台服务调用的封装
  139. /// </summary>
  140. /// <param name="data"></param>
  141. /// <returns></returns>
  142. public JObject invokeInsuService(string data, string serviceDesc)
  143. {
  144. string rtn = "";
  145. JObject joRtn = new JObject();
  146. try
  147. {
  148. //先根据用户请求的uri构造请求地址
  149. serviceURL = string.Format("{0}/{1}", Global.insuConfig.ip, Global.insuConfig.url);
  150. authorization = Global.insuConfig.authorization;
  151. joRtn = invokeIrisService(data, serviceDesc);
  152. rtn = JsonConvert.SerializeObject(joRtn);
  153. //if (serviceDesc == "插入签到信息")
  154. //{
  155. // MessageBox.Show("插入签到信息入参:" + data +"|返回值:"+ rtn.ToString()+"|"+ Global.insuConfig.url);
  156. //}
  157. return joRtn;
  158. }
  159. catch (Exception ex)
  160. {
  161. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  162. rtn = JsonConvert.SerializeObject(joRtn);
  163. return joRtn;
  164. }
  165. finally
  166. {
  167. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), rtn);
  168. }
  169. }
  170. private string getResponseData(HttpWebResponse response)
  171. {
  172. string data = "";
  173. if (response != null)
  174. {
  175. Stream s = response.GetResponseStream();
  176. StreamReader sRead = new StreamReader(s);
  177. data = sRead.ReadToEnd();
  178. sRead.Close();
  179. response.Close();
  180. }
  181. return data;
  182. }
  183. #endregion
  184. #region 医保中心调用
  185. /// <summary>
  186. /// 仅辅助交易、自定义交易使用
  187. /// </summary>
  188. /// <param name="funNo"></param>
  189. /// <param name="joInput"></param>
  190. /// <returns></returns>
  191. public JObject invokeCenterAgentService(string funNo, JObject joInput)
  192. {
  193. return invokeCenterAgentService(funNo, joInput.ToString());
  194. }
  195. public JObject invokeCenterAgentService(string funNo, JArray jaInput)
  196. {
  197. return invokeCenterAgentService(funNo, jaInput.ToString());
  198. }
  199. public JObject invokeCenterAgentService(string funNo, string input)
  200. {
  201. string data = "";
  202. string[] lstSettlementList = new string[] { "settlementList_info", "settlementList_writeOff",
  203. "settlementList_medicalAdvice", "settlementList_medicalDischarge", "settlementList_medicalProcess",
  204. "settlementList_medicalImageReport", "settlementList_palgExamRpt", "settlementList_medicalTestResult",
  205. "settlementList_medicalOperation", "settlementList_EMRWriteOff" };
  206. if (lstSettlementList.Contains(funNo))
  207. {
  208. Global.curEvt.URL = Global.inf.SettlementList.url + tools.getDestPosStrBySpliter(funNo, 2, "_");
  209. Global.curEvt.restfulType = RestfulType.SettlementList;
  210. if (funNo == "settlementList_medicalProcess")
  211. {
  212. Global.curEvt.restfulType = RestfulType.SettlementListFormData;
  213. }
  214. data = input;
  215. }
  216. else
  217. {
  218. Global.curEvt.URL = Global.inf.centerURL + funNo;
  219. if (JToken.Parse(input) is JObject)
  220. {
  221. data = JsonHelper.setCenterInpar(funNo, JObject.Parse(input));
  222. }
  223. else
  224. {
  225. }
  226. }
  227. return invokeCenterService(data);
  228. }
  229. private JObject invokeCenterService(string data, ModeEnum mode = ModeEnum.REST)
  230. {
  231. JObject joRtn = new JObject();
  232. try
  233. {
  234. IInvokeCenter center = new InvokeCenterFactory().create(mode);
  235. string outputData = "";
  236. string errMsg = "";
  237. int iInt = center.Init(ref errMsg);
  238. if (iInt == 0)
  239. {
  240. LoadCoreAPIKey();
  241. iInt = center.Business(data, ref outputData, ref errMsg);
  242. if (iInt == 0 && !string.IsNullOrEmpty(outputData))
  243. {
  244. try
  245. {
  246. joRtn = JObject.Parse(outputData);
  247. }
  248. catch (Exception ex)
  249. {
  250. joRtn.Add("infcode", iInt);
  251. joRtn.Add("err_msg", "返回参数异常:" + outputData);
  252. }
  253. }
  254. else
  255. {
  256. joRtn.Add("infcode", iInt);
  257. joRtn.Add("err_msg", outputData);
  258. return joRtn;
  259. }
  260. return joRtn;
  261. }
  262. else
  263. {
  264. joRtn.Add("infcode", -1);
  265. joRtn.Add("err_msg", "医保动态库初始化失败invokeInitByDLL:" + errMsg);
  266. return joRtn;
  267. }
  268. }
  269. finally
  270. {
  271. Global.writeLog($"URL:({Global.curEvt.URL})" , JsonHelper.Compress(data), joRtn.ToString());
  272. // 保存到服务器
  273. this.saveCenterLog(JsonHelper.Compress(data),joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  274. }
  275. }
  276. private JObject invokeCenterServicePresc(string data, ModeEnum mode = ModeEnum.REST)
  277. {
  278. JObject joRtn = new JObject();
  279. try
  280. {
  281. IInvokeCenter center = new InvokeCenterFactory().create(mode);
  282. string outputData = "";
  283. string errMsg = "";
  284. int iInt = center.Init(ref errMsg);
  285. if (iInt == 0)
  286. {
  287. LoadCoreAPIKey();
  288. iInt = center.BusinessPresc(data, ref outputData, ref errMsg);
  289. if (iInt == 0 && !string.IsNullOrEmpty(outputData))
  290. {
  291. try
  292. {
  293. joRtn = JObject.Parse(outputData);
  294. }
  295. catch (Exception ex)
  296. {
  297. joRtn.Add("infcode", iInt);
  298. joRtn.Add("err_msg", "返回参数异常:" + outputData);
  299. }
  300. }
  301. else
  302. {
  303. joRtn.Add("infcode", iInt);
  304. joRtn.Add("err_msg", outputData);
  305. return joRtn;
  306. }
  307. return joRtn;
  308. }
  309. else
  310. {
  311. joRtn.Add("infcode", -1);
  312. joRtn.Add("err_msg", "医保动态库初始化失败invokeInitByDLL:" + errMsg);
  313. return joRtn;
  314. }
  315. }
  316. finally
  317. {
  318. Global.writeLog(Global.curEvt.URL + "\n" + "ak:" + Global.inf.PresCir.ak + " sk:" + Global.inf.PresCir.sk, JsonHelper.Compress(data), joRtn.ToString());
  319. // 保存到服务器
  320. this.saveCenterLog(JsonHelper.Compress(data), joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  321. }
  322. }
  323. private void prepareCallURI(TradeEnum trade)
  324. {
  325. string funNo = trade.GetCode() ;
  326. Global.curEvt.funNo = funNo;
  327. if (Global.curEvt.testMode)
  328. {
  329. // 医保测试环境
  330. //LoadCenterURL(true);
  331. }
  332. string prefix = Global.inf.centerURL;
  333. switch (trade)
  334. {
  335. case TradeEnum.FileUpload:
  336. prefix = Global.inf.uploadURL??Global.inf.centerURL;
  337. break;
  338. case TradeEnum.FileDownload:
  339. prefix = Global.inf.downURL;
  340. break;
  341. default:
  342. prefix = Global.inf.centerURL;
  343. break;
  344. }
  345. // 根据情况确实是否需要加funNo
  346. Global.curEvt.URL = prefix + Global.curEvt.funNo;
  347. }
  348. private void prepareCallURIPresc(TradeEnum trade)
  349. {
  350. string funNO = trade.GetCode();
  351. Global.curEvt.funNo = funNO;
  352. if (Global.curEvt.testMode)
  353. {
  354. // 医保测试环境
  355. //LoadCenterURL(true);
  356. }
  357. if (funNO == "7101")
  358. {
  359. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/uploadChk";
  360. }
  361. else if (funNO == "7102")
  362. {
  363. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxFixmedinsSign";
  364. }
  365. else if (funNO == "7103")
  366. {
  367. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxFileUpld";
  368. }
  369. else if (funNO == "7104")
  370. {
  371. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxUndo";
  372. }
  373. else if (funNO == "7105")
  374. {
  375. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/hospRxDetlQuery";
  376. }
  377. else if (funNO == "7106")
  378. {
  379. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxChkInfoQuery";
  380. }
  381. else if (funNO == "7107")
  382. {
  383. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxSetlInfoQuery";
  384. }
  385. else if (funNO == "7108")
  386. {
  387. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxChkInfoCallback";
  388. }
  389. else if (funNO == "7109")
  390. {
  391. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxSetlInfoCallback";
  392. }
  393. else if (funNO == "7100")
  394. {
  395. Global.curEvt.URL = Global.inf.PresCir.url + "/fixmedins/rxSetlStockQuery";
  396. }
  397. else
  398. {
  399. Global.curEvt.URL = Global.inf.centerURL;
  400. }
  401. string prefix = Global.curEvt.URL;
  402. switch (trade)
  403. {
  404. case TradeEnum.FileUpload:
  405. prefix = Global.inf.uploadURL ?? Global.inf.centerURL;
  406. break;
  407. case TradeEnum.FileDownload:
  408. prefix = Global.inf.downURL;
  409. break;
  410. default:
  411. prefix = Global.curEvt.URL;
  412. break;
  413. }
  414. }
  415. /// <summary>
  416. /// 通过枚举转换要调用的接口
  417. /// </summary>
  418. /// <param name="trade"></param>
  419. /// <param name="data"></param>
  420. /// <returns></returns>
  421. public JObject invokeCenterService(TradeEnum trade, JObject joInput)
  422. {
  423. LoadCoreAPIKey();
  424. string funNo = trade.GetCode();
  425. // 入参统一转换
  426. JObject request = Utils.ConvertRequest<JObject>(trade,joInput);
  427. string data = JsonHelper.toJsonString(request);
  428. // 统一封装请求头
  429. if (trade.GetMode() == ModeEnum.REST)
  430. {
  431. data = JsonHelper.setCenterInpar(funNo, request);
  432. }
  433. JObject joRtn = new JObject();
  434. // 调试模式
  435. if (Global.curEvt.enabledDebug)
  436. {
  437. CenterResult center = new CenterResult();
  438. center.setTradeNo(trade.GetCode(), data);
  439. if (center.ShowDialog() == DialogResult.OK)
  440. {
  441. // 接口实际返回数据
  442. string outPar = center.returnData;
  443. joRtn = JObject.Parse(outPar);
  444. }
  445. }
  446. else
  447. {
  448. prepareCallURI(trade);
  449. joRtn = invokeCenterService(data, trade.GetMode());
  450. }
  451. // 返回结果统一转换
  452. joRtn = Utils.ConvertResponse<JObject>(trade,joRtn);
  453. return joRtn;
  454. }
  455. /// <summary>
  456. /// 通过枚举转换要调用的接口-医保电子处方
  457. /// </summary>
  458. /// <param name="trade"></param>
  459. /// <param name="data"></param>
  460. /// <returns></returns>
  461. public JObject invokeCenterServicePresCir(TradeEnum trade, string sInput)
  462. {
  463. JObject joInput = JObject.Parse(sInput);
  464. LoadCoreAPIKey();
  465. string funNO = trade.GetCode();
  466. // 入参统一转换
  467. JObject request = Utils.ConvertRequest<JObject>(trade, joInput);
  468. string data = JsonHelper.toJsonString(request);
  469. // 统一封装请求头
  470. //if (trade.GetMode() == ModeEnum.REST)
  471. //{
  472. // data = JsonHelper.setCenterInpar(funNO, request);
  473. //}
  474. JObject joRtn = new JObject();
  475. // 调试模式
  476. if (Global.curEvt.enabledDebug)
  477. {
  478. CenterResult center = new CenterResult();
  479. center.setTradeNo(trade.GetCode(), data);
  480. if (center.ShowDialog() == DialogResult.OK)
  481. {
  482. // 接口实际返回数据
  483. string outPar = center.returnData;
  484. joRtn = JObject.Parse(outPar);
  485. }
  486. }
  487. else
  488. {
  489. prepareCallURIPresc(trade);
  490. joRtn = invokeCenterServicePresc(data, trade.GetMode());
  491. }
  492. // 返回结果统一转换
  493. joRtn = Utils.ConvertResponse<JObject>(trade, joRtn);
  494. return joRtn;
  495. }
  496. /// <summary>
  497. /// 医保目录txt文件下载
  498. /// </summary>
  499. /// <param name="data"></param>
  500. /// <returns></returns>
  501. public JObject DownloadCenterFile(string data, ModeEnum mode = ModeEnum.REST)
  502. {
  503. //download file
  504. IInvokeCenter center = new InvokeCenterFactory().create(mode);
  505. string outputMsg = "";
  506. JObject joRtn = new JObject();
  507. int rtnCode = center.DownloadFile(data, ref outputMsg);
  508. if(rtnCode==0)
  509. {
  510. joRtn = JObject.Parse(outputMsg);
  511. }
  512. else
  513. {
  514. joRtn.Add("infcode", -1);
  515. joRtn.Add("err_msg", "下载文件失败DownloadFile:" + outputMsg);
  516. }
  517. return joRtn;
  518. }
  519. #endregion
  520. #region 移动
  521. /// <summary>
  522. /// 移动
  523. /// </summary>
  524. /// <param name="funNO"></param>
  525. /// <param name="data"></param>
  526. /// <returns></returns>
  527. public JObject invokeMPService(string funNO, string data)
  528. {
  529. return invokeMPService(funNO, JObject.Parse(data));
  530. }
  531. private static bool HasLeadingZero(string value)
  532. {
  533. // Check if the value is a number with a leading zero
  534. //return Regex.IsMatch(value, @"^0\d+(\.\d+)?$") || Regex.IsMatch(value, @"^\.\d+$");
  535. return Regex.IsMatch(value, @"^\.\d+$");
  536. }
  537. public JObject invokeMPService(string funNO, JObject joInput)
  538. {
  539. JObject joRtn = new JObject();
  540. String outPar = "";
  541. try
  542. {
  543. string url = "";
  544. //switch (funNO)
  545. //{
  546. // case "6201":
  547. // url = "/org/local/api/hos/uldFeeInfo";
  548. // break;
  549. // case "6202":
  550. // url = "/org/local/api/hos/pay_order";
  551. // break;
  552. // case "6203":
  553. // url = "/org/local/api/hos/refund_Order";
  554. // break;
  555. // case "6301":
  556. // url = "/org/local/api/hos/query_order_info";
  557. // break;
  558. // case "6401":
  559. // url = "/org/local/api/hos/revoke_order";
  560. // break;
  561. // default:
  562. // break;
  563. //}
  564. EncryptHelper encrypt = new EncryptHelper(Global.inf.MobilePay.appid, Global.inf.MobilePay.secretKey, Global.inf.MobilePay.publicKey, Global.inf.MobilePay.privateKey);
  565. //处理前导零
  566. foreach (var property in joInput.Properties())
  567. {
  568. Global.writeLog($"{property.Name}:{property.Value}");
  569. string valueString = property.Value.ToString();
  570. if (HasLeadingZero(valueString))
  571. {
  572. Global.writeLog($"存在前导零:{property.Name}:{property.Value}");
  573. decimal value = decimal.Parse(property.Value.ToString());
  574. property.Value = value.ToString();
  575. }
  576. }
  577. string data = JsonHelper.setMPCenterInpar(funNO, joInput);
  578. // 移动支付地址
  579. //Global.curEvt.URL = Global.inf.MobilePay.url + "no" + funNO; //测试环境需要加no
  580. Global.curEvt.URL = Global.inf.MobilePay.url + funNO;
  581. string outputData = "", errMsg = "";
  582. // 动态调试模式
  583. if (Global.curEvt.enabledDebug)
  584. {
  585. CenterResult center = new CenterResult();
  586. center.setTradeNo(funNO,data);
  587. if (center.ShowDialog() == DialogResult.OK)
  588. {
  589. outPar = center.returnData;
  590. return JObject.Parse(outPar);
  591. }
  592. }
  593. try
  594. {
  595. Global.writeLog($"Global.inf.hospitalDr:{Global.inf.hospitalDr}");
  596. InvokeRestCenter mobileCenter = new InvokeRestCenter();
  597. LoadMobileAPIKey();
  598. Global.writeLog("走的哪里?");
  599. int iInt = mobileCenter.Business(data, ref outputData, ref errMsg);
  600. Global.writeLog("走的哪里?2");
  601. joRtn = JObject.Parse(outputData);
  602. Global.writeLog(funNO + "【密文出参】:\r\n" + joRtn.ToString());
  603. string encData = JsonHelper.getDestValue(joRtn, "encData");
  604. string signData = JsonHelper.getDestValue(joRtn, "signData");
  605. if (!string.IsNullOrEmpty(encData) && !string.IsNullOrEmpty(signData))
  606. {
  607. joRtn.Remove("encData");
  608. joRtn.Remove("signData");
  609. joRtn.Remove("data");
  610. //解密
  611. string decData = encrypt.decrypt(encData);
  612. // 验签
  613. JsonConvert.DefaultSettings = () => new JsonSerializerSettings
  614. {
  615. FloatParseHandling = FloatParseHandling.Decimal
  616. };
  617. joRtn.Add("data", JToken.FromObject(JsonConvert.DeserializeObject(decData)));
  618. bool rtn = encrypt.verify(joRtn, signData);
  619. if (rtn)
  620. {
  621. Global.writeLog(funNO + "【明文出参】:\r\n" + decData);
  622. joRtn = JObject.Parse(decData);
  623. joRtn.Add("success", "True");
  624. }
  625. else
  626. {
  627. Global.writeLog("验签失败,请核查!");
  628. }
  629. }
  630. return joRtn;
  631. }
  632. finally
  633. {
  634. string plainData = data;
  635. data = JsonHelper.setCenterInpar(funNO,JObject.Parse(data));
  636. this.saveCenterLog(JsonHelper.Compress(data), joRtn.ToString(), JsonHelper.Compress(plainData), joRtn.ToString());
  637. }
  638. }
  639. catch (Exception ex)
  640. {
  641. if (joRtn["infcode"] == null)
  642. { joRtn.Add("infcode", -1); }
  643. if (joRtn["err_msg"] == null)
  644. { joRtn.Add("err_msg", "invokeCenterService(3):" + ex.Message); }
  645. outPar = JsonHelper.Compress(joRtn);
  646. return joRtn;
  647. }
  648. finally
  649. {
  650. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", joInput.ToString(), joRtn.ToString());
  651. this.saveCenterLog(joInput.ToString(), joRtn.ToString(), joInput.ToString(), joRtn.ToString());
  652. }
  653. }
  654. /// <summary>
  655. /// 保存中心交易日志到数据库
  656. /// </summary>
  657. /// <param name="inParam"></param>
  658. /// <param name="outParam"></param>
  659. /// <param name="inParamPlain"></param>
  660. /// <param name="outParamPlain"></param>
  661. private void saveCenterLog(string inParam, string outParam, string inParamPlain, string outParamPlain)
  662. {
  663. dynamic joIris = new JObject();
  664. string sRtn = "";
  665. try
  666. {
  667. //解析postContent,插入医保交易日志表
  668. JObject joInParam = new JObject(JObject.Parse(inParam));
  669. //解包
  670. JObject joIn = Utils.removeWrapper(joInParam);
  671. JObject joOut = new JObject(JObject.Parse(outParam));
  672. JObject joInPlain = new JObject(JObject.Parse(inParamPlain));
  673. JObject joOutPlain = new JObject(JObject.Parse(outParamPlain));
  674. JArray jaParams = new JArray();
  675. JObject joParam = new JObject();
  676. joParam.Add("inParam", JObject.FromObject(joIn));
  677. joParam.Add("outParam", JObject.FromObject(joOut));
  678. joParam.Add("inParamPlain", JObject.FromObject(joInPlain));
  679. joParam.Add("outParamPlain", JObject.FromObject(joOutPlain));
  680. joParam.Add("HospitalDr", Global.inf.hospitalDr);
  681. joParam.Add("InterfaceDr", Global.inf.interfaceDr);
  682. joParam.Add("updateUserID", Global.user.ID);
  683. joParam.Add("psn_no", Global.pat.psn_no);
  684. jaParams.Add(joParam);
  685. joIris.code = "09010021";
  686. joIris.Add("params", jaParams);
  687. //InvokeHelper invoker = new InvokeHelper();
  688. sRtn = invokeInsuService(joIris.ToString(), "保存日志到数据库").ToString();
  689. }
  690. catch (Exception ex)
  691. {
  692. sRtn = JsonHelper.setExceptionJson(-100, "保存日志异常", ex.Message).ToString();
  693. Global.writeLog_Iris("保存日志异常:" + sRtn.ToString());
  694. }
  695. }
  696. #endregion
  697. #region 电子处方
  698. /// </summary>
  699. /// <param name="funNO"></param>
  700. /// <param name="data"></param>
  701. /// <returns></returns>
  702. public JObject invokeEPCenterService(string funNO, string data)
  703. {
  704. JObject joRtn = new JObject();
  705. string outPar = "";
  706. try
  707. {
  708. Global.curEvt.URL = Global.inf.ecPrescURL;
  709. switch (funNO)
  710. {
  711. case "7101":
  712. {
  713. Global.curEvt.URL = Global.curEvt.URL + "/fixmedins/uploadChk";
  714. break;
  715. }
  716. case "7102":
  717. {
  718. Global.curEvt.URL = Global.curEvt.URL + "/fixmedins/rxFixmedinsSign";
  719. break;
  720. }
  721. case "7103":
  722. {
  723. Global.curEvt.URL = Global.curEvt.URL + "/fixmedins/rxFileUpld";
  724. break;
  725. }
  726. case "7104":
  727. {
  728. Global.curEvt.URL = Global.curEvt.URL + "/fixmedins/rxUndo";
  729. break;
  730. }
  731. case "7105":
  732. {
  733. Global.curEvt.URL = Global.curEvt.URL + "/fixmedins/hospRxDetlQuery";
  734. break;
  735. }
  736. case "7106":
  737. {
  738. Global.curEvt.URL = Global.curEvt.URL + "/fixmedins/rxChkInfoQuery";
  739. break;
  740. }
  741. case "7107":
  742. {
  743. Global.curEvt.URL = Global.curEvt.URL + "/fixmedins/rxSetlInfoQuery";
  744. break;
  745. }
  746. case "7108":
  747. {
  748. Global.curEvt.URL = Global.curEvt.URL + "/fixmedins/rxChkInfoCallback";
  749. break;
  750. }
  751. case "7109":
  752. {
  753. Global.curEvt.URL = Global.curEvt.URL + "/fixmedins/rxSetlInfoCallback";
  754. break;
  755. }
  756. }
  757. //Global.curEvt.URL = Global.inf.centerURL;
  758. joRtn = invokeEPCenterService(data);
  759. outPar = JsonHelper.Compress(joRtn);
  760. return joRtn;
  761. }
  762. catch (Exception ex)
  763. {
  764. if (joRtn["infcode"] == null)
  765. { joRtn.Add("infcode", -1); }
  766. if (joRtn["err_msg"] == null)
  767. { joRtn.Add("err_msg", "invokeCenterServicePresCir(3):" + ex.Message); }
  768. outPar = JsonHelper.Compress(joRtn);
  769. return joRtn;
  770. }
  771. finally
  772. {
  773. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", JsonHelper.Compress(data), joRtn.ToString());
  774. //this.saveCenterLog(JsonHelper.Compress(data), outPar, JsonHelper.Compress(data), outPar);
  775. }
  776. }
  777. /// <summary>
  778. /// 医保电子处方流转调用服务
  779. /// </summary>
  780. /// <param name="data"></param>
  781. /// <returns></returns>
  782. private JObject invokeEPCenterService(string data)
  783. {
  784. string postContent = "";
  785. JObject joRtn = new JObject();
  786. try
  787. {
  788. string timestamp = TimeStamp.get13().ToString(); //当前时间戳(秒)
  789. string nonce = Guid.NewGuid().ToString(); //非重复的随机字符串(十分钟内不能重复)
  790. //内容类型
  791. //Signer signer = new Signer();
  792. //signer.Key = Global.inf.privateKey; //应用编码
  793. //signer.Secret = Global.inf.secretKey; //secretKey 私钥
  794. //HttpRequest Resquest = new HttpRequest("POST", new Uri(Global.curEvt.URL));
  795. //Resquest.headers.Add("charset", "UTF-8");
  796. //Resquest.headers.Add("x-hw-id", signer.Key);
  797. //Resquest.headers.Add("x-tif-timestamp", timestamp);
  798. //Resquest.headers.Add("x-tif-passid", signer.Key);
  799. //Resquest.headers.Add("x-tif-nonce", nonce);
  800. //Resquest.body = signData;
  801. //HttpWebRequest req = signer.Sign(Resquest);
  802. HttpWebRequest req = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL);
  803. req.Method = "POST";
  804. req.ContentType = "application/json;charset=utf8";
  805. req.Timeout = 5 * 10000;
  806. try
  807. {
  808. var writer = new StreamWriter(req.GetRequestStream());
  809. writer.Write(data);
  810. writer.Flush();
  811. HttpWebResponse resp = (HttpWebResponse)req.GetResponse();
  812. StreamReader reader = new StreamReader(resp.GetResponseStream());
  813. string RtnStr = reader.ReadToEnd();
  814. joRtn = JObject.Parse(RtnStr);
  815. // 解密返回值
  816. EncryptHelper encrypt = new EncryptHelper(Global.inf.PresCir.appid, Global.inf.PresCir.secretKey, Global.inf.PresCir.publicKey, Global.inf.PresCir.privateKey);
  817. string encData = JsonHelper.getDestValue(joRtn, "encData");
  818. string signData = JsonHelper.getDestValue(joRtn, "signData");
  819. Global.writeLog("【密文出参】:\r\n" + RtnStr);
  820. if (!string.IsNullOrEmpty(encData) && !string.IsNullOrEmpty(signData))
  821. {
  822. joRtn.Remove("encData");
  823. joRtn.Remove("signData");
  824. joRtn.Remove("data");
  825. //解密
  826. string decData = encrypt.decrypt(encData);
  827. // 验签
  828. JsonConvert.DefaultSettings = () => new JsonSerializerSettings
  829. {
  830. FloatParseHandling = FloatParseHandling.Decimal
  831. };
  832. joRtn.Add("data", JToken.FromObject(JsonConvert.DeserializeObject(decData)));
  833. bool rtn = encrypt.verify(joRtn, signData);
  834. if (rtn)
  835. {
  836. Global.writeLog("【明文出参】:\r\n" + decData);
  837. joRtn = JObject.Parse(decData);
  838. joRtn.Add("code", 0);
  839. joRtn.Add("message", "成功");
  840. }
  841. else
  842. {
  843. Global.writeLog("验签失败,请核查!");
  844. }
  845. }
  846. return joRtn;
  847. }
  848. catch (WebException e)
  849. {
  850. HttpWebResponse resp = (HttpWebResponse)e.Response;
  851. if (resp != null)
  852. {
  853. return JsonHelper.setExceptionJson(-99, "centerServeiceInvok中获得响应流异常(a)", new StreamReader(resp.GetResponseStream()).ReadToEnd() + "异常内容:" + e.Message);
  854. }
  855. else
  856. {
  857. return JsonHelper.setExceptionJson(-99, "centerServeiceInvok中获得响应流异常(b)", e.Message);
  858. }
  859. }
  860. }
  861. catch (Exception ex)
  862. {
  863. postContent = "调用中心服务异常" + ex.Message;
  864. joRtn.Add("infcode", -1);
  865. joRtn.Add("err_msg", "invokeCenterService(Exception_Last):" + ex.Message);
  866. return joRtn;
  867. }
  868. }
  869. #endregion
  870. }
  871. }