kuaidi100.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package utils
  2. import (
  3. "youngmini_server/app/model/youngee_talent_model"
  4. "crypto/md5"
  5. "encoding/hex"
  6. "encoding/json"
  7. "fmt"
  8. "io/ioutil"
  9. "net/http"
  10. "net/url"
  11. "strings"
  12. )
  13. var KD100Flags = map[string]string{
  14. "圆通速递": "yuantong",
  15. "韵达快递": "yunda",
  16. "申通快递": "shentong",
  17. "中通快递": "zhongtong",
  18. "顺丰速运": "shunfeng",
  19. "极兔": "jtexpress",
  20. "邮政快递包裹": "youzhengguonei",
  21. "EMS": "ems",
  22. "京东物流": "jd",
  23. "邮政标准快递": "youzhengbk",
  24. "丰网速运": "fengwang",
  25. "德邦快递": "debangkuaidi",
  26. "德邦物流": "debangwuliu",
  27. "丹鸟": "danniao",
  28. "飞豹快递": "feibaokuaidi",
  29. "中通快运": "zhongtongkuaiyun",
  30. "安能快运": "annengwuliu",
  31. "百世快递": "huitongkuaidi",
  32. "安得物流": "annto",
  33. "跨越速运": "kuayue",
  34. "特急送": "lntjs",
  35. "宅急送": "zhaijisong",
  36. "其它快递": "other",
  37. }
  38. // GetKDStatus 获取快递跟踪信息
  39. func GetKDStatus(com, num string) string {
  40. fmt.Printf("查询物流公司为 %s, 快递为编号为 %v 的快递\n", KD100Flags[com], num)
  41. key := "GsCwDkmq1520" //客户授权key
  42. customer := "F2E05F275D02E5344011B3DCD6FEB80D" //查询公司编号
  43. postUrl := "https://poll.kuaidi100.com/poll/query.do" //实时查询请求地址
  44. paramData := make(map[string]string)
  45. paramData["com"] = com //快递公司编码
  46. paramData["num"] = num //快递单号
  47. paramDataSlice, _ := json.Marshal(paramData)
  48. paramjson := string(paramDataSlice)
  49. sign := strings.ToUpper(GetMD5Encode(paramjson + key + customer))
  50. // POST请求需要三个参数,分别为customer(CustomerId)和sign(签名)和param(参数)
  51. fmt.Println("快递 sign:", sign)
  52. fmt.Println("快递 paramjson:", paramjson)
  53. postRes, postErr := http.PostForm(postUrl, url.Values{"customer": {customer}, "sign": {sign}, "param": {paramjson}})
  54. if postErr != nil {
  55. fmt.Println("查询失败" + postErr.Error())
  56. return "查询失败"
  57. }
  58. postBody, err := ioutil.ReadAll(postRes.Body)
  59. if err != nil {
  60. fmt.Println("查询失败,请至快递公司官网自行查询" + err.Error())
  61. return "查询失败,请至快递公司官网自行查询"
  62. }
  63. resp := youngee_talent_model.KdState{}
  64. err = json.Unmarshal(postBody, &resp)
  65. if err != nil {
  66. fmt.Println("json.Unmarshal error", err.Error())
  67. return "查询失败"
  68. }
  69. if resp.IsCheck == "1" {
  70. fmt.Println("查询成功,快递已签收")
  71. } else {
  72. fmt.Println("查询成功,快递尚未签收")
  73. }
  74. return resp.IsCheck
  75. }
  76. // 参数 1.快递公司 2.订单编号,都是string类型
  77. func GetKDDetails(com, num string) *youngee_talent_model.KdState {
  78. fmt.Printf("查询物流公司为 %s, 快递为编号为 %v 的快递\n", KD100Flags[com], num)
  79. //根据键(汉字)取出值(拼音)
  80. com = KD100Flags[com]
  81. key := "GsCwDkmq1520" //客户授权key
  82. customer := "F2E05F275D02E5344011B3DCD6FEB80D" //查询公司编号
  83. postUrl := "https://poll.kuaidi100.com/poll/query.do" //实时查询请求地址
  84. //使用 make 函数定义并初始化:映射(map)数据类型
  85. paramData := make(map[string]string)
  86. paramData["com"] = com //快递公司编码
  87. paramData["num"] = num //快递单号
  88. // 将一个 map[string]string 类型的变量编码为 JSON 格式
  89. paramDataSlice, _ := json.Marshal(paramData)
  90. paramjson := string(paramDataSlice)
  91. //构造必要参数:签名
  92. sign := strings.ToUpper(GetMD5Encode(paramjson + key + customer))
  93. // POST请求需要三个参数,分别为customer(CustomerId)和sign(签名)和param(参数)
  94. fmt.Println("快递 sign:", sign)
  95. fmt.Println("快递 paramjson:", paramjson)
  96. postRes, postErr := http.PostForm(postUrl, url.Values{"customer": {customer}, "sign": {sign}, "param": {paramjson}})
  97. if postErr != nil {
  98. fmt.Println("查询失败" + postErr.Error())
  99. return nil
  100. }
  101. postBody, err := ioutil.ReadAll(postRes.Body)
  102. if err != nil {
  103. fmt.Println("查询失败,请至快递公司官网自行查询" + err.Error())
  104. return nil
  105. }
  106. fmt.Printf("postBody=%+v\n", postBody)
  107. resp := youngee_talent_model.KdState{}
  108. //将json解析回到结构体
  109. err = json.Unmarshal(postBody, &resp)
  110. fmt.Printf("resp=%+v\n", resp)
  111. if resp.Data != nil {
  112. for _, v := range resp.Data {
  113. fmt.Printf("v=%+v\n", v)
  114. }
  115. }
  116. if err != nil {
  117. fmt.Println("json.Unmarshal error", err.Error())
  118. return nil
  119. }
  120. if resp.IsCheck == "1" {
  121. fmt.Println("查询成功,快递已签收")
  122. } else {
  123. fmt.Println("查询成功,快递尚未签收")
  124. }
  125. return &resp
  126. }
  127. // GetMD5Encode 返回一个32位md5加密后的字符串
  128. func GetMD5Encode(data string) string {
  129. h := md5.New()
  130. h.Write([]byte(data))
  131. return hex.EncodeToString(h.Sum(nil))
  132. }