mh_server/kuaidi/kuaidi100.go

134 lines
3.3 KiB
Go
Raw Normal View History

2021-06-30 02:12:05 +00:00
package kuaidi
import (
"crypto/md5"
"encoding/json"
"fmt"
"github.com/codinl/go-logger"
"io/ioutil"
"net/http"
"net/url"
"strings"
)
type KdClient struct {
UserId string
Secret string
Customer string
AuthorizeKey string
BaseURL string
}
var kdClient = &KdClient{
UserId: "a81ccda7168f4883ad5f0b0fe7e01f2c",
Secret: "33f57e255ad54e78b97ae3c32c81d522",
Customer: "B4F2CABA934E7EAD9D46C0DA2B50A689",
AuthorizeKey: "JFZNvHAW3992",
BaseURL: "https://poll.kuaidi100.com/",
}
// 实时快递查询接口 /poll/query.do
func ExpressInfo(expressCompany, expressNum string) (*ExpressInfoResp, error) {
resp := &ExpressInfoResp{}
//type param struct {
//
//}
//?customer=B4F2CABA934E7EAD9D46C0DA2B50A689&sign=2D8ADB6C424732F63F223C2665CAA1C1&param={"com":"emsbg","num":"9882823788521","from":"","phone":"",
//"to":"","resultv2":"0","show":"0","order":"desc"}
params := &url.Values{}
param, err := getParam(expressCompany, expressNum)
if err != nil {
logger.Error("err:", err)
return resp, err
}
kdSign := kdClient.getKdSign(param)
params.Set("sign", kdSign)
params.Set("param", param)
fmt.Println("param", param)
err = kdClient.post("/poll/query.do?", params, resp)
if err != nil {
logger.Info("err", err)
return resp, err
}
respJson, _ := json.MarshalIndent(resp, "", " ")
//respJson, _ := json.Marshal(resp)
fmt.Println("respJson:", string(respJson))
return resp, nil
}
type ExpressInfoResp struct {
Message string `json:"message"`
Nu string `json:"nu"`
Ischeck string `json:"ischeck"`
Condition string `json:"condition"`
Com string `json:"com"`
Status string `json:"status"`
State string `json:"state"`
Data []struct {
Time string `json:"time"`
Ftime string `json:"ftime"`
Context string `json:"context"`
} `json:"data"`
}
func (m *KdClient) post(kdApi string, params *url.Values, resp interface{}) error {
params.Set("customer", m.Customer)
uri := m.BaseURL + kdApi + params.Encode()
//data, err := json.Marshal(req)
//if err != nil {
// fmt.Println(err)
// return err
//}
res, err := http.Post(uri, "application/x-www-form-urlencoded", nil)
if err != nil {
fmt.Println(err)
return err
}
//res.Header.Set("Content-Type", "application/x-www-form-urlencoded")
defer res.Body.Close()
data, err := ioutil.ReadAll(res.Body)
if err != nil {
fmt.Println(err)
return err
}
if err = json.Unmarshal(data, resp); err != nil {
fmt.Println(err)
return err
}
return nil
}
func (m *KdClient) getKdSign(param string) string {
//签名, 用于验证身份, 按param + key + customer 的顺序进行MD5加密注意加密后字符串一定要转32位大写 不需要加上“+”号
par := param + m.AuthorizeKey + m.Customer
data := []byte(par)
has := md5.Sum(data)
md5str := fmt.Sprintf("%x", has) //将[]byte转成16进制
return strings.ToUpper(md5str)
}
func getParam(company, num string) (string, error) {
paramMap := map[string]interface{}{
//"com": "emsbg",
//"num": "9882823788521",
"com": company,
"num": num,
"from": "phone",
"to": "",
"resultv2": "0",
"show": "0",
"order": "desc",
}
paramMapJson, err := json.Marshal(paramMap)
if err != nil {
logger.Error("err:", err)
return "", err
}
return string(paramMapJson), nil
}