InvokeDllCenter.cs 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380
  1. using Newtonsoft.Json.Linq;
  2. using PTMedicalInsurance.Common;
  3. using PTMedicalInsurance.Variables;
  4. using System;
  5. using System.Collections.Generic;
  6. using System.IO;
  7. using System.Linq;
  8. using System.Runtime.ExceptionServices;
  9. using System.Runtime.InteropServices;
  10. using System.Security;
  11. using System.Text;
  12. using System.Threading.Tasks;
  13. using System.Net;
  14. namespace PTMedicalInsurance.Helper
  15. {
  16. class InvokeDllCenter : IInvokeCenter
  17. {
  18. public int Business(string inputData, ref string outputData)
  19. {
  20. outputData = "";
  21. JObject joRtn = new JObject();
  22. try
  23. {
  24. //创建一个HTTP请求
  25. HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL);
  26. //Post请求方式
  27. request.Method = "POST";
  28. //string nonce = Guid.NewGuid().ToString(); //非重复的随机字符串(十分钟内不能重复)
  29. string timestamp = TimeStamp.get10().ToString(); //当前时间戳(秒)
  30. //string timestamp = Math.round(new Date().getTime() / 1000).toString();
  31. string name = Global.inf.apiName;
  32. string version = "1.0.0";
  33. string access_key = Global.inf.AK;
  34. string secretKey = Global.inf.SK;
  35. //签名
  36. string sTemp = "_api_access_key=" + access_key + "&_api_name=" + name + "&_api_timestamp=" + timestamp + "&_api_version=" + version;
  37. //Sha256 加密生成的签名 x-tif-signature = sha256(x-tif-timestamp + secretKey+ x-tif-nonce + xtif-timestamp)
  38. string signature = Encrypt.SHA256EncryptStr(sTemp);
  39. //nonce = GetRandomString(32); // 随机数
  40. //timestamp = GetCurrentUnixSeconds().ToString();
  41. //signature = GetSHA256Str($"{timestamp}{secretKey}{nonce}{timestamp}"); // 签名
  42. //Global.writeLog($"nonce:{nonce}\ntimestamp:{timestamp}\nsecretKey:{secretKey}\npassid:{passid}\nsignature:{signature}");
  43. //内容类型
  44. request.ContentType = "application/json";
  45. //增加头部信息
  46. request.Headers.Add("_api_timestamp", timestamp);
  47. request.Headers.Add("_api_name", Global.inf.apiName);
  48. request.Headers.Add("_api_version", "1.0.0");
  49. request.Headers.Add("_api_access_key", Global.inf.AK);
  50. request.Headers.Add("_api_signature", signature);
  51. //设置参数,并进行URL编码
  52. string paraUrlCoded = inputData;//System.Web.HttpUtility.UrlEncode(jsonParas);
  53. byte[] payload;
  54. //将Json字符串转化为字节
  55. payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded);
  56. //设置请求的ContentLength
  57. request.ContentLength = payload.Length;
  58. //发送请求,获得请求流
  59. Stream writer;
  60. writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象
  61. //将请求参数写入流
  62. writer.Write(payload, 0, payload.Length);
  63. writer.Close();//关闭请求流
  64. HttpWebResponse response = null;
  65. try
  66. {
  67. //获得响应流
  68. response = (HttpWebResponse)request.GetResponse();
  69. }
  70. catch (WebException ex)
  71. {
  72. HttpWebResponse res = (HttpWebResponse)ex.Response;
  73. Stream myResponseStream = res.GetResponseStream();
  74. StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8);
  75. string retString = myStreamReader.ReadToEnd();
  76. outputData = JsonHelper.setExceptionJson(-99, "异常返回", retString).ToString();
  77. return -1;
  78. }
  79. outputData = getResponseData(response);
  80. joRtn = JObject.Parse(outputData);//返回Json数据
  81. return 0;
  82. }
  83. catch (Exception ex)
  84. {
  85. joRtn.Add("infcode", -1);
  86. joRtn.Add("err_msg", "调用中心服务异常invokeCenterService(1):" + ex.Message);
  87. outputData = JsonHelper.toJsonString(joRtn);
  88. return -1;
  89. }
  90. }
  91. public int DownloadFile(string inputData, ref string outputData)
  92. {
  93. outputData = "";
  94. string error = string.Empty; int errorCode = 0;
  95. try
  96. {
  97. JObject jsonInParam = JObject.Parse(inputData);
  98. string fileName = (string)jsonInParam["input"]["fsDownloadIn"]["filename"];
  99. string filePath = Global.curEvt.path + "\\YBDLOAD\\" + fileName;
  100. //如果不存在目录,则创建目录
  101. if (!Directory.Exists(Global.curEvt.path + "\\YBDLOAD"))
  102. {
  103. //创建文件夹
  104. DirectoryInfo dirInfo = Directory.CreateDirectory(Global.curEvt.path + "\\YBDLOAD");
  105. }
  106. if (File.Exists(filePath))
  107. {
  108. File.Delete(filePath);
  109. }
  110. int iRes = Business(inputData, ref outputData);
  111. Global.writeLog("DLL下载文件返回:["+iRes+"]",inputData,outputData);
  112. if (iRes == 0)
  113. {
  114. dynamic joReturn = new JObject();
  115. joReturn.errorCode = errorCode;
  116. joReturn.errorMessage = outputData;
  117. joReturn.filePath = filePath;
  118. outputData = joReturn.ToString();
  119. }
  120. else
  121. {
  122. errorCode = -100;
  123. dynamic joReturn = new JObject();
  124. joReturn.errorCode = errorCode;
  125. joReturn.errorMessage = outputData;
  126. outputData = joReturn.ToString();
  127. return -1;
  128. }
  129. }
  130. catch (Exception ex)
  131. {
  132. errorCode = -100;
  133. error = ex.Message;
  134. dynamic joReturn = new JObject();
  135. joReturn.errorCode = errorCode;
  136. joReturn.errorMessage = error;
  137. outputData = joReturn.ToString();
  138. return -1;
  139. }
  140. finally
  141. {
  142. Global.writeLog("DownloadCenterFile" + "(" + Global.curEvt.URL + ")", inputData, outputData);
  143. }
  144. return 0;
  145. }
  146. public int UploadFile(string inputData, ref string outputData, ref string pErrMsg)
  147. {
  148. pErrMsg = "";
  149. outputData = "";
  150. JObject joRtn = new JObject();
  151. try
  152. {
  153. inputData = inputData.Replace("\n", "").Replace("\t", "").Replace("\r", "");
  154. StringBuilder errmsgSb = new StringBuilder(4096);
  155. StringBuilder outSb = new StringBuilder(40960);
  156. //调用业务函数
  157. int pRtn = 0; // UploadFile(Global.inf.hospitalNO, Global.inf.CreditID, Global.inf.BusinessID, Global.inf.fileName, inputData, outSb, errmsgSb);
  158. if (pRtn != 0)
  159. {
  160. outputData = outSb.ToString();
  161. pErrMsg = errmsgSb.ToString();
  162. return -1;
  163. }
  164. else
  165. {
  166. outputData = outSb.ToString();
  167. return 0;
  168. }
  169. }
  170. catch (Exception ex)
  171. {
  172. pErrMsg = "invokeUploadFileByDLL.UploadFile 异常:" + ex.Message;
  173. return -1;
  174. }
  175. finally
  176. {
  177. Global.writeLog("invokeUploadFileByDLL.UploadFile医保动态库上传业务函数", inputData, outputData);
  178. }
  179. }
  180. public int Init(ref string pErrMsg)
  181. {
  182. int pRtn = -1;
  183. pErrMsg = "";
  184. JObject jo = new JObject();
  185. try
  186. {
  187. jo.Add("IP", "10.58.77.20");
  188. jo.Add("PORT", "8086");
  189. jo.Add("TIMEOUT", "120");
  190. jo.Add("LOG_PATH", "D:\\log\\");
  191. jo.Add("EC_URL", "http://10.58.33.207:10086/localcfc/api/hsecfc/localQrCodeQuery");
  192. jo.Add("CARD_PASSTYPE", "1");
  193. jo.Add("API_NAME", "hssServives");
  194. jo.Add("API_VERSION", "1.0.0");
  195. jo.Add("ACCESS_KEY", Global.inf.AK);
  196. jo.Add("SECRETKEY", Global.inf.SK);
  197. jo.Add("ORG_ID", Global.inf.hospitalNO);
  198. jo.Add("EXT", "");
  199. jo.Add("AREA_CODE", Global.inf.areaCode);
  200. StringBuilder sbInputData = new StringBuilder(jo.ToString());
  201. StringBuilder sbOut = new StringBuilder(2048);
  202. pRtn = Init(sbInputData, sbOut);
  203. pErrMsg = sbOut.ToString();
  204. return pRtn;
  205. }
  206. catch (Exception ex)
  207. {
  208. pErrMsg = "Init 异常:" + ex.Message;
  209. return -1;
  210. }
  211. finally
  212. {
  213. Global.writeLog("Init(" + Global.inf.centerURL + ")", jo.ToString(), pRtn.ToString() + pErrMsg);
  214. }
  215. }
  216. public int BusinessExt(string inputData, ref string outputData)
  217. {
  218. outputData = "";
  219. string method = Global.curEvt.funNo;
  220. try
  221. {
  222. int pRtn = -1;
  223. JObject joRtn = new JObject();
  224. try
  225. {
  226. StringBuilder sbInputData = new StringBuilder(inputData);
  227. StringBuilder sbOut = new StringBuilder(40960);
  228. pRtn = Busi(sbInputData, sbOut);
  229. outputData = sbOut.ToString();
  230. Global.writeLog("DLL返回:" + outputData);
  231. return pRtn;
  232. }
  233. catch (Exception ex)
  234. {
  235. outputData = "Busi 异常:" + ex.Message;
  236. return -1;
  237. }
  238. finally
  239. {
  240. Global.writeLog("Busi(" + Global.inf.centerURL + ")", Global.inf.CreditID + ":" + Global.inf.BusinessID, pRtn.ToString());
  241. }
  242. }
  243. catch (Exception ex)
  244. {
  245. outputData = "业务函数[" + method + "]异常:" + ex.Message;
  246. return -1;
  247. }
  248. finally
  249. {
  250. Global.writeLog("业务函数[" + method + "]", inputData, outputData);
  251. }
  252. }
  253. private string getResponseData(HttpWebResponse response)
  254. {
  255. string data = "";
  256. if (response != null)
  257. {
  258. Stream s = response.GetResponseStream();
  259. StreamReader sRead = new StreamReader(s, Encoding.GetEncoding("UTF-8"));
  260. data = sRead.ReadToEnd();
  261. sRead.Close();
  262. response.Close();
  263. }
  264. return data;
  265. }
  266. #region【泰州医疗保障平台动态库调用】
  267. /// <summary>
  268. /// 初始化
  269. /// </summary>
  270. /// <param name="pInitInfo"></param>
  271. /// <param name="pErrMsg"></param>
  272. /// <returns></returns>
  273. [DllImport("HeaSecReadInfo.dll", EntryPoint = "Init", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  274. static extern int Init(StringBuilder pInitInfo, StringBuilder pErrMsg);
  275. /// <summary>
  276. /// 读社保卡基本信息
  277. /// </summary>
  278. /// <param name="pInitInfo"></param>
  279. /// <param name="pBusiCardInfo"></param>
  280. /// <returns></returns>
  281. [DllImport("HeaSecReadInfo.dll", EntryPoint = "ReadCardBas", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  282. static extern int ReadCardBas(StringBuilder pInitInfo, StringBuilder pBusiCardInfo);
  283. /// <summary>
  284. /// 检验PIN码
  285. /// </summary>
  286. /// <param name="pOutBuff"></param>
  287. /// <returns></returns>
  288. [DllImport("HeaSecReadInfo.dll", EntryPoint = "VerifyPIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  289. static extern int VerifyPIN(StringBuilder pOutBuff);
  290. /// <summary>
  291. /// 修改PIN码
  292. /// </summary>
  293. /// <param name="pOutBuff"></param>
  294. /// <returns></returns>
  295. [DllImport("HeaSecReadInfo.dll", EntryPoint = "ChangePIN", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  296. static extern int ChangePIN(StringBuilder pOutBuff);
  297. /// <summary>
  298. /// 读身份证信息
  299. /// </summary>
  300. /// <param name="pPath"></param>
  301. /// <param name="pOutBuff"></param>
  302. /// <param name="pOutBusiBuff"></param>
  303. /// <returns></returns>
  304. [DllImport("HeaSecReadInfo.dll", EntryPoint = "ReadSFZ", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  305. static extern int ReadSFZ(StringBuilder pPath, StringBuilder pOutBuff, StringBuilder pOutBusiBuff);
  306. /// <summary>
  307. /// 电子凭证解码
  308. /// </summary>
  309. /// <param name="strUrl"></param>
  310. /// <param name="InData"></param>
  311. /// <param name="OutData"></param>
  312. /// <returns></returns>
  313. [DllImport("HeaSecReadInfo.dll", EntryPoint = "EcQuery", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  314. static extern int EcQuery(StringBuilder InData, StringBuilder OutData);
  315. /// <summary>
  316. /// 电子社保卡二维码解码
  317. /// </summary>
  318. /// <param name="OutData"></param>
  319. /// <returns></returns>
  320. [DllImport("HeaSecReadInfo.dll", EntryPoint = "EcCardQuery", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  321. static extern int EcCardQuery(StringBuilder OutData);
  322. /// <summary>
  323. /// 四合一介质获得个人信息
  324. /// </summary>
  325. /// <param name="OutData"></param>
  326. /// <returns></returns>
  327. [DllImport("HeaSecReadInfo.dll", EntryPoint = "GetPersonInfo", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  328. static extern int GetPersonInfo(StringBuilder OutData);
  329. /// <summary>
  330. /// 动态库日签到函数
  331. /// </summary>
  332. /// <param name="pInData"></param>
  333. /// <param name="pOutData"></param>
  334. /// <returns></returns>
  335. [DllImport("HeaSecReadInfo.dll", EntryPoint = "DailySinIn", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  336. static extern int DailySinIn(StringBuilder pInData, StringBuilder pOutData);
  337. /// <summary>
  338. /// 业务函数
  339. /// </summary>
  340. /// <param name="pInData"></param>
  341. /// <param name="pOutData"></param>
  342. /// <returns></returns>
  343. [DllImport("HeaSecReadInfo.dll", EntryPoint = "Busi", CharSet = CharSet.Ansi, ExactSpelling = false, CallingConvention = CallingConvention.StdCall)]
  344. static extern int Busi(StringBuilder pInData, StringBuilder pOutData);
  345. #endregion
  346. }
  347. }