using Newtonsoft.Json.Linq; using PTMedicalInsurance.Common; using PTMedicalInsurance.Variables; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace PTMedicalInsurance.Helper { class InvokeRestCenter : IInvokeCenter { private static string GetRandomString(int length) { const string chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; var random = new Random(); return new string(Enumerable.Repeat(chars, length) .Select(s => s[random.Next(s.Length)]).ToArray()); } private static long GetCurrentUnixSeconds() { DateTimeOffset utcNow = DateTimeOffset.UtcNow.AddHours(8); return (long)(utcNow.ToUniversalTime().DateTime.Subtract(new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc))).TotalSeconds; } private static string GetSHA256Str(string input) { using (SHA256 sha256Hash = SHA256.Create()) { byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(input)); StringBuilder builder = new StringBuilder(); foreach (byte b in bytes) { builder.Append(b.ToString("x2")); } return builder.ToString(); } } public int Business(string inputData, ref string outputData, ref string pErrMsg) { outputData = ""; pErrMsg = ""; JObject joRtn = new JObject(); try { //创建一个HTTP请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL); //Post请求方式 request.Method = "POST"; string nonce = Guid.NewGuid().ToString(); //非重复的随机字符串(十分钟内不能重复) string timestamp = TimeStamp.get10().ToString(); //当前时间戳(秒) //测试 //string secretKey = "RhaDw4H0RUbWYyTxmRKM1eSeN0qyGLds"; //string passid = "test_hosp"; //正式 //string secretKey = "4G9PvAy1xEkvgZJGZ0cNOacQZZYe2Bkg"; //string passid = "dg_sc_yjyy"; string secretKey = Global.inf.apiSecretKey; string passid = Global.inf.passid; //内容类型 request.ContentType = "application/json"; //签名 string sTemp = timestamp + secretKey + nonce + timestamp; //Sha256 加密生成的签名 x-tif-signature = sha256(x-tif-timestamp + secretKey+ x-tif-nonce + xtif-timestamp) string signature = Encrypt.SHA256EncryptStr(sTemp); nonce = GetRandomString(32); // 随机数 //timestamp = GetCurrentUnixSeconds().ToString(); signature = GetSHA256Str($"{timestamp}{secretKey}{nonce}{timestamp}"); // 签名 //Global.writeLog($"nonce:{nonce}\ntimestamp:{timestamp}\nsecretKey:{secretKey}\npassid:{passid}\nsignature:{signature}"); //增加头部信息 request.Headers.Add("x-tif-paasid", passid); request.Headers.Add("x-tif-timestamp", timestamp); request.Headers.Add("x-tif-signature", signature); request.Headers.Add("x-tif-nonce", nonce); //设置参数,并进行URL编码 string paraUrlCoded = inputData;//System.Web.HttpUtility.UrlEncode(jsonParas); byte[] payload; //将Json字符串转化为字节 payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded); //设置请求的ContentLength request.ContentLength = payload.Length; //发送请求,获得请求流 Stream writer; writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象 //将请求参数写入流 writer.Write(payload, 0, payload.Length); writer.Close();//关闭请求流 HttpWebResponse response = null; try { //获得响应流 response = (HttpWebResponse)request.GetResponse(); } catch (WebException ex) { HttpWebResponse res = (HttpWebResponse)ex.Response; Stream myResponseStream = res.GetResponseStream(); StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.UTF8); string retString = myStreamReader.ReadToEnd(); outputData = JsonHelper.setExceptionJson(-99, "异常返回", retString).ToString(); return -1; } outputData = getResponseData(response); joRtn = JObject.Parse(outputData);//返回Json数据 //if ((joRtn.GetValue("errcode").ToString() == "0")|| (joRtn.GetValue("infcode").ToString() == "0")) //{ // if (joRtn.ContainsKey("body")) // { // joRtn = (JObject)joRtn.GetValue("body"); // outputData = JsonHelper.toJsonString(joRtn); // } // if (joRtn.ContainsKey("output")) // { // joRtn = (JObject)joRtn.GetValue("output"); // outputData = JsonHelper.toJsonString(joRtn); // } //} //else //{ // JObject jo = new JObject(); // jo.Add("infcode", -1); // jo.Add("err_msg", "errcode:" + joRtn.GetValue("errcode") + " ,errmsg:" + joRtn.GetValue("errmsg")); // outputData = JsonHelper.toJsonString(jo); //} return 0; } catch (Exception ex) { joRtn.Add("infcode", -1); joRtn.Add("err_msg", "调用中心服务异常invokeCenterService(1):" + ex.Message); outputData = JsonHelper.toJsonString(joRtn); return -1; } } public int BusinessExt(string inputData, ref string outputData, ref string pErrMsg) { return this.Business(inputData, ref outputData, ref pErrMsg); } public int DownloadFile(string inputData, ref string outputData) { outputData = ""; string error = string.Empty; int errorCode = 0; try { JObject jsonInParam = JObject.Parse(inputData); // 去除外wrapper层便于通用 Utils.removeWrapper(jsonInParam); string fileName = (string)jsonInParam["input"]["fsDownloadIn"]["filename"]; string filePath = Global.curEvt.path + "\\Download\\" + fileName; //如果不存在目录,则创建目录 if (!Directory.Exists(Global.curEvt.path + "\\Download")) { //创建文件夹 DirectoryInfo dirInfo = Directory.CreateDirectory(Global.curEvt.path + "\\Download"); } if (File.Exists(filePath)) { File.Delete(filePath); } FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write, FileShare.ReadWrite); //创建一个HTTP请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL); //Post请求方式 request.Method = "POST"; string nonce = Guid.NewGuid().ToString(); //非重复的随机字符串(十分钟内不能重复) string timestamp = TimeStamp.get10().ToString(); //当前时间戳(秒) //测试 //string secretKey = "RhaDw4H0RUbWYyTxmRKM1eSeN0qyGLds"; //string passid = "test_hosp"; //正式 //string secretKey = "4G9PvAy1xEkvgZJGZ0cNOacQZZYe2Bkg"; //string passid = "dg_sc_yjyy"; string secretKey = Global.inf.apiSecretKey; string passid = Global.inf.passid; //内容类型 request.ContentType = "application/json"; //签名 string sTemp = timestamp + secretKey + nonce + timestamp; //Sha256 加密生成的签名 x-tif-signature = sha256(x-tif-timestamp + secretKey+ x-tif-nonce + xtif-timestamp) string signature = Encrypt.SHA256EncryptStr(sTemp); Global.writeLog($"nonce:{nonce}\ntimestamp:{timestamp}\nsecretKey:{secretKey}\npassid:{passid}\nsignature:{signature}"); //增加头部信息 request.Headers.Add("x-tif-paasid", passid); request.Headers.Add("x-tif-timestamp", timestamp); request.Headers.Add("x-tif-signature", signature); request.Headers.Add("x-tif-nonce", nonce); //设置参数,并进行URL编码 string paraUrlCoded = JsonHelper.toJsonString(jsonInParam); byte[] payload; //将Json字符串转化为字节 payload = System.Text.Encoding.UTF8.GetBytes(paraUrlCoded); //设置请求的ContentLength request.ContentLength = payload.Length; Stream writer; try { writer = request.GetRequestStream();//获取用于写入请求数据的Stream对象 } catch (Exception) { writer = null; errorCode = -100; error = "连接服务器失败!"; } //将请求参数写入流 writer.Write(payload, 0, payload.Length); writer.Close();//关闭请求流 // String strValue = "";//strValue为http响应所返回的字符流 //发送请求并获取相应回应数据 HttpWebResponse response = request.GetResponse() as HttpWebResponse; //直到request.GetResponse()程序才开始向目标网页发送Post请求 Stream responseStream = response.GetResponseStream(); //创建本地文件写入流 byte[] bArr = new byte[102400]; int iTotalSize = 0; int size = responseStream.Read(bArr, 0, (int)bArr.Length); while (size > 0) { iTotalSize += size; fs.Write(bArr, 0, size); size = responseStream.Read(bArr, 0, (int)bArr.Length); } fs.Close(); responseStream.Close(); dynamic joReturn = new JObject(); joReturn.errorCode = errorCode; joReturn.errorMessage = error; joReturn.filePath = filePath; outputData = joReturn.ToString(); } catch (Exception ex) { errorCode = -100; error = ex.Message; dynamic joReturn = new JObject(); joReturn.errorCode = errorCode; joReturn.errorMessage = error; outputData = joReturn.ToString(); return -1; } finally { Global.writeLog("DownloadCenterFile" + "(" + Global.curEvt.URL + ")", inputData, outputData); } return 0; } public int Init(ref string pErrMsg) { return 0; } public int UploadFile(string inputData, ref string outputData, ref string pErrMsg) { throw new NotImplementedException(); } private string getResponseData(HttpWebResponse response) { string data = ""; if (response != null) { Stream s = response.GetResponseStream(); StreamReader sRead = new StreamReader(s,Encoding.GetEncoding("UTF-8")); data = sRead.ReadToEnd(); sRead.Close(); response.Close(); } return data; } } }