kuaiDi100.go 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. package service
  2. import (
  3. "crypto/md5"
  4. "encoding/hex"
  5. "encoding/json"
  6. "fmt"
  7. "io/ioutil"
  8. "net/http"
  9. "net/url"
  10. "strings"
  11. )
  12. type KdState struct {
  13. Message string `json:"message"`
  14. State string `json:"state"`
  15. Status string `json:"status"`
  16. IsCheck string `json:"ischeck"`
  17. }
  18. var KD100Flags = map[string]string{
  19. "ane66": "安能快递",
  20. "debangwuliu": "德邦物流",
  21. "debangkuaidi": "德邦快递",
  22. "ems": "EMS",
  23. "guotongkuaidi": "国通快递",
  24. "huitongkuaidi": "百世快递",
  25. "jd": "京东物流",
  26. "kuayue": "跨越速运",
  27. "pjbest": "品骏快递",
  28. "shentong": "申通快递",
  29. "shunfeng": "顺丰速运",
  30. "suer": "速尔快递",
  31. "xinfengwuliu": "信丰物流",
  32. "youshuwuliu": "优速物流",
  33. "youzhengguonei": "邮政快递包裹",
  34. "yuantong": "圆通速递",
  35. "yuantongguoji": "圆通国际",
  36. "yunda": "韵达快递",
  37. "zhaijisong": "宅急送",
  38. "zhongtong": "中通快递",
  39. "ewe": "EWE全球快递",
  40. "quanyikuaidi": "全一快递",
  41. "tiantian": "天天快递",
  42. "sxjdfreight": "顺心捷达",
  43. "dhl": "DHL-中国件",
  44. "tnt": "TNT",
  45. "other": "其它快递",
  46. }
  47. // GetKDStatus 获取快递跟踪信息
  48. func GetKDStatus(com, num string) string {
  49. fmt.Printf("查询物流公司为 %s, 快递为编号为 %v 的快递\n", KD100Flags[com], num)
  50. key := "GsCwDkmq1520" //客户授权key
  51. customer := "F2E05F275D02E5344011B3DCD6FEB80D" //查询公司编号
  52. postUrl := "https://poll.kuaidi100.com/poll/query.do" //实时查询请求地址
  53. paramData := make(map[string]string)
  54. paramData["com"] = com //快递公司编码
  55. paramData["num"] = num //快递单号
  56. paramDataSlice, _ := json.Marshal(paramData)
  57. paramjson := string(paramDataSlice)
  58. sign := strings.ToUpper(GetMD5Encode(paramjson + key + customer))
  59. // POST请求需要三个参数,分别为customer(CustomerId)和sign(签名)和param(参数)
  60. fmt.Println("快递 sign:", sign)
  61. postRes, postErr := http.PostForm(postUrl, url.Values{"customer": {customer}, "sign": {sign}, "param": {paramjson}})
  62. if postErr != nil {
  63. fmt.Println("查询失败" + postErr.Error())
  64. return "查询失败"
  65. }
  66. postBody, err := ioutil.ReadAll(postRes.Body)
  67. if err != nil {
  68. fmt.Println("查询失败,请至快递公司官网自行查询" + err.Error())
  69. return "查询失败,请至快递公司官网自行查询"
  70. }
  71. resp := KdState{}
  72. err = json.Unmarshal(postBody, &resp)
  73. if err != nil {
  74. fmt.Println("json.Unmarshal error", err.Error())
  75. return "查询失败"
  76. }
  77. if resp.IsCheck == "1" {
  78. fmt.Println("查询成功,快递已签收")
  79. } else {
  80. fmt.Println("查询成功,快递尚未签收")
  81. }
  82. return resp.IsCheck
  83. }
  84. // GetMD5Encode 返回一个32位md5加密后的字符串
  85. func GetMD5Encode(data string) string {
  86. h := md5.New()
  87. h.Write([]byte(data))
  88. return hex.EncodeToString(h.Sum(nil))
  89. }