using System.Net; using System.Text; using System; using System.Security.Cryptography; using System.Collections.Generic; namespace JiaZhiQuan.Common.KDNiao { /// /// 快递鸟请求数据 /// public class KDNiaoRequest { /// /// apikey /// private string ApiKey; public KDNiaoRequest(string EBusinessID, string ApiKey, string RequestData, KDNiaoRequestType RequestType) { this.ApiKey = ApiKey; this.EBusinessID = EBusinessID; this.RequestData = RequestData.Replace(" ", ""); this.RequestType = RequestType; GenerateDataSign(); } /// /// 请求参数 /// public string RequestData { get; } /// /// 用户id /// public string EBusinessID { get; } /// /// 请求接口类型 /// public KDNiaoRequestType RequestType { get; } /// /// 数据内容签名 (请求体(未编码)+ApiKey)进行MD5加密(32位小写),然后Base64编码,最后进行URL(utf-8)编码 /// public string DataSign { get; private set; } public string DataType { get; } = "2"; private void GenerateDataSign() { string jsonString = RequestData; string stringToSign = jsonString + ApiKey; // 拼接字符串和ApiKey string md5Hash = CalculateMD5Hash(stringToSign); // MD5加密 string base64Encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(md5Hash)); // Base64编码 DataSign = WebUtility.UrlEncode(base64Encoded); // URL编码 } /// /// MD5 32位小写 /// /// /// private static string CalculateMD5Hash(string input) { using (MD5 md5 = MD5.Create()) { byte[] inputBytes = Encoding.UTF8.GetBytes(input); byte[] hashBytes = md5.ComputeHash(inputBytes); StringBuilder sb = new StringBuilder(); for (int i = 0; i < hashBytes.Length; i++) { sb.Append(hashBytes[i].ToString("x2")); // 转换为32位小写的16进制字符串 } return sb.ToString(); } } } /// /// 快递鸟请求接口指令 /// public enum KDNiaoRequestType { 轨迹订阅_免费版 = 1008, 轨迹订阅_增值版 = 8008, 即时查询_免费版 = 1001, 即时查询_增值版 = 8001, 快递查询_增值版 = 8002 } /// /// 快递鸟轨迹订阅接口返回参数 /// public class KDNiaoTrackResponse { /// /// 快递公司编码 /// public string ShipperCode { get; set; } /// /// 快递单号 /// public string LogisticCode { get; set; } /// /// 更新时间 /// public DateTime UpdateTime { get; set; } = DateTime.Now; /// /// 成功与否 /// public bool Success { get; set; } = false; } /// /// 快递鸟callback轨迹参数 /// public class KDNiaoTrackInfo { /// /// 推送时间,示例:2021-01-01 09:00:00 /// public string PushTime { get; set; } /// /// 用户ID /// public string EBusinessID { get; set; } /// /// 推送的轨迹数据集合 /// public List Data { get; set; } /// /// 推送的快递单号个数 /// public string Count { get; set; } } public class KDNiaoTrackDataItem { /// /// 物流状态编码 /// /// 0-暂无轨迹信息 /* 1-已揽收 2-在途中 201-到达派件城市 204-到达转运中心 205-到达派件网点 206-寄件网点发件 202-派件中 211-已放入快递柜或驿站 3-已签收 301-正常签收 302-派件异常后最终签收 304-代收签收 311-快递柜或驿站签收 4-问题件 401-发货无信息 402-超时未签收 403-超时未更新 404-拒收(退件) 405-派件异常 406-退货签收 407-退货未签收 412-快递柜或驿站超时未取 413-单号已拦截 414-破损 415-客户取消发货 416-无法联系 417-配送延迟 418-快件取出 419-重新派送 420-收货地址不详细 421-收件人电话错误 422-错分件 423-超区件 5-转寄 6-清关 601-待清关 602-清关中 603-已清关 604-清关异常 10-待揽件*/ public string StateEx { get; set; } /// /// 快递单号 /// public string LogisticCode { get; set; } /// /// 快递公司编码 /// public string ShipperCode { get; set; } /// /// 轨迹信息 /// public List Traces { get; set; } /// /// 普通物流状态: /// /* 0-暂无轨迹信息 1-已揽收 2-在途中 3-签收 4-问题件 5-转寄 6-清关*/ public int State { get; set; } /// /// 当前城市 /// public string Location { get; set; } /// /// 成功与否 /// public bool Success { get; set; } /// /// 用户自定义回传字段 /// public string Callback { get; set; } /// /// 失败原因 /// public string Reason { get; set; } /// /// 用户id /// public string EBusinessID { get; set; } /// /// 快递员电话 /// public string DeliveryManTel { get; set; } } public class KDNiaoTrace { /// /// 同上面 StateEx /// public string Action { get; set; } /// /// 轨迹描述 /// public string AcceptStation { get; set; } /// /// 轨迹发生时间 /// public string AcceptTime { get; set; } /// /// 备注 /// public string Remark { get; set; } /// /// 历史节点所在城市 /// public string Location { get; set; } } }