InvokeHelper.cs 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516
  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. if (string.IsNullOrEmpty(Global.inf.centerURL))
  36. {
  37. IniFile ini = new IniFile(Global.curEvt.path + @"\CenterServiceURL.ini");
  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. Global.inf.mobilePayURL = ini.ReadValue("CENTER", "mobilePay");
  43. Global.inf.ecPrescURL = ini.ReadValue("CENTER", "prescription");
  44. // 移动支付
  45. if (string.IsNullOrEmpty(Global.inf.mobilePayURL))
  46. {
  47. Global.inf.mobilePayURL = "http://10.123.185.12:8080";
  48. }
  49. // 电子处方
  50. if (string.IsNullOrEmpty(Global.inf.ecPrescURL))
  51. {
  52. Global.inf.ecPrescURL = "http://10.77.245.22:9001/epc/api";
  53. }
  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 + Global.curEvt.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. Global.curEvt.funNo = trade.GetCode() ;
  242. string prefix = Global.inf.centerURL;
  243. switch (trade)
  244. {
  245. case TradeEnum.FileUpload:
  246. prefix = Global.inf.uploadURL??Global.inf.centerURL;
  247. break;
  248. case TradeEnum.FileDownload:
  249. prefix = Global.inf.downURL;
  250. break;
  251. default:
  252. prefix = Global.inf.centerURL;
  253. break;
  254. }
  255. // 根据情况确实是否需要加funNo
  256. Global.curEvt.URL = prefix + Global.curEvt.funNo;
  257. }
  258. /// <summary>
  259. /// 通过枚举转换要调用的接口
  260. /// </summary>
  261. /// <param name="trade"></param>
  262. /// <param name="data"></param>
  263. /// <returns></returns>
  264. public JObject invokeCenterService(TradeEnum trade, JObject joInput)
  265. {
  266. string funNo = trade.GetCode();
  267. // 入参统一转换
  268. JObject request = Utils.ConvertRequest<JObject>(trade,joInput);
  269. string data = JsonHelper.toJsonString(request);
  270. // 统一封装请求头
  271. if (trade.GetMode() == ModeEnum.REST)
  272. {
  273. data = JsonHelper.setCenterInpar(funNo, request);
  274. }
  275. JObject joRtn = new JObject();
  276. // 调试模式
  277. if (Global.curEvt.enabledDebug)
  278. {
  279. CenterResult center = new CenterResult();
  280. center.setTradeNo(trade.GetCode(), data);
  281. if (center.ShowDialog() == DialogResult.OK)
  282. {
  283. // 接口实际返回数据
  284. string outPar = center.returnData;
  285. joRtn = JObject.Parse(outPar);
  286. }
  287. }
  288. else
  289. {
  290. prepareCallURI(trade);
  291. joRtn = invokeCenterService(data, trade.GetMode());
  292. }
  293. // 返回结果统一转换
  294. joRtn = Utils.ConvertResponse<JObject>(trade,joRtn);
  295. return joRtn;
  296. }
  297. /// <summary>
  298. /// 医保目录txt文件下载
  299. /// </summary>
  300. /// <param name="data"></param>
  301. /// <returns></returns>
  302. public JObject DownloadCenterFile(string data, ModeEnum mode = ModeEnum.REST)
  303. {
  304. //download file
  305. IInvokeCenter center = new InvokeCenterFactory().create(mode);
  306. string outputMsg = "";
  307. JObject joRtn = new JObject();
  308. int rtnCode = center.DownloadFile(data, ref outputMsg);
  309. if(rtnCode==0)
  310. {
  311. joRtn = JObject.Parse(outputMsg);
  312. }
  313. else
  314. {
  315. joRtn.Add("infcode", -1);
  316. joRtn.Add("err_msg", "下载文件失败DownloadFile:" + outputMsg);
  317. }
  318. return joRtn;
  319. }
  320. #endregion
  321. #region 移动
  322. /// <summary>
  323. /// 移动
  324. /// </summary>
  325. /// <param name="funNO"></param>
  326. /// <param name="data"></param>
  327. /// <returns></returns>
  328. public JObject invokeMPService(string funNO, string data)
  329. {
  330. return invokeMPService(funNO, JObject.Parse(data));
  331. }
  332. public JObject invokeMPService(string funNO, JObject joInput)
  333. {
  334. JObject joRtn = new JObject();
  335. String outPar = "";
  336. try
  337. {
  338. string url = "";
  339. switch (funNO)
  340. {
  341. case "6201":
  342. url = "/org/local/api/hos/uldFeeInfo";
  343. break;
  344. case "6202":
  345. url = "/org/local/api/hos/pay_order";
  346. break;
  347. case "6203":
  348. url = "/org/local/api/hos/refund_Order";
  349. break;
  350. case "6301":
  351. url = "/org/local/api/hos/query_order_info";
  352. break;
  353. case "6401":
  354. url = "/org/local/api/hos/revoke_order";
  355. break;
  356. default:
  357. break;
  358. }
  359. EncryptHelper encrypt = new EncryptHelper();
  360. string data = JsonHelper.setMPCenterInpar(funNO, joInput);
  361. // 移动支付地址
  362. Global.curEvt.URL = Global.inf.mobilePayURL + url;
  363. string outputData = "", errMsg = "";
  364. // 动态调试模式
  365. if (Global.curEvt.enabledDebug)
  366. {
  367. CenterResult center = new CenterResult();
  368. center.setTradeNo(funNO,data);
  369. if (center.ShowDialog() == DialogResult.OK)
  370. {
  371. outPar = center.returnData;
  372. return JObject.Parse(outPar);
  373. }
  374. }
  375. try
  376. {
  377. InvokeRestCenter mobileCenter = new InvokeRestCenter();
  378. int iInt = mobileCenter.Business(data, ref outputData, ref errMsg);
  379. joRtn = JObject.Parse(outputData);
  380. Global.writeLog(funNO + "【密文出参】:\r\n" + joRtn.ToString());
  381. string encData = JsonHelper.getDestValue(joRtn, "encData");
  382. string signData = JsonHelper.getDestValue(joRtn, "signData");
  383. if (!string.IsNullOrEmpty(encData) && !string.IsNullOrEmpty(signData))
  384. {
  385. joRtn.Remove("encData");
  386. joRtn.Remove("signData");
  387. joRtn.Remove("data");
  388. //解密
  389. string decData = encrypt.decrypt(encData);
  390. // 验签
  391. JsonConvert.DefaultSettings = () => new JsonSerializerSettings
  392. {
  393. FloatParseHandling = FloatParseHandling.Decimal
  394. };
  395. joRtn.Add("data", JToken.FromObject(JsonConvert.DeserializeObject(decData)));
  396. bool rtn = encrypt.verify(joRtn, signData);
  397. if (rtn)
  398. {
  399. Global.writeLog(funNO + "【明文出参】:\r\n" + decData);
  400. joRtn = JObject.Parse(decData);
  401. joRtn.Add("success", "True");
  402. }
  403. else
  404. {
  405. Global.writeLog("验签失败,请核查!");
  406. }
  407. }
  408. return joRtn;
  409. }
  410. finally
  411. {
  412. this.saveCenterLog(JsonHelper.Compress(data), joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  413. }
  414. }
  415. catch (Exception ex)
  416. {
  417. if (joRtn["infcode"] == null)
  418. { joRtn.Add("infcode", -1); }
  419. if (joRtn["err_msg"] == null)
  420. { joRtn.Add("err_msg", "invokeCenterService(3):" + ex.Message); }
  421. outPar = JsonHelper.Compress(joRtn);
  422. return joRtn;
  423. }
  424. finally
  425. {
  426. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", joInput.ToString(), joRtn.ToString());
  427. this.saveCenterLog(joInput.ToString(), joRtn.ToString(), joInput.ToString(), joRtn.ToString());
  428. }
  429. }
  430. /// <summary>
  431. /// 保存中心交易日志到数据库
  432. /// </summary>
  433. /// <param name="inParam"></param>
  434. /// <param name="outParam"></param>
  435. /// <param name="inParamPlain"></param>
  436. /// <param name="outParamPlain"></param>
  437. private void saveCenterLog(string inParam, string outParam, string inParamPlain, string outParamPlain)
  438. {
  439. dynamic joIris = new JObject();
  440. string sRtn = "";
  441. try
  442. {
  443. //解析postContent,插入医保交易日志表
  444. JObject joInParam = new JObject(JObject.Parse(inParam));
  445. //解包
  446. JObject joIn = Utils.removeWrapper(joInParam);
  447. JObject joOut = new JObject(JObject.Parse(outParam));
  448. JObject joInPlain = new JObject(JObject.Parse(inParamPlain));
  449. JObject joOutPlain = new JObject(JObject.Parse(outParamPlain));
  450. JArray jaParams = new JArray();
  451. JObject joParam = new JObject();
  452. joParam.Add("inParam", JObject.FromObject(joIn));
  453. joParam.Add("outParam", JObject.FromObject(joOut));
  454. joParam.Add("inParamPlain", JObject.FromObject(joInPlain));
  455. joParam.Add("outParamPlain", JObject.FromObject(joOutPlain));
  456. joParam.Add("HospitalDr", Global.inf.hospitalDr);
  457. joParam.Add("InterfaceDr", Global.inf.interfaceDr);
  458. joParam.Add("updateUserID", Global.user.ID);
  459. joParam.Add("psn_no", Global.pat.psn_no);
  460. jaParams.Add(joParam);
  461. joIris.code = "09010021";
  462. joIris.Add("params", jaParams);
  463. //InvokeHelper invoker = new InvokeHelper();
  464. sRtn = invokeInsuService(joIris.ToString(), "保存日志到数据库").ToString();
  465. }
  466. catch (Exception ex)
  467. {
  468. sRtn = JsonHelper.setExceptionJson(-100, "保存日志异常", ex.Message).ToString();
  469. Global.writeLog_Iris("保存日志异常:" + sRtn.ToString());
  470. }
  471. }
  472. #endregion
  473. }
  474. }