gin框架對接快遞100 查詢快遞跟蹤記錄 Golang實現快遞查詢


參考ui效果:
https://www.kuaidi100.com/?from=openv

gin框架:

請求地址 http://localhost:8822/kd100/auto_com_num?num=73119782411952
請求地址 http://localhost:8822/kd100/query_num_detail?num=73119782411952&comCode=zhongtong

//路由
router.GET("/kd100/auto_com_num", controller.AutoComNum) //獲取快遞公司類型
router.GET("/kd100/query_num_detail", controller.QueryNumDetail) //獲取快遞跟蹤信息

//獲取快遞公司類型
func AutoComNum(ctx *gin.Context) {
	//fmt.Println("AutoComNum...")
	text := ctx.Query("num") //單號
	url := "https://www.kuaidi100.com/autonumber/autoComNum?resultv2=1&text=" + text
	paramData := gin.H{}
	headerData := make(map[string]string, 1)
	headerData["User-Agent"] = "Mozilla/5.0 (X11; Linux x86_64; rv:70.0) Gecko/20100101 Firefox/70.0"
	resp := SendPostWithHeard(url, paramData, headerData)
	type resAuto struct {
		ComCode   string `json:"comCode"`
		LengthPre int    `json:"lengthPre"`
		NoCount   int    `json:"noCount"`
		NoPre     string `json:"noPre"`
		Name      string `json:"name"`
	}

	type respData struct {
		Num     string     `json:"num"`
		ComCode string     `json:"comCode"`
		Auto    []*resAuto `json:"auto"`
	}
	var resdata *respData
	if err := json.Unmarshal([]byte(resp), &resdata); err != nil {
		fmt.Println("Unmarshal resdata fail,", err)
		httpext.Error(ctx, e.ERROR)
		return
	}
	for _, v := range resdata.Auto {
		kdName, ok := KD100Flags[v.ComCode]
		if ok {
			v.Name = kdName
		} else {
			v.Name = "未知快遞"
		}
	}
	httpext.SuccessExt(ctx, resdata)
}


//獲取快遞跟蹤信息
func QueryNumDetail(ctx *gin.Context) {
	//fmt.Println("AutoComNum...")
	num := ctx.Query("num")        //單號
	kdtype := ctx.Query("comCode") //快遞類型

	key := "XXXXXXXX"                          //客戶授權key
	customer := "XXXXXXXXXXXXXXXXXXXXXXX" //查詢公司編號

	posturl := "http://poll.kuaidi100.com/poll/query.do" //實時查詢請求地址

	paramData := make(map[string]string)
	paramData["com"] = kdtype //快遞公司編碼
	paramData["num"] = num    //快遞單號
	
	paramDataSlice, _ := json.Marshal(paramData)
	paramjson := string(paramDataSlice)

	sign := strings.ToUpper(crypto.GetMd5String(paramjson + key + customer))
	fmt.Println("p=====>", customer)

	//POST請求需要三個參數,分別為customer(CustomerId)和sign(簽名)和param(參數)
	postRes, postErr := http.PostForm(posturl, url.Values{"customer": {customer}, "sign": {sign}, "param": {paramjson}})
	if postErr != nil {
		fmt.Println("查詢失敗" + postErr.Error())
		httpext.ErrorExt(ctx, e.ERROR, "查詢失敗"+postErr.Error())
		return
	}
	postBody, err := ioutil.ReadAll(postRes.Body)
	if err != nil {
		fmt.Println("查詢失敗,請至快遞公司官網自行查詢" + err.Error())
		httpext.ErrorExt(ctx, e.ERROR, "查詢失敗,請至快遞公司官網自行查詢"+err.Error())
		return
	}
	fmt.Println(string(postBody))
	resp := make(map[string]interface{})
	err = json.Unmarshal(postBody, &resp)
	if err != nil {
		fmt.Println("json.Unmarshal error", err.Error())
		httpext.ErrorExt(ctx, e.ERROR, "查詢失敗,請至快遞公司官網自行查詢"+err.Error())
		return
	}

	httpext.SuccessExt(ctx, resp)
}

