InvokeHelper.cs 17 KB

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