using Newtonsoft.Json;
using NPOI.SS.Formula.Functions;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace WX.CRM.Common.Employee
{
public class ApiDockHelper
{
public ApiDockHelper(string username, string secret)
{
UserName = username;
Secret = secret;
}
///
/// Get方法访问API
///
///
///
public ApiResult GetApi(string url, Dictionary param)
{
try
{
//拼接验证头
Dictionary header = new Dictionary();
var timestamps = GetTimeStamp();
var sign = GetSign(param, timestamps);
var authorization = $"{UserName}:{sign}";
header.Add("authorization", authorization);
header.Add("timestamps", timestamps);
//请求
var req = HttClientGet(url, param, header);
LogHelper.Info("alipay:" + req);
//返回
var reqInfo = JsonConvert.DeserializeObject>(req);
if (reqInfo == null)
{
return new ApiResult { ret = 501, msg = "数据为空" };
}
return reqInfo;
}
catch (Exception ex)
{
return new ApiResult { ret = 501, msg = ex.Message };
}
}
///
/// post方法访问api
///
///
///
///
///
public ApiResult PostApi(string url, Dictionary param)
{
try
{
//拼接验证头
Dictionary header = new Dictionary();
var timestamps = GetTimeStamp();
var sign = GetSign(param, timestamps);
var authorization = $"{UserName}:{sign}";
header.Add("authorization", authorization);
header.Add("timestamps", timestamps);
//请求
var req = Post(url, param, header);
//LogHelper.Info("alipay:" + req);
//返回
var reqInfo = JsonConvert.DeserializeObject>(req);
if (reqInfo == null)
{
return new ApiResult { ret = 501, msg = "数据为空" };
}
return reqInfo;
}
catch (Exception ex)
{
return new ApiResult { ret = 501, msg = ex.Message };
}
}
#region 内部参数
private string UserName { get; set; }
private string Secret { get; set; }
//DG_SOFTWARE
//private string IdentityKey { get; set; }
#endregion
#region 内部方法
///
/// 内置请求
///
///
///
private string HttClientGet(string url, Dictionary param, Dictionary header)
{
try
{
var urlParam = string.Join("&", param.Select(m => m.Key + "=" + m.Value));
if (url.IndexOf('?') > -1)
{
url = url + urlParam;
}
else
{
url = (url + "?" + urlParam);
}
//MethodInfo priMethod = webReq.Headers.GetType().GetMethod("AddWithoutValidate", BindingFlags.Instance | BindingFlags.NonPublic);
//priMethod.Invoke(webReq.Headers, new[] { "Date", timestamps });
HttpRequestMessage httpRequestMessage = new HttpRequestMessage();
httpRequestMessage.RequestUri = new Uri(url);
httpRequestMessage.Method = HttpMethod.Get;
foreach (var item in header)
{
httpRequestMessage.Headers.TryAddWithoutValidation(item.Key, item.Value);
}
//HttpContent httpContent = new StringContent("");
//httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue("application/json");
//httpRequestMessage.Content = httpContent;
var result = Send(httpRequestMessage);
return result;
}
catch (Exception E)
{
throw E;
}
}
public static string Send(HttpRequestMessage httpRequestMessage)
{
using (HttpClient client = new HttpClient())
{
HttpResponseMessage response = client.SendAsync(httpRequestMessage).Result;
return response.Content.ReadAsStringAsync().Result;
}
}
///
/// 内置请求
///
///
///
private string Post(string url, Dictionary param, Dictionary header)
{
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
//请求设置
request.Method = "POST";
request.ContentType = "application/json;charset=UTF-8";
request.Timeout = 3000;//设置超时时间
//拼接请求头
foreach (var item in header)
{
request.Headers.Add(item.Key, item.Value);
}
//拼接参数
if (param.Any())
{
var pStr = JsonConvert.SerializeObject(param);
byte[] data = Encoding.UTF8.GetBytes(pStr);
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
}
//提交请求
HttpWebResponse response;
try
{
response = (HttpWebResponse)request.GetResponse();
}
catch (WebException ex)
{
response = (HttpWebResponse)ex.Response;
}
//解析请求结果
using (Stream myResponseStream = response.GetResponseStream())
{
StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
string retString = myStreamReader.ReadToEnd();
myStreamReader.Close();
//记录请求情况
LogHelper.Info($"url:{url},param:{JsonConvert.SerializeObject(param)},header:{JsonConvert.SerializeObject(header)}");
return retString;
}
}
///
/// 内置请求
///
///
///
private string Get(string url, Dictionary param, Dictionary header)
{
var urlParam = string.Join("&", param.Select(m => m.Key + "=" + m.Value));
if (url.IndexOf('?') > -1)
{
url = url + urlParam;
}
else
{
url = (url + "?" + urlParam);
}
HttpWebRequest webReq = (HttpWebRequest)WebRequest.Create(new Uri(url));
//MethodInfo priMethod = webReq.Headers.GetType().GetMethod("AddWithoutValidate", BindingFlags.Instance | BindingFlags.NonPublic);
//priMethod.Invoke(webReq.Headers, new[] { "Date", timestamps });
foreach (var item in header)
{
webReq.Headers.Add(item.Key, item.Value);
}
webReq.Method = "GET";
webReq.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";
webReq.Headers.Add("Accept-Language", "zh-cn,zh;q=0.8,en-us;q=0.5,en;q=0.3");
webReq.UserAgent = "Mozilla/5.0 (Windows NT 5.2; rv:12.0) Gecko/20100101 Firefox/12.0";
//webReq.Method = "get";
//webReq.ContentType = "application/x-www-form-urlencoded";
webReq.ContentType = "application/json;charset=UTF-8";
//webReq.Timeout = 3000;//设置超时时间
HttpWebResponse response = (HttpWebResponse)webReq.GetResponse();
StreamReader sr = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
var _Result = sr.ReadToEnd();
sr.Close();
response.Close();
return _Result;
}
///
/// 计算签名
///
///
///
///
private string GetSign(Dictionary param, string timestamps)
{
//一次排序
var newP = param.OrderBy(m => m.Key).ToDictionary(m => m.Key, n => n.Value);
var pJosn = JsonConvert.SerializeObject(newP, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore });//去除null值数据
//二次排序
var enStrList = new string[] { UserName, pJosn, Secret, timestamps };
Array.Sort(enStrList, string.CompareOrdinal);
//拼接
var enStr = string.Join("", enStrList);
//md5 加密
return _md5(enStr);
}
///
/// 计算 md5
///
///
///
public string _md5(string enCode)
{
string res = "";
byte[] data = Encoding.GetEncoding("utf-8").GetBytes(enCode);
MD5 md5 = new MD5CryptoServiceProvider();
byte[] bytes = md5.ComputeHash(data);
for (int i = 0; i < bytes.Length; i++)
{
res += bytes[i].ToString("x2");
}
return res;
}
///
/// 获取时间戳
///
///
private string GetTimeStamp()
{
TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
#endregion
}
///
/// code:状态码,0为请求成功;
/// 部分状态说明
/// -1 未知异常
/// -1001 签名不合法
/// -1002 签名验证失败
/// -1003 请求内容不合法
/// -1004 AppID不合法
// -1005 签名已过期
///
///
public class ApiResult
{
public int code { get; set; }
///
/// -1 未知异常
/// -1001 签名不合法
/// -1002 签名验证失败
/// -1003 请求内容不合法
/// -1004 AppID不合法
// -1005 签名已过期
///
public int ret { get; set; }
public T data { get; set; }
public string msg { get; set; }
}
public class ApiResult
{
public int code { get; set; }
public string message { get; set; }
}
///
/// code:状态码,0为请求成功;
/// 部分状态说明
/// -1 未知异常
/// -1001 签名不合法
/// -1002 签名验证失败
/// -1003 请求内容不合法
/// -1004 AppID不合法
// -1005 签名已过期
///
///
public class HGApiResult
{
public int code { get; set; }
///
/// -1 未知异常
/// -1001 签名不合法
/// -1002 签名验证失败
/// -1003 请求内容不合法
/// -1004 AppID不合法
// -1005 签名已过期
///
public int ret { get; set; }
public T data { get; set; }
public string message { get; set; }
}
}