// SendPostWithHeard ...   發送POST請求 ...
// url:         請求地址
// data:        POST請求提交的數據
// hearderParam  設置header頭信息
// contentType: 請求體格式,如:json
// content:     請求放回的內容
//func SendPostWithHeard(url string, data interface{}, hearderParam map[string]string, contentType string) string {
func SendPostWithHeard(url string, data interface{}, hearderParam map[string]string) string {
	bytesData, err := json.Marshal(data)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error()
	}

	reader := bytes.NewReader(bytesData)
	request, err := http.NewRequest("POST", url, reader)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error()
	}
	//增加header選項 添加請求頭
	if len(hearderParam) > 0 {
		for k, v := range hearderParam {
			request.Header.Set(k, v)
		}
	}
	//request.Header.Set("Content-Type", contentTypeParam[contentType])

	client := http.Client{}
	resp, err := client.Do(request)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error()
	}
	respBytes, err := ioutil.ReadAll(resp.Body)
	fmt.Println(1111111)
	fmt.Println(respBytes)
	if err != nil {
		fmt.Println(err.Error())
		return err.Error()
	}

	return string(respBytes)
}




var KD100Flags = map[string]string{
	"ane66":          "安能快遞",
	"debangwuliu":    "德邦物流",
	"debangkuaidi":   "德邦快遞",
	"ems":            "EMS",
	"guotongkuaidi":  "國通快遞",
	"huitongkuaidi":  "百世快遞",
	"jd":             "京東物流",
	"kuayue":         "跨越速運",
	"pjbest":         "品駿快遞",
	"shentong":       "申通快遞",
	"shunfeng":       "順豐速運",
	"suer":           "速爾快遞",
	"xinfengwuliu":   "信豐物流",
	"youshuwuliu":    "優速物流",
	"youzhengguonei": "郵政快遞包裹",
	"yuantong":       "圓通速遞",
	"yuantongguoji":  "圓通國際",
	"yunda":          "韻達快遞",
	"zhaijisong":     "宅急送",
	"zhongtong":      "中通快遞",
	"ewe":            "EWE全球快遞",
	"quanyikuaidi":   "全一快遞",
	"tiantian":       "天天快遞",
	"sxjdfreight":    "順心捷達",
	"dhl":            "DHL-中國件",
	"tnt":            "TNT",
	"other":          "其它快遞",
}

獲取快遞公司類型 返回參:

    {
        "data": {
            "num": "1009414746833",
            "comCode": "",
            "auto": [
                {
                    "comCode": "ems",
                    "lengthPre": 13,
                    "noCount": 32,
                    "noPre": "100941",
                    "name": "EMS"
                },
                {
                    "comCode": "youzhengguonei",
                    "lengthPre": 13,
                    "noCount": 1,
                    "noPre": "100941",
                    "name": "郵政快遞包裹"
                }
            ]
        },
        "errmsg": "ok",
        "errno": 200
    }

獲取快遞跟蹤信息 反參

    {
        "data": {
            "com": "zhongtong",
            "condition": "00",
            "data": [
                {
                    "context": "訂單已由【菜鳥驛站】代收,感謝您在京東購物,歡迎您再次光臨!",
                    "ftime": "2020-04-05 11:47:12",
                    "location": "",
                    "time": "2020-04-05 11:47:12"
                },
                {
                    "context": "配送員開始配送,請您准備收貨,配送員,方輝,手機號,15807710153",
                    "ftime": "2020-04-05 08:15:18",
                    "location": "",
                    "time": "2020-04-05 08:15:18"
                },
                {
                    "context": "貨物已分配,等待配送",
                    "ftime": "2020-04-05 07:48:13",
                    "location": "",
                    "time": "2020-04-05 07:48:13"
                },
                {
                    "context": "貨物已到達【南寧良慶營業部】",
                    "ftime": "2020-04-05 07:48:12",
                    "location": "",
                    "time": "2020-04-05 07:48:12"
                },
                {
                    "context": "貨物已完成分揀,離開【南寧分撥中心】",
                    "ftime": "2020-04-04 23:50:33",
                    "location": "",
                    "time": "2020-04-04 23:50:33"
                },
                {
                    "context": "貨物已完成分揀,離開【南寧分撥中心】",
                    "ftime": "2020-04-04 21:46:25",
                    "location": "",
                    "time": "2020-04-04 21:46:25"
                },
                {
                    "context": "貨物已到達【南寧分撥中心】",
                    "ftime": "2020-04-04 21:44:52",
                    "location": "",
                    "time": "2020-04-04 21:44:52"
                },
                {
                    "context": "貨物已完成分揀,離開【南寧分撥中心】",
                    "ftime": "2020-04-04 18:51:02",
                    "location": "",
                    "time": "2020-04-04 18:51:02"
                },
                {
                    "context": "貨物已交付京東物流",
                    "ftime": "2020-04-04 17:47:17",
                    "location": "",
                    "time": "2020-04-04 17:47:17"
                }
            ],
            "ischeck": "0",
            "message": "ok",
            "nu": "73119782411952",
            "state": "0",
            "status": "200"
        },
        "errmsg": "ok",
        "errno": 200
    }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM