123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547 |
- 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
- {
- /// <summary>
- /// 请求服务器域名,默认https://api.kingdee.com/
- /// </summary>
- private string _baseUrl = "https://api.kingdee.com/";
-
- /// <summary>
- /// 客户Id
- /// </summary>
- private string _clientId = "";
-
- /// <summary>
- /// 客户秘钥
- /// </summary>
- private string _clientSecret = "";
-
- /// <summary>
- /// 超时时间(秒)
- /// </summary>
- public int Timeout { get { return 10; } set { value = 10; } }
-
- /// <summary>
- /// 构造一个API客户端对象
- /// </summary>
- /// <param name="clientId">客户Id</param>
- /// <param name="clientSecret">客户秘钥</param>
- /// /// <param name="baseUrl">请求域名</param>
- public APIClient(string clientId, string clientSecret, string baseUrl)
- {
- this._clientId = clientId;
- this._clientSecret = clientSecret;
- this._baseUrl = baseUrl;
- }
-
- /// <summary>
- /// 构造一个API客户端对象
- /// </summary>
- /// <param name="clientId">客户Id</param>
- /// <param name="clientSecret">客户秘钥</param>
- public APIClient(string clientId, string clientSecret)
- {
- this._clientId = clientId;
- this._clientSecret = clientSecret;
- }
-
- /// <summary>
- /// 发起请求
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- public async Task<HttpResponseMessage> 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());
- }
- /// <summary>
- /// Url Path部分Url编码
- /// </summary>
- /// <param name="path"></param>
- /// <returns></returns>
- private static string PathEncode(string path)
- {
- path = HttpUtility.UrlEncode("/" + path.TrimStart('/')).Replace("%2f", "%2F").Replace("%2d", "%2D").Replace("(", "%28").Replace(")", "%29");
- return path;
- }
-
- /// <summary>
- /// 查询字符串部分拼接
- /// </summary>
- /// <param name="request"></param>
- /// <returns></returns>
- 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;
- }
-
- }
- }
|