直接贴控制器方法,关键部分在代码中注释标出
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> </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>
最后看一下查询后的效果图