InvokeHelper.cs 47 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163
  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 AnHuiMI.Forms;
  27. using AnHuiMI.Common;
  28. using static System.Net.WebRequestMethods;
  29. using File = System.IO.File;
  30. namespace PTMedicalInsurance.Helper
  31. {
  32. public class InvokeHelper
  33. {
  34. private string serviceURL;
  35. private string authorization;
  36. /// <summary>
  37. /// 初始化函数
  38. /// </summary>
  39. /// <param name="fixmedins_code"></param>
  40. /// <param name="infosyscode"></param>
  41. /// <param name="infosyssign"></param>
  42. /// <param name="url"></param>
  43. /// <param name="pErrMsg"></param>
  44. /// <returns></returns>
  45. [DllImport("CHSInterface.dll", EntryPoint = "Init", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] //, ExactSpelling = false, CallingConvention = CallingConvention.StdCall
  46. static extern int Init(string fixmedins_code, string infosyscode, string infosyssign, string url, StringBuilder pErrMsg);
  47. /// <summary>
  48. /// 文件下载函数
  49. /// </summary>
  50. /// <param name="fixmedins_code"></param>
  51. /// <param name="infosyscode"></param>
  52. /// <param name="infosyssign"></param>
  53. /// <param name="inputData"></param>
  54. /// <param name="outputData"></param>
  55. /// <param name="pErrMsg"></param>
  56. /// <returns></returns>
  57. [DllImport("CHSInterface.dll", EntryPoint = "DownloadFile", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] //, ExactSpelling = false, CallingConvention = CallingConvention.StdCall
  58. static extern int DownloadFile(string fixmedins_code, string infosyscode, string infosyssign, string inputData, StringBuilder outputData, StringBuilder pErrMsg);
  59. /// <summary>
  60. /// 文件上传函数
  61. /// </summary>
  62. /// <param name="fixmedins_code"></param>
  63. /// <param name="infosyscode"></param>
  64. /// <param name="infosyssign"></param>
  65. /// <param name="inputData"></param>
  66. /// <param name="outputData"></param>
  67. /// <param name="pErrMsg"></param>
  68. /// <returns></returns>
  69. [DllImport("CHSInterface.dll", EntryPoint = "UploadFile", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] //, ExactSpelling = false, CallingConvention = CallingConvention.StdCall
  70. static extern int UploadFile(string fixmedins_code, string infosyscode, string infosyssign, string fileName,string inputData, StringBuilder outputData, StringBuilder pErrMsg);
  71. /// <summary>
  72. /// 通用业务函数
  73. /// </summary>
  74. /// <param name="fixmedins_code"></param>
  75. /// <param name="infosyscode"></param>
  76. /// <param name="infosyssign"></param>
  77. /// <param name="inputData"></param>
  78. /// <param name="outputData"></param>
  79. /// <param name="errmsg"></param>
  80. /// <returns></returns>
  81. [DllImport("CHSInterface.dll", EntryPoint = "BusinessHandle", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] //, ExactSpelling = false, CallingConvention = CallingConvention.StdCall
  82. static extern int BusinessHandle(string fixmedins_code, string infosyscode, string infosyssign, string inputData, StringBuilder outputData, StringBuilder errmsg);
  83. /// <summary>
  84. /// 通用业务函数
  85. /// </summary>
  86. /// <param name="fixmedins_code"></param>
  87. /// <param name="infosyscode"></param>
  88. /// <param name="infosyssign"></param>
  89. /// <param name="inputData"></param>
  90. /// <param name="outputData"></param>
  91. /// <param name="errmsg"></param>
  92. /// <returns></returns>
  93. [DllImport("CHSInterface.dll", EntryPoint = "BusinessHandleW", CharSet = CharSet.Unicode, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)] //, ExactSpelling = false, CallingConvention = CallingConvention.StdCall
  94. static extern int BusinessHandleW(StringBuilder fixmedins_code, StringBuilder infosyscode, StringBuilder infosyssign, StringBuilder inputData, StringBuilder outputData, StringBuilder errmsg);
  95. public InvokeHelper()
  96. {
  97. IniFile ini = new IniFile(Global.curEvt.path + @"\CenterServiceURL.ini");
  98. if (Global.inf.interfaceDr == 12)//省(瑶海)
  99. {
  100. Global.inf.uploadURL = "http://10.88.29.31:80/fsi/api/fileupload/upload";
  101. Global.inf.downURL = "http://10.88.29.31:80/fsi/api/fileupload/download";
  102. }
  103. if (Global.inf.interfaceDr == 15)//省
  104. {
  105. Global.inf.uploadURL = "http://10.66.155.176:80/fsi/api/fileupload/upload";
  106. Global.inf.downURL = "http://10.66.155.176:80/fsi/api/fileupload/download";
  107. }
  108. if (Global.inf.interfaceDr == 16 || Global.inf.interfaceDr == 17)//市(瑶海) //市
  109. {
  110. Global.inf.uploadURL = "http://10.67.240.56:80/fsi/api/fileupload/upload";
  111. Global.inf.downURL = "http://10.67.240.56:80/fsi/api/fileupload/download";
  112. }
  113. Global.inf.ecURL = "http://10.66.159.55:8080/localcfc/api/hsecfc/localQrCodeQuery";
  114. LoadCenterURL(false);
  115. }
  116. private void LoadCenterURL(bool reloadFromCfgFile)
  117. {
  118. IniFile ini = new IniFile(Global.curEvt.path + @"\CenterServiceURL.ini");
  119. // 默认采用的是后台配置的地址
  120. if (reloadFromCfgFile)
  121. {
  122. Global.inf.centerURL = ini.ReadValue("CENTER", "url");
  123. Global.inf.ecURL = ini.ReadValue("CENTER", "ecToken");
  124. }
  125. Global.inf.mobilePayURL = ini.ReadValue("CENTER", "mobilePay");
  126. Global.inf.ecPrescURL = ini.ReadValue("CENTER", "prescription");
  127. // 移动支付
  128. if (string.IsNullOrEmpty(Global.inf.mobilePayURL))
  129. {
  130. Global.inf.mobilePayURL = "http://10.66.159.55:7080";
  131. }
  132. // 电子处方
  133. if (string.IsNullOrEmpty(Global.inf.ecPrescURL))
  134. {
  135. Global.inf.ecPrescURL = "http://10.123.185.12:8080/epc/api";
  136. }
  137. }
  138. /// <summary>
  139. /// iris服务调用的封装
  140. /// </summary>
  141. /// <param name="data"></param>
  142. /// <returns></returns>
  143. public JObject invokeIrisService(string data, string serviceDesc)
  144. {
  145. string rtn = "", url = "";
  146. JObject joRtn = new JObject();
  147. try
  148. {
  149. //先根据用户请求的uri构造请求地址
  150. url = serviceURL;
  151. ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
  152. ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3 | SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
  153. //创建Web访问对象
  154. HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url);
  155. //把用户传过来的数据转成“UTF-8”的字节流
  156. byte[] buf = System.Text.Encoding.GetEncoding("UTF-8").GetBytes(data);
  157. //添加头部信息
  158. myRequest.Method = "POST";
  159. myRequest.ContentLength = buf.Length;
  160. myRequest.ContentType = "application/json";
  161. myRequest.Headers.Add("Authorization", authorization);
  162. myRequest.MaximumAutomaticRedirections = 1;
  163. myRequest.AllowAutoRedirect = true;
  164. //发送请求
  165. Stream stream = myRequest.GetRequestStream();
  166. stream.Write(buf, 0, buf.Length);
  167. stream.Close();
  168. //获取接口返回值
  169. //通过Web访问对象获取响应内容
  170. HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
  171. rtn = getResponseData(myResponse);
  172. joRtn = JObject.Parse(rtn);
  173. return joRtn;
  174. }
  175. catch (Exception ex)
  176. {
  177. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  178. rtn = JsonConvert.SerializeObject(joRtn);
  179. return joRtn;
  180. }
  181. }
  182. /// <summary>
  183. /// HIS服务调用的封装
  184. /// </summary>
  185. /// <param name="data"></param>
  186. /// <returns></returns>
  187. ///
  188. public JObject invokeHISService(string data, string serviceDesc)
  189. {
  190. JObject joRtn = new JObject();
  191. try
  192. {
  193. //先根据用户请求的uri构造请求地址
  194. serviceURL = string.Format("{0}/{1}", Global.hisConfig.ip, Global.hisConfig.url);
  195. authorization = Global.hisConfig.authorization;
  196. joRtn = invokeIrisService(data, serviceDesc);
  197. return joRtn;
  198. }
  199. catch (Exception ex)
  200. {
  201. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  202. return joRtn;
  203. }
  204. finally
  205. {
  206. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), JsonHelper.Compress(joRtn));
  207. }
  208. }
  209. /// <summary>
  210. /// 医保平台服务调用的封装
  211. /// </summary>
  212. /// <param name="data"></param>
  213. /// <returns></returns>
  214. public JObject invokeInsuService(string data, string serviceDesc)
  215. {
  216. string rtn = "";
  217. JObject joRtn = new JObject();
  218. try
  219. {
  220. //先根据用户请求的uri构造请求地址
  221. serviceURL = string.Format("{0}/{1}", Global.insuConfig.ip, Global.insuConfig.url);
  222. authorization = Global.insuConfig.authorization;
  223. joRtn = invokeIrisService(data, serviceDesc);
  224. rtn = JsonConvert.SerializeObject(joRtn);
  225. //if (serviceDesc == "插入签到信息")
  226. //{
  227. // MessageBox.Show("插入签到信息入参:" + data +"|返回值:"+ rtn.ToString()+"|"+ Global.insuConfig.url);
  228. //}
  229. return joRtn;
  230. }
  231. catch (Exception ex)
  232. {
  233. joRtn = JsonHelper.setExceptionJson(-1, serviceDesc, ex.Message);
  234. rtn = JsonConvert.SerializeObject(joRtn);
  235. return joRtn;
  236. }
  237. finally
  238. {
  239. Global.writeLog_Iris(serviceDesc + "(" + serviceURL + ")" + "Authorization:" + (authorization), JsonHelper.Compress(data), rtn);
  240. }
  241. }
  242. /// <summary>
  243. /// 医保中心Post服务调用封装
  244. /// </summary>
  245. /// <param name="data"></param>
  246. /// <returns></returns>
  247. private JObject invokeCenterService(string data)
  248. {
  249. string postContent = "";
  250. JObject joRtn = new JObject();
  251. try
  252. {
  253. Global.writeLog(string.Format("调用中心{0}接口入参:{1}",data, Global.curEvt.URL));
  254. //创建一个HTTP请求
  255. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL);
  256. //Post请求方式
  257. request.Method = "POST";
  258. //string nonce = Guid.NewGuid().ToString(); //非重复的随机字符串(十分钟内不能重复)
  259. //string timestamp = TimeStamp.get13().ToString(); //当前时间戳(秒)
  260. //string BusinessID = Global.inf.BusinessID; //服务商ID
  261. //string InsuHosID = Global.inf.hospitalNO; //医疗机构ID
  262. //string CreditID = Global.inf.CreditID; //服务商统一社会信用代码
  263. //内容类型
  264. request.ContentType = "application/json;charset=UTF-8";
  265. //昆明增加头部信息
  266. //string sTemp = timestamp + BusinessID + nonce;
  267. //Sha256 加密生成的签名 signature = sha256(hsf_timestamp + infosyssign + hsf_nonce)
  268. //string signature = Encrypt.SHA256EncryptStr(sTemp);
  269. //request.Headers.Add("hsf_signature", signature);
  270. //request.Headers.Add("hsf_timestamp", timestamp);
  271. //request.Headers.Add("hsf_nonce", nonce);
  272. //request.Headers.Add("fixmedins_code", InsuHosID);
  273. //request.Headers.Add("infosyscode", CreditID);
  274. //设置参数,并进行URL编码
  275. string paraUrlCoded = data;//System.Web.HttpUtility.UrlEncode(jsonParas);
  276. byte[] payload;
  277. //将Json字符串转化为字节
  278. payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
  279. //设置请求的ContentLength
  280. request.ContentLength = payload.Length;
  281. //发送请求,获得请求流
  282. Stream writer;
  283. writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象
  284. //将请求参数写入流
  285. writer.Write(payload, 0, payload.Length);
  286. writer.Close();//关闭请求流
  287. // String strValue = "";//strValue为http响应所返回的字符流
  288. HttpWebResponse response = null;
  289. try
  290. {
  291. //获得响应流
  292. response = (HttpWebResponse)request.GetResponse();
  293. }
  294. catch (WebException ex)
  295. {
  296. // return JsonHelper.setExceptionJson(-99, "centerServeiceInvok中获得响应流异常", ex.Message);
  297. HttpWebResponse res = (HttpWebResponse)ex.Response;
  298. Stream myResponseStream = res.GetResponseStream();
  299. StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
  300. string retString = myStreamReader.ReadToEnd();
  301. return JsonHelper.setExceptionJson(-99, "获得响应流异常", retString);
  302. }
  303. postContent = getResponseData(response);
  304. joRtn = JObject.Parse(postContent);//返回Json数据
  305. if (joRtn.ContainsKey("body")) {
  306. joRtn = (JObject)joRtn.GetValue("body");
  307. }
  308. return joRtn;
  309. }
  310. catch (Exception ex)
  311. {
  312. postContent = "调用中心服务异常" + ex.Message;
  313. joRtn.Add("infcode", -1);
  314. joRtn.Add("err_msg", "invokeCenterService(1):" + ex.Message);
  315. return joRtn;
  316. }
  317. }
  318. private string getResponseData(HttpWebResponse response) {
  319. string data = "";
  320. if (response != null)
  321. {
  322. Stream s = response.GetResponseStream();
  323. StreamReader sRead = new StreamReader(s);
  324. data = sRead.ReadToEnd();
  325. sRead.Close();
  326. response.Close();
  327. }
  328. return data;
  329. }
  330. /// <summary>
  331. /// 调用医保动态库文件下载函数 CM 20220925
  332. /// </summary>
  333. /// <param name="fixmedins_code"></param>
  334. /// <param name="infosyscode"></param>
  335. /// <param name="infosyssign"></param>
  336. /// <param name="inputData"></param>
  337. /// <param name="outputData"></param>
  338. /// <param name="pErrMsg"></param>
  339. /// <returns>0或小于0</returns>
  340. private int invokeDownloadFileByDLL(string fixmedins_code, string infosyscode, string infosyssign, string inputData, ref string outputData, ref string pErrMsg)
  341. {
  342. pErrMsg = "";
  343. outputData = "";
  344. try
  345. {
  346. StringBuilder errmsgSb = new StringBuilder(4096);
  347. StringBuilder outSb = new StringBuilder(40960);
  348. int pRtn = DownloadFile(fixmedins_code, infosyscode, infosyssign, inputData, outSb, errmsgSb);
  349. if (pRtn < 0)
  350. {
  351. pErrMsg = errmsgSb.ToString();
  352. return -1;
  353. }
  354. else
  355. {
  356. outputData = outSb.ToString();
  357. }
  358. return pRtn;
  359. }
  360. catch (Exception ex)
  361. {
  362. pErrMsg = "invokeInitByDLL.DownloadFile 异常:" + ex.Message;
  363. return -1;
  364. }
  365. finally
  366. {
  367. Global.writeLog("invokeInitByDLL.DownloadFile 医保动态库文件下载函数", inputData, outputData);
  368. }
  369. }
  370. /// <summary>
  371. /// 这个是调用业务服务的invokeCenterService
  372. /// </summary>
  373. /// <param name="funNO"></param>
  374. /// <param name="data"></param>
  375. /// <returns></returns>
  376. public JObject invokeCenterService(string funNO, JObject data)
  377. {
  378. JObject joRtn = new JObject();
  379. string outPar = "";
  380. try
  381. {
  382. // 动态调试模式
  383. if (Global.curEvt.enabledDebug)
  384. {
  385. CenterResult center = new CenterResult();
  386. center.setTradeNo(funNO);
  387. if (center.ShowDialog() == DialogResult.OK)
  388. {
  389. outPar = center.returnData;
  390. return JObject.Parse(outPar);
  391. }
  392. }
  393. setCenterURL(funNO);
  394. joRtn = invokeCenterService(data.ToString());
  395. outPar = JsonHelper.Compress(joRtn);
  396. return joRtn;
  397. }
  398. catch (Exception ex)
  399. {
  400. if (joRtn["infcode"] == null)
  401. { joRtn.Add("infcode", -1); }
  402. if (joRtn["err_msg"] == null)
  403. { joRtn.Add("err_msg", "invokeCenterService(2):" + ex.Message); }
  404. outPar = JsonHelper.Compress(joRtn);
  405. return joRtn;
  406. }
  407. finally
  408. {
  409. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", JsonHelper.Compress(data), joRtn.ToString());
  410. this.saveCenterLog(JsonHelper.Compress(data), joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  411. }
  412. }
  413. private void setCenterURL(string funNo)
  414. {
  415. string prefix = Global.inf.centerURL;
  416. if (Global.curEvt.testMode)
  417. {
  418. // 医保测试环境
  419. LoadCenterURL(true);
  420. }
  421. switch (funNo)
  422. {
  423. case "4101A":
  424. case "3101":
  425. case "3102":
  426. prefix = "http://10.66.155.173:8086/1.0.0/hsa-fsi-";
  427. break;
  428. default:
  429. prefix = Global.inf.centerURL;
  430. break;
  431. }
  432. //移动支付使用医保测试环境【测试】,正式使用时须去掉
  433. if (funNo.StartsWith("62") || funNo.StartsWith("63") || funNo.StartsWith("64"))
  434. {
  435. prefix = "http://10.67.248.214:8086/1.0.0/hsa-fsi-"; //测试
  436. }
  437. Global.curEvt.URL = prefix + funNo;
  438. }
  439. /// <summary>
  440. /// 这个是下载目录用的invokeCenterService
  441. /// </summary>
  442. /// <param name="funNO"></param>
  443. /// <param name="data"></param>
  444. /// <returns></returns>
  445. public JObject invokeCenterService(string funNO, string data)
  446. {
  447. JObject joRtn = new JObject();
  448. try
  449. {
  450. // 动态调试模式
  451. if (Global.curEvt.enabledDebug)
  452. {
  453. CenterResult center = new CenterResult();
  454. center.setTradeNo(funNO);
  455. if (center.ShowDialog() == DialogResult.OK)
  456. {
  457. string outPar = center.returnData;
  458. return JObject.Parse(outPar);
  459. }
  460. }
  461. setCenterURL(funNO);
  462. joRtn = invokeCenterService(data);
  463. return joRtn;
  464. }
  465. catch (Exception ex)
  466. {
  467. if (joRtn["infcode"] == null)
  468. { joRtn.Add("infcode", -1); }
  469. if (joRtn["err_msg"] == null)
  470. { joRtn.Add("err_msg", "invokeCenterService(3):" + ex.Message); }
  471. return joRtn;
  472. }
  473. finally
  474. {
  475. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", JsonHelper.Compress(data), joRtn.ToString());
  476. this.saveCenterLog(JsonHelper.Compress(data), joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  477. }
  478. }
  479. /// <summary>
  480. /// 移动
  481. /// </summary>
  482. /// <param name="funNO"></param>
  483. /// <param name="data"></param>
  484. /// <returns></returns>
  485. ///
  486. public JObject invokeMPService(string funNO, string data)
  487. {
  488. return invokeMPService(funNO,JObject.Parse(data));
  489. }
  490. public JObject invokeMPService(string funNO, JObject joInput)
  491. {
  492. JObject joRtn = new JObject();
  493. String outPar = "";
  494. try
  495. {
  496. string url = "";
  497. switch (funNO)
  498. {
  499. case "6201":
  500. url = "/org/local/api/hos/uldFeeInfo";
  501. break;
  502. case "6202":
  503. url = "/org/local/api/hos/pay_order";
  504. break;
  505. case "6203":
  506. url = "/org/local/api/hos/refund_Order";
  507. break;
  508. case "6301":
  509. url = "/org/local/api/hos/query_order_info";
  510. break;
  511. case "6401":
  512. url = "/org/local/api/hos/revoke_order";
  513. break;
  514. default:
  515. break;
  516. }
  517. EncryptHelper encrypt = new EncryptHelper();
  518. string data = JsonHelper.setMPCenterInpar(funNO, joInput);
  519. // 移动支付地址
  520. Global.curEvt.URL = Global.inf.mobilePayURL + url;
  521. // 动态调试模式
  522. if (Global.curEvt.enabledDebug)
  523. {
  524. CenterResult center = new CenterResult();
  525. center.setTradeNo(funNO);
  526. if (center.ShowDialog() == DialogResult.OK)
  527. {
  528. outPar = center.returnData;
  529. return JObject.Parse(outPar);
  530. }
  531. }
  532. try
  533. {
  534. joRtn = invokeCenterService(data);
  535. Global.writeLog(funNO + "【密文出参】:\r\n" + joRtn.ToString());
  536. string encData = JsonHelper.getDestValue(joRtn, "encData");
  537. string signData = JsonHelper.getDestValue(joRtn, "signData");
  538. if (!string.IsNullOrEmpty(encData) && !string.IsNullOrEmpty(signData))
  539. {
  540. joRtn.Remove("encData");
  541. joRtn.Remove("signData");
  542. joRtn.Remove("data");
  543. //解密
  544. string decData = encrypt.decrypt(encData);
  545. // 验签
  546. JsonConvert.DefaultSettings = () => new JsonSerializerSettings
  547. {
  548. FloatParseHandling = FloatParseHandling.Decimal
  549. };
  550. joRtn.Add("data", JToken.FromObject(JsonConvert.DeserializeObject(decData)));
  551. bool rtn = encrypt.verify(joRtn, signData);
  552. if (rtn)
  553. {
  554. Global.writeLog("验签通过!");
  555. }
  556. else
  557. {
  558. Global.writeLog("验签失败,请核查!");
  559. }
  560. if (!string.IsNullOrEmpty(decData))
  561. {
  562. Global.writeLog(funNO + "【明文出参】:\r\n" + decData);
  563. joRtn = JObject.Parse(decData);
  564. joRtn.Add("success", "True");
  565. }
  566. }
  567. return joRtn;
  568. }
  569. finally
  570. {
  571. this.saveCenterLog(JsonHelper.Compress(data), joRtn.ToString(), JsonHelper.Compress(data), joRtn.ToString());
  572. }
  573. }
  574. catch (Exception ex)
  575. {
  576. if (joRtn["infcode"] == null)
  577. { joRtn.Add("infcode", -1); }
  578. if (joRtn["err_msg"] == null)
  579. { joRtn.Add("err_msg", "invokeCenterService(3):" + ex.Message); }
  580. outPar = JsonHelper.Compress(joRtn);
  581. return joRtn;
  582. }
  583. finally
  584. {
  585. Global.writeLog(funNO + "(" + Global.curEvt.URL + ")", joInput.ToString(), joRtn.ToString());
  586. this.saveCenterLog(joInput.ToString(), joRtn.ToString(), joInput.ToString(), joRtn.ToString());
  587. }
  588. }
  589. /// <summary>
  590. /// 设置医保动态库目录
  591. /// </summary>
  592. /// <param name="sPath"></param>
  593. /// <param name="pErrMsg"></param>
  594. /// <returns></returns>
  595. private void invokeSetDirByOCX(ref string pErrMsg)
  596. {
  597. try
  598. {
  599. //chsinterfaceyn.chsdllClass InterfaceBase_Yn = new chsinterfaceyn.chsdllClass();
  600. //InterfaceBase_Yn.SetDir(IntPath);
  601. }
  602. catch (Exception ex)
  603. {
  604. pErrMsg = "invokeInitByDLL.SetDir 异常:" + ex.Message;
  605. MessageBox.Show(pErrMsg);
  606. }
  607. finally
  608. {
  609. //Global.writeLog("invokeInitByDLL.SetDir设置医保动态库目录(" + IntPath + ")", "", pErrMsg);
  610. }
  611. }
  612. /// <summary>
  613. /// 医保目录txt文件下载
  614. /// </summary>
  615. /// <param name="data"></param>
  616. /// <returns></returns>
  617. public JObject DownloadCenterFile(string data)
  618. {
  619. string error = string.Empty; int errorCode = 0;
  620. string sRtn = "";
  621. try
  622. {
  623. JObject jsonInParam = JObject.Parse(data);
  624. // 去除外wrapper层便于通用
  625. Utils.removeWrapper(jsonInParam);
  626. string fileName = (string)jsonInParam["input"]["fsDownloadIn"]["filename"];
  627. string filePath = Global.curEvt.path + "\\Download\\" + fileName;
  628. //如果不存在目录,则创建目录
  629. if (!Directory.Exists(Global.curEvt.path + "\\Download"))
  630. {
  631. //创建文件夹
  632. DirectoryInfo dirInfo = Directory.CreateDirectory(Global.curEvt.path + "\\Download");
  633. }
  634. if (File.Exists(filePath))
  635. {
  636. File.Delete(filePath);
  637. }
  638. FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
  639. //创建一个HTTP请求
  640. Global.curEvt.URL = Global.inf.downURL;
  641. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL);
  642. //Post请求方式
  643. request.Method = "POST";
  644. //string timestamp = TimeStamp.get13().ToString(); //当前时间戳(秒)
  645. //string nonce = Guid.NewGuid().ToString(); //非重复的随机字符串(十分钟内不能重复)
  646. //string InsuHosID = Global.inf.hospitalNO; //医疗机构ID
  647. //string CreditID = Global.inf.CreditID; //服务商统一社会信用代码
  648. //string BusinessID = Global.inf.BusinessID; //服务商ID
  649. //内容类型
  650. request.ContentType = "application/json";
  651. //昆明增加头部信息
  652. //string sTemp = timestamp + BusinessID + nonce;
  653. //Sha256 加密生成的签名 signature = sha256(hsf_timestamp + infosyssign + hsf_nonce)
  654. //string signature = Encrypt.SHA256EncryptStr(sTemp);
  655. //request.Headers.Add("hsf_signature", signature);
  656. //request.Headers.Add("hsf_timestamp", timestamp);
  657. //request.Headers.Add("hsf_nonce", nonce);
  658. //request.Headers.Add("fixmedins_code", InsuHosID);
  659. //request.Headers.Add("infosyscode", CreditID);
  660. //设置参数,并进行URL编码
  661. string paraUrlCoded = JsonHelper.toJsonString(jsonInParam);
  662. byte[] payload;
  663. //将Json字符串转化为字节
  664. payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
  665. //设置请求的ContentLength
  666. request.ContentLength = payload.Length;
  667. Stream writer;
  668. try
  669. {
  670. writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象
  671. }
  672. catch (Exception)
  673. {
  674. writer = null;
  675. errorCode = -100;
  676. error = "连接服务器失败!";
  677. }
  678. //将请求参数写入流
  679. writer.Write(payload, 0, payload.Length);
  680. writer.Close();//关闭请求流
  681. // String strValue = "";//strValue为http响应所返回的字符流
  682. //发送请求并获取相应回应数据
  683. HttpWebResponse response = request.GetResponse() as HttpWebResponse;
  684. //直到request.GetResponse()程序才开始向目标网页发送Post请求
  685. Stream responseStream = response.GetResponseStream();
  686. //创建本地文件写入流
  687. byte[] bArr = new byte[1024];
  688. int iTotalSize = 0;
  689. int size = responseStream.Read(bArr, 0, (int)bArr.Length);
  690. while (size > 0)
  691. {
  692. iTotalSize += size;
  693. fs.Write(bArr, 0, size);
  694. size = responseStream.Read(bArr, 0, (int)bArr.Length);
  695. }
  696. fs.Close();
  697. responseStream.Close();
  698. dynamic joReturn = new JObject();
  699. joReturn.errorCode = errorCode;
  700. joReturn.errorMessage = error;
  701. joReturn.filePath = filePath;
  702. sRtn = joReturn.ToString();
  703. return joReturn;
  704. }
  705. catch (Exception ex)
  706. {
  707. errorCode = -100;
  708. error = ex.Message;
  709. dynamic joReturn = new JObject();
  710. joReturn.errorCode = errorCode;
  711. joReturn.errorMessage = error;
  712. sRtn = joReturn.ToString();
  713. return joReturn;
  714. }
  715. finally
  716. {
  717. Global.writeLog("DownloadCenterFile" +"(" + Global.inf.downURL + ")", data, sRtn);
  718. }
  719. }
  720. /// <summary>
  721. /// 调用医保动态库初始化 CM 20220925
  722. /// </summary>
  723. /// <param name="fixmedins_code"></param>
  724. /// <param name="infosyscode"></param>
  725. /// <param name="infosyssign"></param>
  726. /// <param name="url"></param>
  727. /// <param name="pErrMsg"></param>
  728. /// <returns>0或小于0</returns>
  729. private int invokeInitByOCX(string fixmedins_code, string infosyscode, string infosyssign, string url, ref string pErrMsg)
  730. {
  731. //pErrMsg = "";
  732. JObject joRtn = new JObject();
  733. try
  734. {
  735. //chsinterfaceyn.chsdllClass InterfaceBase_Yn = new chsinterfaceyn.chsdllClass();
  736. //string pRtn = InterfaceBase_Yn.Init(fixmedins_code, infosyscode, infosyssign, url);
  737. //joRtn = JObject.Parse(pRtn);
  738. if (joRtn["infcode"].ToString() != "0")
  739. {
  740. pErrMsg = joRtn["err_msg"].ToString();
  741. return -1;
  742. }
  743. else
  744. {
  745. return 0;
  746. }
  747. }
  748. catch (Exception ex)
  749. {
  750. pErrMsg = "invokeInitByDLL.Init 异常:" + ex.Message;
  751. return -1;
  752. }
  753. finally
  754. {
  755. Global.writeLog("invokeInitByDLL.Init医保动态库初始化(" + url + ")", "", pErrMsg);
  756. }
  757. }
  758. /// <summary>
  759. /// 调用医保动态库通用业务函数 CM 20220925
  760. /// </summary>
  761. /// <param name="fixmedins_code"></param>
  762. /// <param name="infosyscode"></param>
  763. /// <param name="infosyssign"></param>
  764. /// <param name="inputData"></param>
  765. /// <param name="outputData"></param>
  766. /// <param name="pErrMsg"></param>
  767. /// <returns>0或小于0</returns>
  768. private int invokeBusiessByOCX(string fixmedins_code, string infosyscode, string infosyssign, string inputData, ref string outputData, ref string pErrMsg)
  769. {
  770. pErrMsg = "";
  771. outputData = "";
  772. JObject joRtn = new JObject();
  773. try
  774. {
  775. try
  776. {
  777. //chsinterfaceyn.chsdllClass InterfaceBase_Yn1 = new chsinterfaceyn.chsdllClass();
  778. //InterfaceBase_Yn1.SetDir(IntPath);
  779. }
  780. catch (Exception ex)
  781. {
  782. pErrMsg = "invokeInitByDLL.SetDir 异常:" + ex.Message;
  783. MessageBox.Show(pErrMsg);
  784. }
  785. finally
  786. {
  787. //Global.writeLog("invokeInitByDLL.SetDir设置医保动态库目录(" + IntPath + ")", "", pErrMsg);
  788. }
  789. inputData = inputData.Replace("\n", "").Replace("\t", "").Replace("\r", "");
  790. //chsinterfaceyn.chsdllClass InterfaceBase_Yn = new chsinterfaceyn.chsdllClass();
  791. //调用业务函数
  792. //string pRtn =InterfaceBase_Yn.BusinessHandleW(fixmedins_code, infosyscode, infosyssign, inputData);
  793. //string pRtn = InterfaceBase_Yn.UploadFile(fixmedins_code, infosyscode, infosyssign, Global.inf.fileName,inputData);
  794. //joRtn = JObject.Parse(pRtn);
  795. if (joRtn["infcode"].ToString() != "0")
  796. {
  797. pErrMsg = joRtn["err_msg"].ToString();
  798. //outputData = pRtn;
  799. return -1;
  800. }
  801. else
  802. {
  803. //outputData = pRtn;
  804. return 0;
  805. }
  806. }
  807. catch (Exception ex)
  808. {
  809. pErrMsg = "invokeInitByDLL.BusinessHandle 异常:" + ex.Message;
  810. return -1;
  811. }
  812. finally
  813. {
  814. Global.writeLog("invokeInitByDLL.BusinessHandle医保动态库通用业务函数", inputData, outputData);
  815. }
  816. }
  817. /// <summary>
  818. /// 医保动态库下载目录文件
  819. /// </summary>
  820. /// <param name="data"></param>
  821. /// <returns></returns>
  822. public JObject DownloadCenterFileByDll(string data)
  823. {
  824. string error = string.Empty; int errorCode = 0;
  825. string sRtn = "";
  826. try
  827. {
  828. JObject jsonInParam = JObject.Parse(data);
  829. string fileName = (string)jsonInParam["input"]["fsDownloadIn"]["filename"];
  830. string filePath = Global.curEvt.path + "\\Download\\" + fileName;
  831. //如果不存在目录,则创建目录
  832. if (!Directory.Exists(Global.curEvt.path + "\\Download"))
  833. {
  834. //创建文件夹
  835. DirectoryInfo dirInfo = Directory.CreateDirectory(Global.curEvt.path + "\\Download");
  836. }
  837. if (File.Exists(filePath))
  838. {
  839. File.Delete(filePath);
  840. }
  841. FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite);
  842. //创建一个HTTP请求
  843. Global.curEvt.URL = Global.inf.centerURL;
  844. int iRes = invokeDownloadFileByDLL(Global.inf.hospitalNO, Global.inf.CreditID, Global.inf.BusinessID, data.ToString(),ref sRtn, ref error);
  845. if (iRes == 0)
  846. {
  847. dynamic joReturn = new JObject();
  848. joReturn.errorCode = errorCode;
  849. joReturn.errorMessage = error;
  850. joReturn.filePath = filePath;
  851. sRtn = joReturn.ToString();
  852. return joReturn;
  853. }
  854. else
  855. {
  856. errorCode = -100;
  857. dynamic joReturn = new JObject();
  858. joReturn.errorCode = errorCode;
  859. joReturn.errorMessage = error;
  860. sRtn = joReturn.ToString();
  861. return joReturn;
  862. }
  863. }
  864. catch (Exception ex)
  865. {
  866. errorCode = -100;
  867. error = ex.Message;
  868. dynamic joReturn = new JObject();
  869. joReturn.errorCode = errorCode;
  870. joReturn.errorMessage = error;
  871. sRtn = joReturn.ToString();
  872. return joReturn;
  873. }
  874. finally
  875. {
  876. Global.writeLog("DownloadCenterFile" + "(" + Global.curEvt.URL + ")", data, sRtn);
  877. }
  878. }
  879. /// <summary>
  880. /// 保存中心交易日志到数据库
  881. /// </summary>
  882. /// <param name="inParam"></param>
  883. /// <param name="outParam"></param>
  884. /// <param name="inParamPlain"></param>
  885. /// <param name="outParamPlain"></param>
  886. private void saveCenterLog(string inParam, string outParam, string inParamPlain, string outParamPlain)
  887. {
  888. dynamic joIris = new JObject();
  889. string sRtn = "";
  890. try
  891. {
  892. //解析postContent,插入医保交易日志表
  893. JObject joInParam = new JObject(JObject.Parse(inParam));
  894. //解包
  895. JObject joIn = Utils.removeWrapper(joInParam);
  896. JObject joOut = new JObject(JObject.Parse(outParam));
  897. JObject joInPlain = new JObject(JObject.Parse(inParamPlain));
  898. JObject joOutPlain = new JObject(JObject.Parse(outParamPlain));
  899. JArray jaParams = new JArray();
  900. JObject joParam = new JObject();
  901. joParam.Add("inParam", JObject.FromObject(joIn));
  902. joParam.Add("outParam", JObject.FromObject(joOut));
  903. joParam.Add("inParamPlain", JObject.FromObject(joInPlain));
  904. joParam.Add("outParamPlain", JObject.FromObject(joOutPlain));
  905. joParam.Add("HospitalDr", Global.inf.hospitalDr);
  906. joParam.Add("InterfaceDr", Global.inf.interfaceDr);
  907. joParam.Add("updateUserID", Global.user.ID);
  908. joParam.Add("psn_no", Global.pat.psn_no);
  909. jaParams.Add(joParam);
  910. joIris.code = "09010021";
  911. joIris.Add("params", jaParams);
  912. //InvokeHelper invoker = new InvokeHelper();
  913. sRtn = invokeInsuService(joIris.ToString(), "保存日志到数据库").ToString();
  914. }
  915. catch (Exception ex)
  916. {
  917. sRtn = JsonHelper.setExceptionJson(-100, "保存日志异常", ex.Message).ToString();
  918. Global.writeLog_Iris("保存日志异常:" + sRtn.ToString());
  919. }
  920. }
  921. /**********************************************************调用DLL方式**************************************************************/
  922. public int InvokeInitByDLL(ref string pErrMsg)
  923. {
  924. //string pErrMsg = "";
  925. int pRtn =-1;
  926. JObject joRtn = new JObject();
  927. try
  928. {
  929. StringBuilder outSb = new StringBuilder(40960);
  930. pRtn = Init(Global.inf.hospitalNO, Global.inf.CreditID, Global.inf.BusinessID, Global.inf.centerURL, outSb);
  931. if (pRtn != 0)
  932. {
  933. pErrMsg = outSb.ToString();
  934. return -1;
  935. }
  936. else
  937. {
  938. return 0;
  939. }
  940. }
  941. catch (Exception ex)
  942. {
  943. pErrMsg = "invokeInitByDLL.Init 异常:" + ex.Message;
  944. return -1;
  945. }
  946. finally
  947. {
  948. Global.writeLog("InvokeInitByDLL(" + Global.inf.centerURL + ")", Global.inf.CreditID +":" + Global.inf.BusinessID,pRtn.ToString() + pErrMsg);
  949. }
  950. }
  951. private int invokeBusiessByDLL(string inputData, ref string outputData, ref string pErrMsg)
  952. {
  953. pErrMsg = "";
  954. outputData = "";
  955. JObject joRtn = new JObject();
  956. try
  957. {
  958. inputData = inputData.Replace("\n", "").Replace("\t", "").Replace("\r", "");
  959. StringBuilder errmsgSb = new StringBuilder(4096);
  960. StringBuilder outSb = new StringBuilder(40960);
  961. //调用业务函数
  962. int pRtn = BusinessHandle(Global.inf.hospitalNO, Global.inf.CreditID, Global.inf.BusinessID, inputData, outSb, errmsgSb);
  963. if (pRtn != 0)
  964. {
  965. outputData = outSb.ToString();
  966. pErrMsg = errmsgSb.ToString();
  967. return -1;
  968. }
  969. else
  970. {
  971. outputData = outSb.ToString();
  972. return 0;
  973. }
  974. }
  975. catch (Exception ex)
  976. {
  977. pErrMsg = "invokeInitByDLL.BusinessHandle 异常:" + ex.Message;
  978. return -1;
  979. }
  980. finally
  981. {
  982. Global.writeLog("CreditID11", Global.inf.CreditID, Global.inf.BusinessID);
  983. Global.writeLog("invokeInitByDLL.BusinessHandle医保动态库通用业务函数", inputData, outputData);
  984. }
  985. }
  986. private int invokeBusiessWByDLL(string inputData, ref string outputData, ref string pErrMsg)
  987. {
  988. pErrMsg = "";
  989. outputData = "";
  990. JObject joRtn = new JObject();
  991. try
  992. {
  993. //inputData = inputData.Replace("\n", "").Replace("\t", "").Replace("\r", "");
  994. StringBuilder errmsgSb = new StringBuilder(4096);
  995. StringBuilder outSb = new StringBuilder(40960);
  996. StringBuilder sbHospitalNO = new StringBuilder(Global.inf.hospitalNO);
  997. StringBuilder sbCreditID = new StringBuilder(Global.inf.CreditID);
  998. StringBuilder sbBusinessID = new StringBuilder(Global.inf.BusinessID);
  999. StringBuilder sbInput = new StringBuilder(inputData);
  1000. //调用业务函数
  1001. int pRtn = BusinessHandleW(sbHospitalNO, sbCreditID, sbBusinessID, sbInput, outSb, errmsgSb);
  1002. if (pRtn != 0)
  1003. {
  1004. outputData = outSb.ToString();
  1005. pErrMsg = errmsgSb.ToString();
  1006. return -1;
  1007. }
  1008. else
  1009. {
  1010. outputData = outSb.ToString();
  1011. return 0;
  1012. }
  1013. }
  1014. catch (Exception ex)
  1015. {
  1016. pErrMsg = "invokeInitByDLL.BusinessHandle 异常:" + ex.Message;
  1017. return -1;
  1018. }
  1019. finally
  1020. {
  1021. Global.writeLog("CreditID12", Global.inf.CreditID, Global.inf.BusinessID);
  1022. Global.writeLog("invokeInitByDLL.BusinessHandleW医保动态库通用业务函数", inputData, outputData);
  1023. }
  1024. }
  1025. private int invokeUploadFileByDLL(string inputData, ref string outputData, ref string pErrMsg)
  1026. {
  1027. pErrMsg = "";
  1028. outputData = "";
  1029. JObject joRtn = new JObject();
  1030. try
  1031. {
  1032. inputData = inputData.Replace("\n", "").Replace("\t", "").Replace("\r", "");
  1033. StringBuilder errmsgSb = new StringBuilder(4096);
  1034. StringBuilder outSb = new StringBuilder(40960);
  1035. //调用业务函数
  1036. int pRtn = UploadFile(Global.inf.hospitalNO, Global.inf.CreditID, Global.inf.BusinessID, Global.inf.fileName,inputData, outSb, errmsgSb);
  1037. if (pRtn != 0)
  1038. {
  1039. outputData = outSb.ToString();
  1040. pErrMsg = errmsgSb.ToString();
  1041. return -1;
  1042. }
  1043. else
  1044. {
  1045. outputData = outSb.ToString();
  1046. return 0;
  1047. }
  1048. }
  1049. catch (Exception ex)
  1050. {
  1051. pErrMsg = "invokeUploadFileByDLL.UploadFile 异常:" + ex.Message;
  1052. return -1;
  1053. }
  1054. finally
  1055. {
  1056. Global.writeLog("invokeUploadFileByDLL.UploadFile医保动态库上传业务函数", inputData, outputData);
  1057. }
  1058. }
  1059. }
  1060. }