Beego使用快递100实现物流详情的查询展示

直接贴控制器方法,关键部分在代码中注释标出

func (c *OrderController) ShippingDetail() {
	type ShippingResult struct {
		LengthPre int `json:"lengthPre"`
		ComCode string	 `json:"comCode"`
		NoPre string 	 `json:"noPre"`
		NoCount int   `json:"noCount"`
	}
	//express为前端传来的快递单号
	express := c.GetString("express_order")
	//GET请求查询快递单号所属公司,多家的话取第一家(请求链接中XXXX部分替换为你快递100中申请到的授权码key)
	geturl := "http://www.kuaidi100.com/autonumber/auto?key=XXXXXXXXXXXX&num="+express
	resp, err := http.Get(geturl)
	if err != nil {
		c.Ctx.WriteString("查询失败,请至快递公司官网自行查询"+err.Error())
		c.StopRun()
	}
	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	//快递单号不存在
	if string(body)=="[]"{
		c.Ctx.WriteString("物流单号异常,请检查单号是否正确")
		c.StopRun()
	}
	var result []ShippingResult
	bodyErr := json.Unmarshal(body,&result)
	//签名错误,API错误,请求超时等错误
	if bodyErr != nil{
		c.Ctx.WriteString("查询失败,请至快递公司官网自行查询"+bodyErr.Error())
		c.StopRun()
	}
	//POST请求查询快递详情
	//expressCompany为此快递单号对应的快递公司编号(取第一家),比如圆通是yuantong,韵达是yunda
	expressCompany := result[0].ComCode
	posturl := "https://poll.kuaidi100.com/poll/query.do"
	//customer替换为你快递100中分配的CustomerID
	customer := "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
	//param参数中com和num为必填项,分别是快递公司编号和快递单号
	param := make(map[string]string)
	param["com"] = expressCompany
	param["num"] = express
	parambyte,_ := json.Marshal(param)
	paramjson := string(parambyte)
	//sign中XXXX部分为快递100中申请到的授权码key,sign由参数+key+customerid通过MD5加密32位大写组成,MD5加密方法这里不贴出了
	sign := strings.ToUpper(tools.Md5s(paramjson+"XXXXXXXXXXXX"+customer))
	//POST请求需要三个参数,分别为customer(CustomerId)和sign(签名)和param(参数)
	postRes, postErr := http.PostForm(posturl, url.Values{"customer": {customer}, "sign": {sign},"param": {paramjson}})
	if postErr != nil {
		c.Ctx.WriteString("查询失败,请至快递公司官网自行查询"+postErr.Error())
		c.StopRun()
	}
	defer resp.Body.Close()
	postBody, err := ioutil.ReadAll(postRes.Body)
	if err != nil {
		c.Ctx.WriteString("查询失败,请至快递公司官网自行查询"+err.Error())
		c.StopRun()
	}
	//解析JSON提取data部分(使用第三方simplejson包,go get github.com/bitly/go-simplejson)
	shippingDetail,_ := simplejson.NewJson(postBody)
	//data部分为json数组,通过simplejson的Get().Array()方法可以解析为map[string]interface{}解析结果下面贴图
	dataArray,_ := shippingDetail.Get("data").Array()
	c.Data["express"] = dataArray
	c.TplName = "order/shippingdetail.html"
}

以下为POST请求查询成功后json中data部分解析结果
在这里插入图片描述

然后贴出展示物流详情的页面代码:

<html>
<link rel="shortcut icon" href="https://cdn.kuaidi100.com/favicon.ico" />
<link rel="icon" type="image/gif" href="https://cdn.kuaidi100.com/images/favicon.gif" />
<link rel="stylesheet" href="https://cdn.kuaidi100.com/css/sz/base_v4.css?version=201807261600" />
<link rel="stylesheet" href="https://cdn.kuaidi100.com/css/sz/query_v4.css?version=201904031420" />
<link rel="stylesheet" href="https://cdn.kuaidi100.com/css/sz/index_v4.css?version=201908091530" />

<head></head>
<body>
<div class="result-wrap" style="width:580px">
    <div class="relative query-box" style="width:580px">
        <div class="result-top" id="resultTop" style="width:580px">
            <span class="col1">时间</span>
            <span class="col2">地点和跟踪进度</span>
        </div>
        <table class="result-info" style="width:580px">
            <tbody>
            {{range $k,$v := .express}}
            <tr class="{{if eq $k 0}}last{{else}}row1{{end}}">
                <td class="row1"><span class="time">{{$v.time}}</span>&nbsp;</td>
                <td class="status {{if eq $k 0}}status-check{{end}}">
                    <div class="col2">
                        <span class="step"><span class="line1"></span><span class="line2"></span></span>
                    </div></td>
                <td class="context" style="text-align: left;">{{$v.context}}</td>
            </tr>
            {{end}}
            </tbody>
        </table>
    </div>
</div>
</body>
</html>

最后看一下查询后的效果图
在这里插入图片描述

发布了29 篇原创文章 · 获赞 1 · 访问量 7824

猜你喜欢

转载自blog.csdn.net/qq_38280150/article/details/102718512