using System; using System.IO; using System.Linq; using System.Net.Http; using System.Net.Http.Headers; using System.Text; //using System.Text.Json; using System.Threading.Tasks; using System.Web; using System.Windows.Forms; using Newtonsoft.Json; using System.Net; namespace LrGetToken { public class APIClient { /// /// 请求服务器域名,默认https://api.kingdee.com/ /// private string _baseUrl = "https://api.kingdee.com/"; /// /// 客户Id /// private string _clientId = ""; /// /// 客户秘钥 /// private string _clientSecret = ""; /// /// 超时时间(秒) /// public int Timeout { get { return 10; } set { value = 10; } } /// /// 构造一个API客户端对象 /// /// 客户Id /// 客户秘钥 /// /// 请求域名 public APIClient(string clientId, string clientSecret, string baseUrl) { this._clientId = clientId; this._clientSecret = clientSecret; this._baseUrl = baseUrl; } /// /// 构造一个API客户端对象 /// /// 客户Id /// 客户秘钥 public APIClient(string clientId, string clientSecret) { this._clientId = clientId; this._clientSecret = clientSecret; } /// /// 发起请求 /// /// /// public async Task Execute(APIRequest request, string api_nonce, string timeStamp) { using (HttpClient _client = new HttpClient()) { _client.Timeout = TimeSpan.FromSeconds((double)Timeout); BuildRequestHeader(_client.DefaultRequestHeaders, request, api_nonce, timeStamp); var uri = _baseUrl.TrimEnd('/') + "/" + request.Path + "?" + GetQueryString(request); if (request.Method == HttpMethod.Post) { if (string.IsNullOrEmpty(request.File)) { var json = request.Body == null ? string.Empty : JsonConvert.SerializeObject(request.Body); return await _client.PostAsync(uri, new StringContent(json, Encoding.UTF8, request.ContentType)); } else { //文件上传 string boundary = "----WebKitFormBoundary{DateTime.Now.Ticks:x}"; MultipartFormDataContent content = new MultipartFormDataContent(boundary); if (!File.Exists(request.File)) { throw new Exception("路径不存在:{request.File}"); } using (FileStream fStream = File.Open(request.File, FileMode.Open, FileAccess.Read)) { content.Add(new StreamContent(fStream, (int)fStream.Length), "file", Path.GetFileName(request.File)); return await _client.PostAsync(uri, content); } } } else if (request.Method == HttpMethod.Get) { return await _client.GetAsync(uri); } else if (request.Method == HttpMethod.Put) { var json = request.Body == null ? string.Empty : JsonConvert.SerializeObject(request.Body); return await _client.PutAsync(uri, new StringContent(json, Encoding.UTF8, request.ContentType)); } else if (request.Method == HttpMethod.Delete) { return await _client.DeleteAsync(uri); } else { throw new Exception("Method:{request.Method} 参数不支持!"); } } } public string HttpPost(APIRequest request, string ClientID, string outerInstanceId, string api_nonce, string timeStamp) { try { var uri = _baseUrl.TrimEnd('/') + "/" + request.Path + "?outerInstanceId=" + outerInstanceId; HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(uri); request1.ContentType = "application/json"; request1.Method = "POST"; //request1.Headers.Add("Content-Type", "application/json"); request1.Headers.Add("X-Api-ClientID", ClientID); request1.Headers.Add("X-Api-Auth-Version", "2.0"); request1.Headers.Add("X-Api-TimeStamp", timeStamp.ToString()); request1.Headers.Add("X-Api-SignHeaders", "X-Api-TimeStamp,X-Api-Nonce"); request1.Headers.Add("X-Api-Nonce", api_nonce.ToString()); request1.Headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString())); //string postData = "key1=value1&key2=value2"; //GetHeader(request1, request); //Stream requestStream = request1.GetRequestStream(); //StreamWriter streamWriter = new StreamWriter(requestStream); //streamWriter.Write(postDataStr); //streamWriter.Close(); HttpWebResponse response = (HttpWebResponse)request1.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream); string retString = streamReader.ReadToEnd(); streamReader.Close(); responseStream.Close(); return retString; } catch (Exception ex) { Console.WriteLine(ex.Message); return ""; } } public string HttpPost1(APIRequest request, string apptoken, string ClientID, string api_nonce, string timeStamp, string postbody) { try { var uri = _baseUrl.TrimEnd('/') + "/" + request.Path; HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(uri); request1.ContentType = "application/json"; request1.Method = "POST"; //request1.Headers.Add("Content-Type", "application/json"); request1.Headers.Add("X-Api-ClientID", ClientID); request1.Headers.Add("X-Api-Auth-Version", "2.0"); request1.Headers.Add("X-Api-TimeStamp", timeStamp.ToString()); request1.Headers.Add("X-Api-SignHeaders", "X-Api-TimeStamp,X-Api-Nonce"); request1.Headers.Add("X-Api-Nonce", api_nonce.ToString()); request1.Headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString())); request1.Headers.Add("app-token", apptoken); request1.Headers.Add("X-GW-Router-Addr", "https://tf.jdy.com"); //string postData = "key1=value1&key2=value2"; //GetHeader(request1, request); //Stream requestStream = request1.GetRequestStream(); //StreamWriter streamWriter = new StreamWriter(requestStream); //streamWriter.Write(postDataStr); //streamWriter.Close(); // 写入请求体(body) using (Stream requestStream = request1.GetRequestStream()) { using (StreamWriter streamWriter = new StreamWriter(requestStream)) { streamWriter.Write(postbody); // postDataStr是你要发送的JSON数据 } } // 获取响应 HttpWebResponse response = (HttpWebResponse)request1.GetResponse(); // 读取响应内容 using (Stream responseStream = response.GetResponseStream()) { using (StreamReader streamReader = new StreamReader(responseStream)) { string retString = streamReader.ReadToEnd(); return retString; } } // HttpWebResponse response = (HttpWebResponse)request1.GetResponse(); // Stream responseStream = response.GetResponseStream(); //StreamReader streamReader = new StreamReader(responseStream); // string retString = streamReader.ReadToEnd(); // streamReader.Close(); // responseStream.Close(); //return retString; } catch (Exception ex) { Console.WriteLine(ex.Message); return ""; } } // 定义一个委托,确保能够跨线程调用 public delegate void UpdateResponseTextDelegate(string response); public string SaveBill(APIRequest request, string ClientID, string appToken, string api_nonce, string timeStamp,string billContent) { try { var uri = _baseUrl.TrimEnd('/') + "/" + request.Path; HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(uri); request1.ContentType = "application/json"; request1.Method = "POST"; // GetHeader1(request1, request, api_nonce, timeStamp); //request1.Headers.Add("Content-Type", "application/json"); request1.Headers.Add("X-Api-ClientID", ClientID); request1.Headers.Add("X-Api-Auth-Version", "2.0"); request1.Headers.Add("X-Api-TimeStamp", timeStamp.ToString()); request1.Headers.Add("X-Api-SignHeaders", "X-Api-TimeStamp,X-Api-Nonce"); request1.Headers.Add("X-Api-Nonce", api_nonce.ToString()); request1.Headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString())); request1.Headers.Add("app-token", appToken); //request1.Headers.Add("X-GW-Router-Addr", "https://tf.jdy.com"); // string postData = "key1=value1&key2=value2"; if (billContent != "") { byte[] byteArray = Encoding.UTF8.GetBytes(billContent); request1.ContentLength = byteArray.Length; Stream dataStream = request1.GetRequestStream(); // Write the data to the request stream dataStream.Write(byteArray, 0, byteArray.Length); // Close the Stream object dataStream.Close(); //Stream requestStream = request1.GetRequestStream(); //StreamWriter streamWriter = new StreamWriter(requestStream); //streamWriter.Write(billContent); //streamWriter.Close(); } //GetHeader(request1, request); //Stream requestStream = request1.GetRequestStream(); //StreamWriter streamWriter = new StreamWriter(requestStream); //streamWriter.Write(postDataStr); //streamWriter.Close(); HttpWebResponse response = (HttpWebResponse)request1.GetResponse(); Stream responseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(responseStream); string retString = streamReader.ReadToEnd(); streamReader.Close(); responseStream.Close(); return retString; } catch (Exception ex) { Console.WriteLine("Error Message: " + ex.Message); if (ex is WebException webEx) { if (webEx.Response != null) { using (var responseStream = webEx.Response.GetResponseStream()) using (var reader = new StreamReader(responseStream)) { string responseBody = reader.ReadToEnd(); Console.WriteLine("Response Body: " + responseBody); } } } return ""; } } public string HttpGet(APIRequest request, string api_nonce, string timeStamp) { try { var uri = _baseUrl.TrimEnd('/') + "/" + request.Path + "?" + GetQueryString(request); HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(uri); GetHeader(request1, request, api_nonce, timeStamp); //加入header HttpWebResponse response = (HttpWebResponse)request1.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(myResponseStream); string retString = streamReader.ReadToEnd(); streamReader.Close(); myResponseStream.Close(); return retString; } catch (Exception ex) { Console.WriteLine("Error Message: " + ex.Message); if (ex is WebException webEx) { if (webEx.Response != null) { using (var responseStream = webEx.Response.GetResponseStream()) using (var reader = new StreamReader(responseStream)) { string responseBody = reader.ReadToEnd(); Console.WriteLine("Response Body: " + responseBody); } } } return ""; } } public string HttpGet_pur_in(APIRequest request) { try { var uri = _baseUrl.TrimEnd('/') + "/" + request.Path + "?" + GetQueryString(request); HttpWebRequest request1 = (HttpWebRequest)WebRequest.Create(uri); // GetHeader(request1, request, api_nonce, timeStamp); //加入header HttpWebResponse response = (HttpWebResponse)request1.GetResponse(); Stream myResponseStream = response.GetResponseStream(); StreamReader streamReader = new StreamReader(myResponseStream); string retString = streamReader.ReadToEnd(); streamReader.Close(); myResponseStream.Close(); return retString; } catch (Exception ex) { Console.WriteLine("Error Message: " + ex.Message); if (ex is WebException webEx) { if (webEx.Response != null) { using (var responseStream = webEx.Response.GetResponseStream()) using (var reader = new StreamReader(responseStream)) { string responseBody = reader.ReadToEnd(); Console.WriteLine("Response Body: " + responseBody); } } } return ""; } } private void GetHeader1(HttpWebRequest request1, APIRequest request, string api_nonce, string timeStamp) { //var api_nonce = new Random().Next(100000000, 999999999); //var timeStamp = (int)(DateTime.Now.ToLocalTime() - DateTime.Parse("1970-01-01").ToLocalTime()).TotalSeconds; request1.Headers.Add("X-Api-ClientID", _clientId); request1.Headers.Add("X-Api-Auth-Version", "2.0"); request1.Headers.Add("X-Api-TimeStamp", timeStamp.ToString()); request1.Headers.Add("X-Api-SignHeaders", "X-Api-Nonce,X-Api-TimeStamp"); request1.Headers.Add("X-Api-Nonce", api_nonce.ToString()); request1.Headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString())); //headers.Add("X-GW-Router-Addr", "https://tf.jdy.com/"); if (request.Header.Any()) { foreach (var hk in request.Header.Keys) { request1.Headers.Add(hk, request.Header[hk]); } } } private void GetHeader(HttpWebRequest request1, APIRequest request, string api_nonce, string timeStamp) { //var api_nonce = new Random().Next(100000000, 999999999); //var timeStamp = (int)(DateTime.Now.ToLocalTime() - DateTime.Parse("1970-01-01").ToLocalTime()).TotalSeconds; request1.Headers.Add("X-Api-ClientID", _clientId); request1.Headers.Add("X-Api-Auth-Version", "2.0"); request1.Headers.Add("X-Api-TimeStamp", timeStamp.ToString()); request1.Headers.Add("X-Api-SignHeaders", "X-Api-Nonce,X-Api-TimeStamp"); request1.Headers.Add("X-Api-Nonce", api_nonce.ToString()); request1.Headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString())); //headers.Add("X-GW-Router-Addr", "https://tf.jdy.com/"); if (request.Header.Any()) { foreach (var hk in request.Header.Keys) { request1.Headers.Add(hk, request.Header[hk]); } } } public void BuildRequestHeader(HttpRequestHeaders headers, APIRequest request, string api_nonce, string timeStamp) { //var api_nonce = new Random().Next(100000000, 999999999); //var timeStamp = (int)(DateTime.Now.ToLocalTime() - DateTime.Parse("1970-01-01").ToLocalTime()).TotalSeconds; headers.Add("X-Api-Nonce", api_nonce.ToString()); headers.Add("X-Api-Auth-Version", "2.0"); headers.Add("X-Api-TimeStamp", timeStamp.ToString()); headers.Add("X-Api-ClientID", _clientId); headers.Add("X-Api-Signature", GetSignature(request, api_nonce.ToString(), timeStamp.ToString())); headers.Add("X-Api-SignHeaders", "X-Api-Nonce,X-Api-TimeStamp"); headers.Add("X-GW-Router-Addr", "https://tf.jdy.com/"); if (request.Header.Any()) { foreach (var hk in request.Header.Keys) { headers.Add(hk, request.Header[hk]); } } } public string GetSignature(APIRequest request, string nonce, string timestamp) { var querySign = GetQueryString(request, true); var my_sign = ""; StringBuilder sb = new StringBuilder(); sb.Append(request.Method.ToString().ToUpper()); sb.Append('\n'); sb.Append(PathEncode(request.Path)); sb.Append('\n'); sb.Append(querySign); sb.Append('\n'); sb.Append("x-api-nonce:" + nonce); sb.Append('\n'); sb.Append("x-api-timestamp:" + timestamp); sb.Append('\n'); my_sign = SHAHelper.HmacSHA256(_clientSecret, sb.ToString()); return SHAHelper.HmacSHA256(_clientSecret, sb.ToString()); } private string PostGetSignature(APIRequest request, string nonce, string timestamp) { var querySign = PostGetQueryString(request, true); StringBuilder sb = new StringBuilder(); sb.Append(request.Method.ToString().ToUpper()); sb.Append('\n'); sb.Append(PathEncode(request.Path)); sb.Append('\n'); sb.Append(querySign); sb.Append('\n'); sb.Append("x-api-nonce:" + nonce); sb.Append('\n'); sb.Append("x-api-timestamp:" + timestamp); sb.Append('\n'); return SHAHelper.HmacSHA256(_clientSecret, sb.ToString()); } /// /// Url Path部分Url编码 /// /// /// private static string PathEncode(string path) { path = HttpUtility.UrlEncode("/" + path.TrimStart('/')).Replace("%2f", "%2F").Replace("%2d", "%2D").Replace("(", "%28").Replace(")", "%29"); return path; } /// /// 查询字符串部分拼接 /// /// /// private static string GetQueryString(APIRequest request, bool doubleEncode = false) { var querySign = string.Empty; if (request.Params != null && request.Params.Keys != null) { foreach (var key in request.Params.Keys) { if (doubleEncode) { querySign = querySign + "&" + key.ToString() + "=" + HttpUtility.UrlEncode(HttpUtility.UrlEncode(request.Params[key])).Replace("+", "%20");//.ToUpper(); } else { querySign = querySign + "&" + key.ToString() + "=" + HttpUtility.UrlEncode(request.Params[key]).Replace("+", "%20");//.ToUpper(); } } querySign = querySign.TrimStart('&'); } return querySign; } private static string PostGetQueryString(APIRequest request, bool doubleEncode = false) { var querySign = string.Empty; if (request.Params != null && request.Params.Keys != null) { foreach (var key in request.Params.Keys) { if (doubleEncode) { querySign = querySign + "&" + key.ToString() + "=" + HttpUtility.UrlEncode(HttpUtility.UrlEncode(request.Params[key])).Replace("+", "%20").ToUpper(); } else { querySign = querySign + "&" + key.ToString() + "=" + HttpUtility.UrlEncode(request.Params[key]).Replace("+", "%20").ToUpper(); } } querySign = querySign.TrimStart('&'); } return querySign; } } }