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