package utils import ( "youngmini_server/app/model/youngee_talent_model" "crypto/md5" "encoding/hex" "encoding/json" "fmt" "io/ioutil" "net/http" "net/url" "strings" ) var KD100Flags = map[string]string{ "圆通速递": "yuantong", "韵达快递": "yunda", "申通快递": "shentong", "中通快递": "zhongtong", "顺丰速运": "shunfeng", "极兔": "jtexpress", "邮政快递包裹": "youzhengguonei", "EMS": "ems", "京东物流": "jd", "邮政标准快递": "youzhengbk", "丰网速运": "fengwang", "德邦快递": "debangkuaidi", "德邦物流": "debangwuliu", "丹鸟": "danniao", "飞豹快递": "feibaokuaidi", "中通快运": "zhongtongkuaiyun", "安能快运": "annengwuliu", "百世快递": "huitongkuaidi", "安得物流": "annto", "跨越速运": "kuayue", "特急送": "lntjs", "宅急送": "zhaijisong", "其它快递": "other", } // GetKDStatus 获取快递跟踪信息 func GetKDStatus(com, num string) string { fmt.Printf("查询物流公司为 %s, 快递为编号为 %v 的快递\n", KD100Flags[com], num) key := "GsCwDkmq1520" //客户授权key customer := "F2E05F275D02E5344011B3DCD6FEB80D" //查询公司编号 postUrl := "https://poll.kuaidi100.com/poll/query.do" //实时查询请求地址 paramData := make(map[string]string) paramData["com"] = com //快递公司编码 paramData["num"] = num //快递单号 paramDataSlice, _ := json.Marshal(paramData) paramjson := string(paramDataSlice) sign := strings.ToUpper(GetMD5Encode(paramjson + key + customer)) // POST请求需要三个参数,分别为customer(CustomerId)和sign(签名)和param(参数) fmt.Println("快递 sign:", sign) fmt.Println("快递 paramjson:", paramjson) postRes, postErr := http.PostForm(postUrl, url.Values{"customer": {customer}, "sign": {sign}, "param": {paramjson}}) if postErr != nil { fmt.Println("查询失败" + postErr.Error()) return "查询失败" } postBody, err := ioutil.ReadAll(postRes.Body) if err != nil { fmt.Println("查询失败,请至快递公司官网自行查询" + err.Error()) return "查询失败,请至快递公司官网自行查询" } resp := youngee_talent_model.KdState{} err = json.Unmarshal(postBody, &resp) if err != nil { fmt.Println("json.Unmarshal error", err.Error()) return "查询失败" } if resp.IsCheck == "1" { fmt.Println("查询成功,快递已签收") } else { fmt.Println("查询成功,快递尚未签收") } return resp.IsCheck } // 参数 1.快递公司 2.订单编号,都是string类型 func GetKDDetails(com, num string) *youngee_talent_model.KdState { fmt.Printf("查询物流公司为 %s, 快递为编号为 %v 的快递\n", KD100Flags[com], num) //根据键(汉字)取出值(拼音) com = KD100Flags[com] key := "GsCwDkmq1520" //客户授权key customer := "F2E05F275D02E5344011B3DCD6FEB80D" //查询公司编号 postUrl := "https://poll.kuaidi100.com/poll/query.do" //实时查询请求地址 //使用 make 函数定义并初始化:映射(map)数据类型 paramData := make(map[string]string) paramData["com"] = com //快递公司编码 paramData["num"] = num //快递单号 // 将一个 map[string]string 类型的变量编码为 JSON 格式 paramDataSlice, _ := json.Marshal(paramData) paramjson := string(paramDataSlice) //构造必要参数:签名 sign := strings.ToUpper(GetMD5Encode(paramjson + key + customer)) // POST请求需要三个参数,分别为customer(CustomerId)和sign(签名)和param(参数) fmt.Println("快递 sign:", sign) fmt.Println("快递 paramjson:", paramjson) postRes, postErr := http.PostForm(postUrl, url.Values{"customer": {customer}, "sign": {sign}, "param": {paramjson}}) if postErr != nil { fmt.Println("查询失败" + postErr.Error()) return nil } postBody, err := ioutil.ReadAll(postRes.Body) if err != nil { fmt.Println("查询失败,请至快递公司官网自行查询" + err.Error()) return nil } fmt.Printf("postBody=%+v\n", postBody) resp := youngee_talent_model.KdState{} //将json解析回到结构体 err = json.Unmarshal(postBody, &resp) fmt.Printf("resp=%+v\n", resp) if resp.Data != nil { for _, v := range resp.Data { fmt.Printf("v=%+v\n", v) } } if err != nil { fmt.Println("json.Unmarshal error", err.Error()) return nil } if resp.IsCheck == "1" { fmt.Println("查询成功,快递已签收") } else { fmt.Println("查询成功,快递尚未签收") } return &resp } // GetMD5Encode 返回一个32位md5加密后的字符串 func GetMD5Encode(data string) string { h := md5.New() h.Write([]byte(data)) return hex.EncodeToString(h.Sum(nil)) }