InvokeHelper.cs 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525
  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. namespace PTMedicalInsurance.Helper
  28. {
  29. public class InvokeHelper
  30. {
  31. private string serviceURL;
  32. private string authorization;
  33. public InvokeHelper()
  34. {
  35. IniFile ini = new IniFile(Global.curEvt.path + @"\CenterServiceURL.ini");
  36. if (string.IsNullOrEmpty(Global.inf.centerURL))
  37. {
  38. Global.inf.centerURL = ini.ReadValue("CENTER", "url");
  39. Global.inf.uploadURL = ini.ReadValue("CENTER", "upload");
  40. Global.inf.downURL = ini.ReadValue("CENTER", "download");
  41. Global.inf.ecURL = ini.ReadValue("CENTER", "ecToken");
  42. }
  43. Global.inf.mobilePayURL = ini.ReadValue("CENTER", "mobilePay");
  44. Global.inf.ecPrescURL = ini.ReadValue("CENTER", "prescription");
  45. // 移动支付
  46. if (string.IsNullOrEmpty(Global.inf.mobilePayURL))
  47. {
  48. Global.inf.mobilePayURL = "http://10.77.224.18:9001/CSB/hsa-fsi-no";
  49. }
  50. // 电子处方
  51. if (string.IsNullOrEmpty(Global.inf.ecPrescURL))
  52. {
  53. Global.inf.ecPrescURL = "http://10.77.245.22:9001/epc/api";
  54. }
  55. }
  56. #region 内部服务调用
  57. /// <summary>
  58. /// iris服务调用的封装
  59. /// </summary>
  60. /// <param name="data"></param>
  61. /// <returns></returns>
  62. public JObject invokeIrisService(string data, string serviceDesc)
  63. {
  64. string rtn = "", url = "";
  65. JObject joRtn = new JObject();
  66. try
  67. {
  68. //先根据用户请求的uri构造请求地址
  69. url = serviceURL;
  70. ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
  71. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
  72. //创建Web访问对象
  73. HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
  74. //把用户传过来的数据转成“UTF-8”的字节流
  75. byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
  76. //添加头部信息
  77. myRequest.Method = "POST";
  78. myRequest.ContentLength = buf.Length;
  79. myRequest.ContentType = "application/json";
  80. myRequest.Headers.Add("Authorization", authorization);
  81. myRequest.MaximumAutomaticRedirections = 1;
  82. myRequest.AllowAutoRedirect = true;
  83. //发送请求
  84. Stream stream = myRequest.GetRequestStream();
  85. stream.Write(buf, 0, buf.Length);
  86. stream.Close();
  87. //获取接口返回值
  88. //通过Web访问对象获取响应内容
  89. HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
  90. rtn = getResponseData(myResponse);
  91. joRtn = JObject.Parse(rtn);
  92. return joRtn;
  93. }
  94. catch (Exception ex)
  95. {
  96. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  97. rtn = JsonConvert.SerializeObject(joRtn);
  98. return joRtn;
  99. }
  100. }
  101. /// <summary>
  102. /// HIS服务调用的封装
  103. /// </summary>
  104. /// <param name="data"></param>
  105. /// <returns></returns>
  106. ///
  107. public JObject invokeHISService(string data, string serviceDesc)
  108. {
  109. JObject joRtn = new JObject();
  110. try
  111. {
  112. //先根据用户请求的uri构造请求地址
  113. serviceURL = string.Format("{0}/{1}", Global.hisConfig.ip, Global.hisConfig.url);
  114. authorization = Global.hisConfig.authorization;
  115. joRtn = invokeIrisService(data, serviceDesc);
  116. return joRtn;
  117. }
  118. catch (Exception ex)
  119. {
  120. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  121. return joRtn;
  122. }
  123. finally
  124. {
  125. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), JsonHelper.Compress(joRtn));
  126. }
  127. }
  128. /// <summary>
  129. /// 医保平台服务调用的封装
  130. /// </summary>
  131. /// <param name="data"></param>
  132. /// <returns></returns>
  133. public JObject invokeInsuService(string data, string serviceDesc)
  134. {
  135. string rtn = "";
  136. JObject joRtn = new JObject();
  137. try
  138. {
  139. //先根据用户请求的uri构造请求地址
  140. serviceURL = string.Format("{0}/{1}", Global.insuConfig.ip, Global.insuConfig.url);
  141. authorization = Global.insuConfig.authorization;
  142. joRtn = invokeIrisService(data, serviceDesc);
  143. rtn = JsonConvert.SerializeObject(joRtn);
  144. //if (serviceDesc == "插入签到信息")
  145. //{
  146. // MessageBox.Show("插入签到信息入参:" + data +"|返回值:"+ rtn.ToString()+"|"+ Global.insuConfig.url);
  147. //}
  148. return joRtn;
  149. }
  150. catch (Exception ex)
  151. {
  152. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  153. rtn = JsonConvert.SerializeObject(joRtn);
  154. return joRtn;
  155. }
  156. finally
  157. {
  158. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), rtn);
  159. }
  160. }
  161. private string getResponseData(HttpWebResponse response)
  162. {
  163. string data = "";
  164. if (response != null)
  165. {
  166. Stream s = response.GetResponseStream();
  167. StreamReader sRead = new StreamReader(s);
  168. data = sRead.ReadToEnd();
  169. sRead.Close();
  170. response.Close();
  171. }
  172. return data;
  173. }
  174. #endregion
  175. #region 医保中心调用
  176. /// <summary>
  177. /// 仅辅助交易、自定义交易使用
  178. /// </summary>
  179. /// <param name="funNo"></param>
  180. /// <param name="joInput"></param>
  181. /// <returns></returns>
  182. public JObject invokeCenterAgentService(string funNo, JObject joInput)
  183. {
  184. Global.curEvt.URL = Global.inf.centerURL + funNo;
  185. string data = JsonHelper.setCenterInpar(funNo, joInput);
  186. //if (funNo.StartsWith("35"))
  187. //{
  188. // // 进销存测试
  189. // Global.curEvt.URL = "http://10.42.149.235:9091/hss/api/hiinterface";
  190. //}
  191. return invokeCenterService(data);
  192. }
  193. private JObject invokeCenterService(string data, ModeEnum mode = ModeEnum.REST)
  194. {
  195. JObject joRtn = new JObject();
  196. try
  197. {
  198. IInvokeCenter center = new InvokeCenterFactory().create(mode);
  199. string outputData = "";
  200. string errMsg = "";
  201. int iInt = center.Init(ref errMsg);
  202. if (iInt == 0)
  203. {
  204. iInt = center.Business(data, ref outputData, ref errMsg);
  205. if (iInt == 0 && !string.IsNullOrEmpty(outputData))
  206. {
  207. try
  208. {
  209. joRtn = JObject.Parse(outputData);
  210. }
  211. catch (Exception ex)
  212. {
  213. joRtn.Add("infcode", iInt);
  214. joRtn.Add("err_msg", "返回参数异常:" + outputData);
  215. }
  216. }
  217. else
  218. {
  219. joRtn.Add("infcode", iInt);
  220. joRtn.Add("err_msg", outputData);
  221. return joRtn;
  222. }
  223. return joRtn;
  224. }
  225. else
  226. {
  227. joRtn.Add("infcode", -1);
  228. joRtn.Add("err_msg", "医保动态库初始化失败invokeInitByDLL:" + errMsg);
  229. return joRtn;
  230. }
  231. }
  232. finally
  233. {
  234. Global.writeLog("调用中心:", JsonHelper.Compress(data), joRtn.ToString());
  235. // 保存到服务器
  236. this.saveCenterLog(JsonHelper.Compress(data),joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  237. }
  238. }
  239. private void prepareCallURI(TradeEnum trade)
  240. {
  241. string funNo = trade.GetCode() ;
  242. Global.curEvt.funNo = funNo;
  243. string prefix = Global.inf.centerURL;
  244. switch (trade)
  245. {
  246. case TradeEnum.FileUpload:
  247. prefix = Global.inf.uploadURL??Global.inf.centerURL;
  248. break;
  249. case TradeEnum.FileDownload:
  250. prefix = Global.inf.downURL;
  251. break;
  252. default:
  253. prefix = Global.inf.centerURL;
  254. break;
  255. }
  256. if (Global.curEvt.testMode)
  257. {
  258. // 医保测试环境
  259. prefix = "http://10.77.224.18:9001/CSB/hsa-fsi-no";
  260. }
  261. // 根据情况确实是否需要加funNo
  262. Global.curEvt.URL = prefix + Global.curEvt.funNo;
  263. }
  264. /// <summary>
  265. /// 通过枚举转换要调用的接口
  266. /// </summary>
  267. /// <param name="trade"></param>
  268. /// <param name="data"></param>
  269. /// <returns></returns>
  270. public JObject invokeCenterService(TradeEnum trade, JObject joInput)
  271. {
  272. string funNo = trade.GetCode();
  273. // 入参统一转换
  274. JObject request = Utils.ConvertRequest<JObject>(trade,joInput);
  275. string data = JsonHelper.toJsonString(request);
  276. // 统一封装请求头
  277. if (trade.GetMode() == ModeEnum.REST)
  278. {
  279. data = JsonHelper.setCenterInpar(funNo, request);
  280. }
  281. JObject joRtn = new JObject();
  282. // 调试模式
  283. if (Global.curEvt.enabledDebug)
  284. {
  285. CenterResult center = new CenterResult();
  286. center.setTradeNo(trade.GetCode(), data);
  287. if (center.ShowDialog() == DialogResult.OK)
  288. {
  289. // 接口实际返回数据
  290. string outPar = center.returnData;
  291. joRtn = JObject.Parse(outPar);
  292. }
  293. }
  294. else
  295. {
  296. prepareCallURI(trade);
  297. joRtn = invokeCenterService(data, trade.GetMode());
  298. }
  299. // 返回结果统一转换
  300. joRtn = Utils.ConvertResponse<JObject>(trade,joRtn);
  301. return joRtn;
  302. }
  303. /// <summary>
  304. /// 医保目录txt文件下载
  305. /// </summary>
  306. /// <param name="data"></param>
  307. /// <returns></returns>
  308. public JObject DownloadCenterFile(string data, ModeEnum mode = ModeEnum.REST)
  309. {
  310. //download file
  311. IInvokeCenter center = new InvokeCenterFactory().create(mode);
  312. string outputMsg = "";
  313. JObject joRtn = new JObject();
  314. int rtnCode = center.DownloadFile(data, ref outputMsg);
  315. if(rtnCode==0)
  316. {
  317. joRtn = JObject.Parse(outputMsg);
  318. }
  319. else
  320. {
  321. joRtn.Add("infcode", -1);
  322. joRtn.Add("err_msg", "下载文件失败DownloadFile:" + outputMsg);
  323. }
  324. return joRtn;
  325. }
  326. #endregion
  327. #region 移动
  328. /// <summary>
  329. /// 移动
  330. /// </summary>
  331. /// <param name="funNO"></param>
  332. /// <param name="data"></param>
  333. /// <returns></returns>
  334. public JObject invokeMPService(string funNO, string data)
  335. {
  336. return invokeMPService(funNO, JObject.Parse(data));
  337. }
  338. public JObject invokeMPService(string funNO, JObject joInput)
  339. {
  340. JObject joRtn = new JObject();
  341. String outPar = "";
  342. try
  343. {
  344. string url = "";
  345. //switch (funNO)
  346. //{
  347. // case "6201":
  348. // url = "/org/local/api/hos/uldFeeInfo";
  349. // break;
  350. // case "6202":
  351. // url = "/org/local/api/hos/pay_order";
  352. // break;
  353. // case "6203":
  354. // url = "/org/local/api/hos/refund_Order";
  355. // break;
  356. // case "6301":
  357. // url = "/org/local/api/hos/query_order_info";
  358. // break;
  359. // case "6401":
  360. // url = "/org/local/api/hos/revoke_order";
  361. // break;
  362. // default:
  363. // break;
  364. //}
  365. EncryptHelper encrypt = new EncryptHelper();
  366. string data = JsonHelper.setMPCenterInpar(funNO, joInput);
  367. // 移动支付地址
  368. Global.curEvt.URL = Global.inf.mobilePayURL + funNO;
  369. string outputData = "", errMsg = "";
  370. // 动态调试模式
  371. if (Global.curEvt.enabledDebug)
  372. {
  373. CenterResult center = new CenterResult();
  374. center.setTradeNo(funNO,data);
  375. if (center.ShowDialog() == DialogResult.OK)
  376. {
  377. outPar = center.returnData;
  378. return JObject.Parse(outPar);
  379. }
  380. }
  381. try
  382. {
  383. InvokeRestCenter mobileCenter = new InvokeRestCenter();
  384. int iInt = mobileCenter.Business(data, ref outputData, ref errMsg);
  385. joRtn = JObject.Parse(outputData);
  386. Global.writeLog(funNO + "【密文出参】:\r\n" + joRtn.ToString());
  387. string encData = JsonHelper.getDestValue(joRtn, "encData");
  388. string signData = JsonHelper.getDestValue(joRtn, "signData");
  389. if (!string.IsNullOrEmpty(encData) && !string.IsNullOrEmpty(signData))
  390. {
  391. joRtn.Remove("encData");
  392. joRtn.Remove("signData");
  393. joRtn.Remove("data");
  394. //解密
  395. string decData = encrypt.decrypt(encData);
  396. // 验签
  397. JsonConvert.DefaultSettings = () => new JsonSerializerSettings
  398. {
  399. FloatParseHandling = FloatParseHandling.Decimal
  400. };
  401. joRtn.Add("data", JToken.FromObject(JsonConvert.DeserializeObject(decData)));
  402. bool rtn = encrypt.verify(joRtn, signData);
  403. if (rtn)
  404. {
  405. Global.writeLog(funNO + "【明文出参】:\r\n" + decData);
  406. joRtn = JObject.Parse(decData);
  407. joRtn.Add("success", "True");
  408. }
  409. else
  410. {
  411. Global.writeLog("验签失败,请核查!");
  412. }
  413. }
  414. return joRtn;
  415. }
  416. finally
  417. {
  418. this.saveCenterLog(JsonHelper.Compress(data), joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  419. }
  420. }
  421. catch (Exception ex)
  422. {
  423. if (joRtn["infcode"] == null)
  424. { joRtn.Add("infcode", -1); }
  425. if (joRtn["err_msg"] == null)
  426. { joRtn.Add("err_msg", "invokeCenterService(3):" + ex.Message); }
  427. outPar = JsonHelper.Compress(joRtn);
  428. return joRtn;
  429. }
  430. finally
  431. {
  432. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", joInput.ToString(), joRtn.ToString());
  433. this.saveCenterLog(joInput.ToString(), joRtn.ToString(), joInput.ToString(), joRtn.ToString());
  434. }
  435. }
  436. /// <summary>
  437. /// 保存中心交易日志到数据库
  438. /// </summary>
  439. /// <param name="inParam"></param>
  440. /// <param name="outParam"></param>
  441. /// <param name="inParamPlain"></param>
  442. /// <param name="outParamPlain"></param>
  443. private void saveCenterLog(string inParam, string outParam, string inParamPlain, string outParamPlain)
  444. {
  445. dynamic joIris = new JObject();
  446. string sRtn = "";
  447. try
  448. {
  449. //解析postContent,插入医保交易日志表
  450. JObject joInParam = new JObject(JObject.Parse(inParam));
  451. //解包
  452. JObject joIn = Utils.removeWrapper(joInParam);
  453. JObject joOut = new JObject(JObject.Parse(outParam));
  454. JObject joInPlain = new JObject(JObject.Parse(inParamPlain));
  455. JObject joOutPlain = new JObject(JObject.Parse(outParamPlain));
  456. JArray jaParams = new JArray();
  457. JObject joParam = new JObject();
  458. joParam.Add("inParam", JObject.FromObject(joIn));
  459. joParam.Add("outParam", JObject.FromObject(joOut));
  460. joParam.Add("inParamPlain", JObject.FromObject(joInPlain));
  461. joParam.Add("outParamPlain", JObject.FromObject(joOutPlain));
  462. joParam.Add("HospitalDr", Global.inf.hospitalDr);
  463. joParam.Add("InterfaceDr", Global.inf.interfaceDr);
  464. joParam.Add("updateUserID", Global.user.ID);
  465. joParam.Add("psn_no", Global.pat.psn_no);
  466. jaParams.Add(joParam);
  467. joIris.code = "09010021";
  468. joIris.Add("params", jaParams);
  469. //InvokeHelper invoker = new InvokeHelper();
  470. sRtn = invokeInsuService(joIris.ToString(), "保存日志到数据库").ToString();
  471. }
  472. catch (Exception ex)
  473. {
  474. sRtn = JsonHelper.setExceptionJson(-100, "保存日志异常", ex.Message).ToString();
  475. Global.writeLog_Iris("保存日志异常:" + sRtn.ToString());
  476. }
  477. }
  478. #endregion
  479. }
  480. }