TG.WXCRM.V4/Common/Employee/ApiDock.cs

187 lines
6.7 KiB
C#

using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Net;
using System.Reflection;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
namespace WX.CRM.Common.Employee
{
public class ApiDock
{
public ApiDock(string _AppId, string _Secret)
{
this.AppId = _AppId;
this.Secret = _Secret;
}
private string AppId { get; set; }
private string Secret { get; set; }
public void GetApidResult(string url, Dictionary<string, object> param)
{
//AppId = "crm_tg_dng8";
//Secret = "d7AQhPg9PX+K80n2rDZthkzB9HFf4rwwE7fEQCmByFo=";
//默认参数
//拼接验证头
Dictionary<string, string> header = new Dictionary<string, string>();
var timestamps = "2022-06-22T18:50:51+08";// DateTime.Now.ToString("yyyy-MM-ddTHH:mm:sszz");
string ContentMd5 = GetContentMd5(param);//获取md5加密值
var sign = GetSign(timestamps, ContentMd5, "get");
var authorization = $"acs {AppId}:{sign}";
header.Add("Authorization", authorization);
//header.Add("Date", timestamps);
header.Add("Content-MD5", ContentMd5);
//请求
var req = Get(url, param, header, timestamps);
LogHelper.Info("wechat:" + req);
//返回
}
/// <summary>
/// 内置请求
/// </summary>
/// <param name=""></param>
/// <returns></returns>
private string Get(string url, Dictionary<string, object> param, Dictionary<string, string> header, string timestamps)
{
//HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
////请求设置
//request.Method = "GET";
//request.ContentType = "application/json;charset=UTF-8";
//request.Timeout = 3000;//设置超时时间
////拼接请求头
//foreach (var item in header)
//{
// request.Headers.Add(item.Key, item.Value);
//}
//MethodInfo priMethod = request.Headers.GetType().GetMethod("AddWithoutValidate", BindingFlags.Instance | BindingFlags.NonPublic);
//priMethod.Invoke(request.Headers, new[] { "Date", timestamps });
////拼接参数
//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)},req:{retString}");
// return retString;
//}
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.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;
}
/// <summary>
/// 获取时间戳
/// </summary>
/// <returns></returns>
private string GetTimeStamp()
{
TimeSpan ts = DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0, 0);
return Convert.ToInt64(ts.TotalSeconds).ToString();
}
/// <summary>
/// 计算签名
/// </summary>
/// <param name="param"></param>
/// <param name="timestamps"></param>
/// <returns></returns>
private string GetSign(string timestamps, string ContentMd5, string method)
{
var json = "{\"Method\":\"" + method + "\",\"Date\":\"" + timestamps + "\",\"Content-MD5\":\"" + ContentMd5 + "\"}";
var bx = JsonConvert.DeserializeObject(json);
//md5 加密
return _md5(JsonConvert.SerializeObject(bx));
}
public string GetContentMd5(Dictionary<string, object> param)
{
//一次排序
var newP = param.OrderBy(m => m.Key).ToDictionary(m => m.Key, n => n.Value);
var pJosn = JsonConvert.SerializeObject(newP);
//md5 加密
return _md5(pJosn);
}
/// <summary>
/// 计算 md5
/// </summary>
/// <param name="enCode"></param>
/// <returns></returns>
private string _md5(string enCode)
{
string md5 = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(enCode, "MD5");
//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 Utility.StrToBase64(md5);
}
}
}