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; }
}
}