KDNiaoModel.cs 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. using System.Net;
  2. using System.Text;
  3. using System;
  4. using System.Security.Cryptography;
  5. using System.Collections.Generic;
  6. namespace JiaZhiQuan.Common.KDNiao
  7. {
  8. /// <summary>
  9. /// 快递鸟请求数据
  10. /// </summary>
  11. public class KDNiaoRequest
  12. {
  13. /// <summary>
  14. /// apikey
  15. /// </summary>
  16. private string ApiKey;
  17. public KDNiaoRequest(string EBusinessID, string ApiKey, string RequestData, KDNiaoRequestType RequestType)
  18. {
  19. this.ApiKey = ApiKey;
  20. this.EBusinessID = EBusinessID;
  21. this.RequestData = RequestData.Replace(" ", "");
  22. this.RequestType = RequestType;
  23. GenerateDataSign();
  24. }
  25. /// <summary>
  26. /// 请求参数
  27. /// </summary>
  28. public string RequestData { get; }
  29. /// <summary>
  30. /// 用户id
  31. /// </summary>
  32. public string EBusinessID { get; }
  33. /// <summary>
  34. /// 请求接口类型
  35. /// </summary>
  36. public KDNiaoRequestType RequestType { get; }
  37. /// <summary>
  38. /// 数据内容签名 (请求体(未编码)+ApiKey)进行MD5加密(32位小写),然后Base64编码,最后进行URL(utf-8)编码
  39. /// </summary>
  40. public string DataSign { get; private set; }
  41. public string DataType { get; } = "2";
  42. private void GenerateDataSign()
  43. {
  44. string jsonString = RequestData;
  45. string stringToSign = jsonString + ApiKey; // 拼接字符串和ApiKey
  46. string md5Hash = CalculateMD5Hash(stringToSign); // MD5加密
  47. string base64Encoded = Convert.ToBase64String(Encoding.UTF8.GetBytes(md5Hash)); // Base64编码
  48. DataSign = WebUtility.UrlEncode(base64Encoded); // URL编码
  49. }
  50. /// <summary>
  51. /// MD5 32位小写
  52. /// </summary>
  53. /// <param name="input"></param>
  54. /// <returns></returns>
  55. private static string CalculateMD5Hash(string input)
  56. {
  57. using (MD5 md5 = MD5.Create())
  58. {
  59. byte[] inputBytes = Encoding.UTF8.GetBytes(input);
  60. byte[] hashBytes = md5.ComputeHash(inputBytes);
  61. StringBuilder sb = new StringBuilder();
  62. for (int i = 0; i < hashBytes.Length; i++)
  63. {
  64. sb.Append(hashBytes[i].ToString("x2")); // 转换为32位小写的16进制字符串
  65. }
  66. return sb.ToString();
  67. }
  68. }
  69. }
  70. /// <summary>
  71. /// 快递鸟请求接口指令
  72. /// </summary>
  73. public enum KDNiaoRequestType
  74. {
  75. 轨迹订阅_免费版 = 1008,
  76. 轨迹订阅_增值版 = 8008,
  77. 即时查询_免费版 = 1001,
  78. 即时查询_增值版 = 8001,
  79. 快递查询_增值版 = 8002
  80. }
  81. /// <summary>
  82. /// 快递鸟轨迹订阅接口返回参数
  83. /// </summary>
  84. public class KDNiaoTrackResponse
  85. {
  86. /// <summary>
  87. /// 快递公司编码
  88. /// </summary>
  89. public string ShipperCode { get; set; }
  90. /// <summary>
  91. /// 快递单号
  92. /// </summary>
  93. public string LogisticCode { get; set; }
  94. /// <summary>
  95. /// 更新时间
  96. /// </summary>
  97. public DateTime UpdateTime { get; set; } = DateTime.Now;
  98. /// <summary>
  99. /// 成功与否
  100. /// </summary>
  101. public bool Success { get; set; } = false;
  102. }
  103. /// <summary>
  104. /// 快递鸟callback轨迹参数
  105. /// </summary>
  106. public class KDNiaoTrackInfo
  107. {
  108. /// <summary>
  109. /// 推送时间,示例:2021-01-01 09:00:00
  110. /// </summary>
  111. public string PushTime { get; set; }
  112. /// <summary>
  113. /// 用户ID
  114. /// </summary>
  115. public string EBusinessID { get; set; }
  116. /// <summary>
  117. /// 推送的轨迹数据集合
  118. /// </summary>
  119. public List<KDNiaoTrackDataItem> Data { get; set; }
  120. /// <summary>
  121. /// 推送的快递单号个数
  122. /// </summary>
  123. public string Count { get; set; }
  124. }
  125. public class KDNiaoTrackDataItem
  126. {
  127. /// <summary>
  128. /// 物流状态编码
  129. /// </summary>
  130. /// 0-暂无轨迹信息
  131. /*
  132. 1-已揽收
  133. 2-在途中
  134. 201-到达派件城市
  135. 204-到达转运中心
  136. 205-到达派件网点
  137. 206-寄件网点发件
  138. 202-派件中
  139. 211-已放入快递柜或驿站
  140. 3-已签收
  141. 301-正常签收
  142. 302-派件异常后最终签收
  143. 304-代收签收
  144. 311-快递柜或驿站签收
  145. 4-问题件
  146. 401-发货无信息
  147. 402-超时未签收
  148. 403-超时未更新
  149. 404-拒收(退件)
  150. 405-派件异常
  151. 406-退货签收
  152. 407-退货未签收
  153. 412-快递柜或驿站超时未取
  154. 413-单号已拦截
  155. 414-破损
  156. 415-客户取消发货
  157. 416-无法联系
  158. 417-配送延迟
  159. 418-快件取出
  160. 419-重新派送
  161. 420-收货地址不详细
  162. 421-收件人电话错误
  163. 422-错分件
  164. 423-超区件
  165. 5-转寄
  166. 6-清关
  167. 601-待清关
  168. 602-清关中
  169. 603-已清关
  170. 604-清关异常
  171. 10-待揽件*/
  172. public string StateEx { get; set; }
  173. /// <summary>
  174. /// 快递单号
  175. /// </summary>
  176. public string LogisticCode { get; set; }
  177. /// <summary>
  178. /// 快递公司编码
  179. /// </summary>
  180. public string ShipperCode { get; set; }
  181. /// <summary>
  182. /// 轨迹信息
  183. /// </summary>
  184. public List<KDNiaoTrace> Traces { get; set; }
  185. /// <summary>
  186. /// 普通物流状态:
  187. /// </summary>
  188. /*
  189. 0-暂无轨迹信息
  190. 1-已揽收
  191. 2-在途中
  192. 3-签收
  193. 4-问题件
  194. 5-转寄
  195. 6-清关*/
  196. public int State { get; set; }
  197. /// <summary>
  198. /// 当前城市
  199. /// </summary>
  200. public string Location { get; set; }
  201. /// <summary>
  202. /// 成功与否
  203. /// </summary>
  204. public bool Success { get; set; }
  205. /// <summary>
  206. /// 用户自定义回传字段
  207. /// </summary>
  208. public string Callback { get; set; }
  209. /// <summary>
  210. /// 失败原因
  211. /// </summary>
  212. public string Reason { get; set; }
  213. /// <summary>
  214. /// 用户id
  215. /// </summary>
  216. public string EBusinessID { get; set; }
  217. /// <summary>
  218. /// 快递员电话
  219. /// </summary>
  220. public string DeliveryManTel { get; set; }
  221. }
  222. public class KDNiaoTrace
  223. {
  224. /// <summary>
  225. /// 同上面 StateEx
  226. /// </summary>
  227. public string Action { get; set; }
  228. /// <summary>
  229. /// 轨迹描述
  230. /// </summary>
  231. public string AcceptStation { get; set; }
  232. /// <summary>
  233. /// 轨迹发生时间
  234. /// </summary>
  235. public string AcceptTime { get; set; }
  236. /// <summary>
  237. /// 备注
  238. /// </summary>
  239. public string Remark { get; set; }
  240. /// <summary>
  241. /// 历史节点所在城市
  242. /// </summary>
  243. public string Location { get; set; }
  244. }
  245. }