InvokeHelper.cs 19 KB

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