using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Net; using System.Security.Cryptography; using System.Text; using Api.Framework.SDK; using CsharpHttpHelper; namespace Api.Framework.Tools { /// /// 用户/机器人上传 /// public class UserRobotUpLoad { /// /// host /// public static readonly string host = "http://yzinterface.api.52cmg.cn/api/"; public static readonly int appkey = 334391396; public static readonly string appsecret = "b924f8b944694cb8891bcfc7834dedb533436a3776de472cbde99577337902b2"; public static readonly string appAes = "EDC19B73FEB447929E187243777477913977AB2694394E5B9BC56CD05302C46B"; public static string UserToken { get; set; } /// /// 上传客户信息 /// /// /// public static ServiceResult CustomerLink_UpLoadLink(List inputs) { if (inputs == null || inputs.Count <= 0) { return new ServiceResult() { Ok = true }; } return HttpAes("CustomerLink/UpLoadLink", "post", inputs); } /// /// 上传客户机器人信息 /// /// /// public static ServiceResult CustomerLink_UpLoadRobot(List inputs) { if (inputs == null || inputs.Count <= 0) { return new ServiceResult() { Ok = true }; } return HttpAes("CustomerLink/UpLoadRobot", "post", inputs); } /// /// AES /// /// /// /// /// /// private static ServiceResult HttpAes(string api, string method, object postdata = null) { try { var result = HttpResultAes(api, method, postdata); if (result.StatusCode == HttpStatusCode.OK) { return Newtonsoft.Json.JsonConvert.DeserializeObject>(result.Html); } return new ServiceResult(default(T)) { Ok = false, Message = result.Html, }; } catch (Exception e) { return new ServiceResult(default(T)) { Ok = false, Message = e.ToString(), }; } } /// /// aes /// /// /// /// /// private static ServiceResult HttpAes(string api, string method, object postdata = null) { try { var result = HttpResultAes(api, method, postdata); if (result.StatusCode == HttpStatusCode.OK) { return Newtonsoft.Json.JsonConvert.DeserializeObject(result.Html); } return new ServiceResult() { Ok = false, Data = result.Html, }; } catch (Exception e) { return new ServiceResult() { Ok = false, Data = e.ToString(), }; } } /// /// http aes /// /// /// /// /// private static HttpResult HttpResultAes(string api, string method, object postdata = null) { var data = Newtonsoft.Json.JsonConvert.SerializeObject(postdata); var http = new HttpHelper(); HttpItem item = new HttpItem() { URL = host + api, Method = method, Timeout = 100000, ReadWriteTimeout = 30000, IsToLower = false, Cookie = "", UserAgent = "Server", Accept = "text/html, application/xhtml+xml, */*", ContentType = "application/json", Referer = "", Allowautoredirect = false, AutoRedirectCookie = false, Postdata = data, PostEncoding = Encoding.UTF8, //WebProxy = new WebProxy("127.0.0.1:8888") }; var timespan = GetTimespan(DateTime.Now);/*DateTimeHelper.DateTimeToTimeStamp(DateTime.Now)*/; item.Postdata = SecurityHelper.AesEncrypt(item.Postdata, appAes); var sign = MD5ToString(Encrypt(item.Postdata + appkey + timespan, appsecret, false)); item.Header.Add("sign", sign); item.Header.Add("timestamp", timespan + ""); item.Header.Add("appkey", appkey + ""); item.Header.Add("UserToken", UserToken); var result = http.GetHtml(item); return result; } /// /// AES加密 /// /// 明文 /// 密钥 /// 是否转为base64(否的情况将采用16进制字符串) /// public static string Encrypt(string encryptStr, string key, bool isBase64 = true, bool is32 = true) { byte[] keyArray = Encoding.UTF8.GetBytes(key.Substring(0, is32 ? 32 : 16)); byte[] toEncryptArray = Encoding.UTF8.GetBytes(encryptStr); RijndaelManaged rDel = new RijndaelManaged(); rDel.Key = keyArray; rDel.Mode = CipherMode.ECB; rDel.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = rDel.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return isBase64 ? Convert.ToBase64String(resultArray, 0, resultArray.Length) : ByteArrayToHexString(resultArray); } /// /// 将一个byte数组转换成16进制字符串 /// /// /// private static string ByteArrayToHexString(byte[] data) { StringBuilder sb = new StringBuilder(data.Length * 3); foreach (byte b in data) { sb.Append(Convert.ToString(b, 16).PadLeft(2, '0')); } return sb.ToString().ToUpper(); } public static string MD5ToString(string text) { var retVal = new MD5CryptoServiceProvider().ComputeHash(Encoding.Default.GetBytes(text)); return string.Join("", retVal.Select(s => s.ToString("x2"))); } /// /// 时间戳(秒) /// /// /// public static Int64 GetTimespan(DateTime dateTime) { TimeSpan ts = dateTime - new DateTime(1970, 1, 1, 0, 0, 0, 0); return Convert.ToInt64(ts.TotalSeconds); } /// /// 加密解密帮助类 /// public class SecurityHelper { #region AES加密解密 /// /// 128位处理key /// /// 原字节 /// 处理key /// private static byte[] GetAesKey(byte[] keyArray, string key) { byte[] newArray = new byte[16]; if (keyArray.Length < 16) { for (int i = 0; i < newArray.Length; i++) { if (i >= keyArray.Length) { newArray[i] = 0; } else { newArray[i] = keyArray[i]; } } } return newArray; } /// /// 使用AES加密字符串,按128位处理key /// /// 加密内容 /// 秘钥,需要128位、256位..... /// 秘钥,需要128位、256位..... /// Base64字符串结果 public static string AesEncrypt(string content, string key, bool autoHandle = true) { try { byte[] keyArray = Encoding.UTF8.GetBytes(key); if (autoHandle) { keyArray = GetAesKey(keyArray, key); } byte[] toEncryptArray = Encoding.UTF8.GetBytes(content); SymmetricAlgorithm des = Aes.Create(); des.Key = keyArray; des.Mode = CipherMode.ECB; des.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = des.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray); } catch { return ""; } } /// /// 使用AES解密字符串,按128位处理key /// /// 内容 /// 秘钥,需要128位、256位..... /// 秘钥,需要128位、256位..... /// UTF8解密结果 public static string AesDecrypt(string content, string key, bool autoHandle = true) { try { byte[] keyArray = Encoding.UTF8.GetBytes(key); if (autoHandle) { keyArray = GetAesKey(keyArray, key); } byte[] toEncryptArray = Convert.FromBase64String(content); SymmetricAlgorithm des = Aes.Create(); des.Key = keyArray; des.Mode = CipherMode.ECB; des.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = des.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Encoding.UTF8.GetString(resultArray); } catch { return ""; } } /// /// 使用AES解密字符串,按128位处理key /// /// 内容 /// 秘钥,需要128位、256位..... /// 秘钥,需要128位、256位..... /// UTF8解密结果 public static byte[] AesDecryptByte(string content, string key, bool autoHandle = true) { try { byte[] keyArray = Encoding.UTF8.GetBytes(key); if (autoHandle) { keyArray = GetAesKey(keyArray, key); } byte[] toEncryptArray = Convert.FromBase64String(content); SymmetricAlgorithm des = Aes.Create(); des.Key = keyArray; des.Mode = CipherMode.ECB; des.Padding = PaddingMode.PKCS7; ICryptoTransform cTransform = des.CreateDecryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return resultArray; } catch { return null; } } #endregion } /// /// 上传机器人客户信息 /// public class CustomerLinkInput { /// /// 用户名 /// [Required] [DisplayName("用户名")] public string UserName { get; set; } /// /// 机器人类型0个人微信 1企业微信 2QQ /// [Required] [DisplayName("机器人类型0个人微信 1企业微信 2QQ")] public int RobotType { get; set; } /// /// 头像地址 /// public string HeadUrl { get; set; } /// /// 昵称 /// public string NickName { get; set; } /// /// 备注 /// public string Remark { get; set; } /// /// 机器人账号 /// [Required] [DisplayName("机器人账号")] public string RobotName { get; set; } /// /// 添加时间 /// [Required] public DateTime CreateTime { get; set; } } /// /// 转换机器人类型 /// /// /// public static int ConvertRobotType(ChatType chatType) { /* 未知来源 = 0, QQ = 1, 微信 = 2, 微信公众号 = 3, 企业微信 = 4 */ switch (chatType) { case ChatType.QQ: return 2; case ChatType.企业微信: return 1; case ChatType.微信: return 0; case ChatType.微信公众号: return -1; case ChatType.未知来源: return -1; } return -1; } /// /// 上传机器人信息 /// public class CustomerRobotInput { /// /// 用户名 /// [Required] [DisplayName("用户名")] public string UserName { get; set; } /// /// 机器人类型0个人微信 1企业微信 2QQ /// [Required] [DisplayName("机器人类型0个人微信 1企业微信 2QQ")] public int RobotType { get; set; } /// /// 头像地址 /// public string HeadUrl { get; set; } /// /// 昵称 /// public string NickName { get; set; } /// /// 备注 /// public string Remark { get; set; } } /// /// 统一服务返回结果 /// public class ServiceResult { /// /// 请求是否成功 /// public bool Ok { get; set; } /// /// 数据 /// public object Data { get; set; } /// /// 错误信息 /// public string Message { get; set; } } /// /// 统一返回结果 /// /// public class ServiceResult : ServiceResult { /// /// 初始化 /// /// public ServiceResult(T data) { this.Data = data; } /// /// 返回数据 /// public new T Data { get; set; } } } }