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.Net.Http; using System.Text; using System.Threading.Tasks; namespace PTMedicalInsurance.Helper { class InvokeRestCenter : IInvokeCenter { public int Business(string inputData, ref string outputData, ref string pErrMsg) { //Global.writeLog("开始"); ////南昌的电脑环境貌似不支持httpclient //if ((Global.inf.hospitalDr == 26) || (Global.inf.hospitalDr == 27)) //{ // Global.writeLog("开始1"); // return BusinessDefault(inputData, ref outputData, ref pErrMsg); //} //else //{ // Global.writeLog("开始2"); // var result = BusinessClient(inputData); // outputData = result.OutputData; // pErrMsg = result.ErrMsg; // return result.Success; //} return BusinessDefault(inputData, ref outputData, ref pErrMsg); //var result = BusinessClientAsync(inputData).Result; } //public async Task<(string OutputData, int Success, string ErrMsg)> BusinessClientAsync(string inputData) ////public async Task BusinessClientAsync(string inputData) //{ // Dictionary headers = new Dictionary { { "access-token", "98d39db4ca7a6a6980eb95f3778b14e8" } }; // Object body = inputData; // HttpClientHelper.ContentType contentType = HttpClientHelper.ContentType.Json; // HttpClientHelper.Instance.SetBaseAddress(Global.curEvt.URL); // Global.writeLog($"当前类型:{Global.curEvt.restfulType}"); // if (Global.curEvt.restfulType == RestfulType.SettlementListFormData) // { // Dictionary formData = new Dictionary { }; // JArray ja = JArray.Parse(inputData); // foreach (JObject jo in ja) // { // foreach (var property in jo.Properties()) // { // formData[property.Name] = property.Value?.ToString(); // Global.writeLog(property.Name, formData[property.Name],""); // } // } // body = formData; // contentType = HttpClientHelper.ContentType.FormData; // } // if (Global.curEvt.restfulType == RestfulType.BaseLine) // { // String stamp = TimeStamp.get13().ToString(); // string apiName = Global.curEvt.URL.Substring(Global.curEvt.URL.LastIndexOf("/") + 1); // //南昌增加头部信息 // string sTemp = "_api_access_key=" + Global.inf.AK // + "&_api_name=" + apiName // + "&_api_timestamp=" + stamp // + "&_api_version=" + "1.0.0"; // string signature = Encrypt.ToBase64hmac(sTemp, Global.inf.SK); // headers = new Dictionary // { // { "_api_version", "1.0.0"}, // { "_api_timestamp", stamp }, // { "_api_name", apiName }, // { "_api_signature", signature }, // { "_api_access_key", Global.inf.AK } // }; // body = inputData; // contentType = HttpClientHelper.ContentType.Json; // } // var result = await HttpClientHelper.Instance.SendRequestAsync( // HttpMethod.Post, // Global.curEvt.URL, // body, // headers, // contentType); // return (result.Result, result.IsSuccess ? 0 : -1, result.ErrorMessage); // //BusinessResult result1 = new BusinessResult(); // //result1.Success = result.IsSuccess ? 0 : -1; // //result1.OutputData = result.Result; // //result1.ErrMsg = result.ErrorMessage; // //return result1; //} public (string OutputData, int Success, string ErrMsg) BusinessClient(string inputData) { Global.writeLog("BusinessClientAsync"); Dictionary headers = new Dictionary { { "access-token", "98d39db4ca7a6a6980eb95f3778b14e8" } }; Object body = inputData; HttpClientHelper.ContentType contentType = HttpClientHelper.ContentType.Json; HttpClientHelper.Instance.SetBaseAddress(Global.curEvt.URL); Global.writeLog($"当前类型:{Global.curEvt.restfulType}"); if (Global.curEvt.restfulType == RestfulType.SettlementListFormData) { Dictionary formData = new Dictionary(); JArray ja = JArray.Parse(inputData); foreach (JObject jo in ja) { foreach (var property in jo.Properties()) { formData[property.Name] = property.Value?.ToString(); Global.writeLog(property.Name, formData[property.Name], ""); } } body = formData; contentType = HttpClientHelper.ContentType.FormData; } if (Global.curEvt.restfulType == RestfulType.BaseLine) { String stamp = TimeStamp.get13().ToString(); string apiName = Global.curEvt.URL.Substring(Global.curEvt.URL.LastIndexOf("/") + 1); string sTemp = "_api_access_key=" + Global.inf.AK + "&_api_name=" + apiName + "&_api_timestamp=" + stamp + "&_api_version=" + "1.0.0"; string signature = Encrypt.ToBase64hmac(sTemp, Global.inf.SK); headers = new Dictionary { { "_api_version", "1.0.0"}, { "_api_timestamp", stamp }, { "_api_name", apiName }, { "_api_signature", signature }, { "_api_access_key", Global.inf.AK } }; body = inputData; contentType = HttpClientHelper.ContentType.Json; } var result = HttpClientHelper.Instance.SendRequest( HttpMethod.Post, Global.curEvt.URL, body, headers, contentType); return (result.Result, result.IsSuccess ? 0 : -1, result.ErrorMessage); } public int BusinessPresc(string inputData, ref string outputData, ref string pErrMsg) { outputData = ""; pErrMsg = ""; JObject joRtn = new JObject(); try { string FunName = ""; if (Global.curEvt.funNo == "7101") { FunName = "fix-uploadChk"; } else if (Global.curEvt.funNo == "7102") { FunName= "fix-rxFixmedinsSign"; } else if (Global.curEvt.funNo == "7103") { FunName = "fix-rxFileUpld"; } else if (Global.curEvt.funNo == "7104") { FunName = "fix-rxUndo"; } else if (Global.curEvt.funNo == "7105") { FunName = "fix-hospRxDetlQuery"; } else if (Global.curEvt.funNo == "7106") { FunName = "fix-rxChkInfoQuery"; } else if (Global.curEvt.funNo == "7107") { FunName = "fix-rxSetlInfoQuery"; } else if (Global.curEvt.funNo == "7108") { FunName = "fix-rxChkInfoCallback"; } else if (Global.curEvt.funNo == "7109") { FunName = "fix-rxSetlInfoCallback"; } else if (Global.curEvt.funNo == "7100") { FunName = "pss-indiho"; } //创建一个HTTP请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.inf.PresCir.url); //Post请求方式 request.Method = "POST"; //内容类型 request.ContentType = "application/json"; String stamp = TimeStamp.get13().ToString(); string apiName = Global.curEvt.URL.Substring(Global.curEvt.URL.LastIndexOf("/") + 1); apiName = FunName; //if (apiName.Contains("4101A")) //{ // apiName = "h" + apiName; //} //南昌增加头部信息 string sTemp = "_api_access_key=" + Global.inf.PresCir.ak + "&_api_name=" + apiName + "&_api_timestamp=" + stamp + "&_api_version=" + "1.0.0"; string signature = Encrypt.ToBase64hmac(sTemp, Global.inf.PresCir.sk); request.Headers.Add("_api_version", "1.0.0"); request.Headers.Add("_api_timestamp", stamp); request.Headers.Add("_api_name", apiName); request.Headers.Add("_api_signature", signature); request.Headers.Add("_api_access_key", Global.inf.PresCir.ak); Global.writeLog("call api (ak):" + Global.inf.PresCir.ak + "(sk):" + Global.inf.PresCir.sk); //设置参数,并进行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.ContainsKey("body")) { joRtn = (JObject)joRtn.GetValue("body"); outputData = JsonHelper.toJsonString(joRtn); } 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 BusinessDefault(string inputData, ref string outputData, ref string pErrMsg) { Global.writeLog("BusinessDefault"); outputData = ""; pErrMsg = ""; JObject joRtn = new JObject(); try { //创建一个HTTP请求 HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL); //Post请求方式 request.Method = "POST"; //内容类型 request.ContentType = "application/json"; if (Global.curEvt.restfulType == RestfulType.SettlementListFormData) { request.ContentType = "multipart/form-data"; } if (Global.curEvt.restfulType == RestfulType.BaseLine) { String stamp = TimeStamp.get13().ToString(); string apiName = Global.curEvt.URL.Substring(Global.curEvt.URL.LastIndexOf("/") + 1); //if (apiName.Contains("4101A")) //{ // apiName = "h" + apiName; //} //测试环境 //Global.inf.AK = "039d423c2c5f4b65b97fdc4ca52869be"; //Global.inf.SK = "jtAtVp61pKyydDaFEJb0K/Xtcfo="; //南昌增加头部信息 string sTemp = "_api_access_key=" + Global.inf.AK + "&_api_name=" + apiName + "&_api_timestamp=" + stamp + "&_api_version=" + "1.0.0"; string signature = Encrypt.ToBase64hmac(sTemp, Global.inf.SK); request.Headers.Add("_api_version", "1.0.0"); request.Headers.Add("_api_timestamp", stamp); request.Headers.Add("_api_name", apiName); request.Headers.Add("_api_signature", signature); request.Headers.Add("_api_access_key", Global.inf.AK); Global.writeLog("call api (ak):" + Global.inf.AK + "\r" + "(sk):" + Global.inf.SK); } else //SettlemetnList DIP上传 { request.Headers.Add("access-token", "98d39db4ca7a6a6980eb95f3778b14e8"); } //设置参数,并进行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(); if (!string.IsNullOrEmpty(retString)) { outputData = JsonHelper.setExceptionJson(-99, "异常返回", retString).ToString(); return -1; } else { outputData = JsonHelper.setExceptionJson(-99, "异常返回", ex.Message).ToString(); return -1; } } outputData = getResponseData(response); joRtn = JObject.Parse(outputData);//返回Json数据 if (joRtn.ContainsKey("body")) { joRtn = (JObject)joRtn.GetValue("body"); outputData = JsonHelper.toJsonString(joRtn); } 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请求 Global.curEvt.URL = Global.inf.centerURL + "/hsa-fsi-9102"; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Global.curEvt.URL); //Post请求方式 request.Method = "POST"; String stamp = TimeStamp.get13().ToString(); string apiName = Global.curEvt.URL.Substring(Global.curEvt.URL.Length - 12); //南昌增加头部信息 string sTemp = "_api_access_key=" + Global.inf.AK + "&_api_name=" + apiName + "&_api_timestamp=" + stamp + "&_api_version=" + "1.0.0"; string signature = Encrypt.ToBase64hmac(sTemp, Global.inf.SK); //内容类型 request.ContentType = "application/json"; request.Headers.Add("_api_version", "1.0.0"); request.Headers.Add("_api_timestamp", stamp); request.Headers.Add("_api_name", apiName); request.Headers.Add("_api_signature", signature); request.Headers.Add("_api_access_key", Global.inf.AK); //设置参数,并进行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[1024]; 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; } } public class BusinessResult { public string OutputData { get; set; } public int Success { get; set; } public string ErrMsg { get; set; } } }