using Newtonsoft.Json;
|
using System;
|
using System.Collections.Generic;
|
using System.Configuration;
|
using System.IO;
|
using System.Linq;
|
using System.Net;
|
using System.Security.Cryptography;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace HDLMonitorService.Helper
|
{
|
public class HttpHp
|
{
|
/// <summary>
|
/// 发送POST请求
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="url"></param>
|
/// <param name="reqDataStr"></param>
|
/// <returns></returns>
|
public static T Post<T>(string url, string reqDataStr) where T : class
|
{
|
return HttpRequet<T>(url, reqDataStr, "POST", "application/json;charset=UTF-8");
|
}
|
|
/// <summary>
|
/// 发送HTTP请求
|
/// </summary>
|
/// <typeparam name="T"></typeparam>
|
/// <param name="url"></param>
|
/// <param name="reqDataStr"></param>
|
/// <param name="token"></param>
|
/// <returns></returns>
|
public static T HttpRequet<T>(string url, string reqDataStr, string Method, string contentType) where T : class
|
{
|
ServicePointManager.ServerCertificateValidationCallback = (sender, certificate, chain, sslPolicyErrors) => true;
|
|
var request = (HttpWebRequest)WebRequest.Create(url);
|
request.Method = Method;
|
request.ContentType = contentType;
|
request.ContentLength = 0;
|
if (reqDataStr != null)
|
{
|
var reqData = Encoding.UTF8.GetBytes(reqDataStr);
|
request.ContentLength = reqData.Length;
|
|
using (var stream = request.GetRequestStream())
|
{
|
stream.Write(reqData, 0, reqData.Length);
|
}
|
}
|
|
var response = (HttpWebResponse)request.GetResponse();
|
var responseString = new StreamReader(response.GetResponseStream()).ReadToEnd();
|
return JsonConvert.DeserializeObject<T>(responseString);
|
}
|
|
/// <summary>
|
/// 2020-11-02
|
/// 基础服务的接口都要校验sign
|
/// 计算sign签名
|
/// </summary>
|
/// <returns></returns>
|
public static string GetSignRequestJson(object requestObj, Dictionary<string, object> paramDictionary = null)
|
{
|
try
|
{
|
//1. 将model实体转为Dictionary<string, object>
|
if (paramDictionary == null)
|
{
|
paramDictionary = Newtonsoft.Json.JsonConvert.DeserializeObject<Dictionary<string, object>>(Newtonsoft.Json.JsonConvert.SerializeObject(requestObj));
|
}
|
//2. 计算sign
|
if (paramDictionary != null)
|
{
|
paramDictionary.Add("appKey", ConfigurationManager.AppSettings["AppKey"].ToString());
|
paramDictionary.Add("timestamp", GetTimestamp());
|
//2.1 字典升序
|
paramDictionary = paramDictionary.OrderBy(o => o.Key).ToDictionary(o => o.Key, p => p.Value);
|
//2.2 拼接按URL键值对
|
string str = string.Empty;
|
foreach (KeyValuePair<string, object> item in paramDictionary)
|
{
|
//Value为null不参加校验
|
if (item.Value != null)
|
{
|
//Value.ToString()为null或者""也不参加校验
|
//if (!string.IsNullOrEmpty(item.Value.ToString()) && (item.Value is string || item.Value.GetType().IsValueType))
|
//{
|
//检测当前参数是否需要参与校验
|
if (IfValueNeedSign(item.Value.ToString()))
|
{
|
//如果是bool类型,要转小写
|
if (item.Value is bool)
|
{
|
str += item.Key + "=" + item.Value.ToString().ToLower() + "&";
|
}
|
else
|
{
|
str += item.Key + "=" + item.Value.ToString() + "&";
|
}
|
}
|
}
|
}
|
|
//2.3 拼接SECRET_KEY
|
str = str.Substring(0, str.Length - 1) + ConfigurationManager.AppSettings["SecretKey"].ToString();
|
//2.4 MD5转换+转小写
|
var signstr = SignMD5Encrypt(str);
|
paramDictionary.Add("sign", signstr);
|
var signResult = Newtonsoft.Json.JsonConvert.SerializeObject(paramDictionary);
|
return signResult;
|
}
|
else
|
{
|
return "";
|
}
|
}
|
catch
|
{
|
return "";
|
}
|
}
|
|
/// <summary>
|
/// 判断当前值是否需要参与签名,保持跟云端一致
|
/// 空字符串不参与
|
/// 数组,集合,对象不参与
|
/// </summary>
|
/// <param name="valueStr"></param>
|
/// <returns></returns>
|
static bool IfValueNeedSign(string valueStr)
|
{
|
if (string.IsNullOrEmpty(valueStr) || valueStr.StartsWith("{") || valueStr.StartsWith("["))
|
{
|
return false;
|
}
|
return true;
|
}
|
|
static long GetTimestamp()
|
{
|
return (long)(DateTime.Now - new DateTime(1970, 1, 1, 0, 0, 0)).TotalMilliseconds;
|
}
|
|
static string SignMD5Encrypt(string str)
|
{
|
byte[] result = Encoding.UTF8.GetBytes(str.Trim()); //tbPass为输入密码的文本框
|
var md5 = new MD5CryptoServiceProvider();
|
byte[] output = md5.ComputeHash(result);
|
string passwordMD5 = BitConverter.ToString(output).Replace("-", string.Empty); //tbMd5pass为输出加密文本的文本框
|
|
return passwordMD5.Trim().ToLower();
|
}
|
}
|
}
|