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¶m={"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
|
|
|
|
|
}
|
2022-05-12 05:42:45 +00:00
|
|
|
|
|
|
|
|
|
func (m *KdClient) subscribePost(kdApi string, params *url.Values, resp interface{}) error {
|
|
|
|
|
//params.Set("customer", m.Customer)
|
|
|
|
|
uri := m.BaseURL + kdApi + params.Encode()
|
|
|
|
|
fmt.Println("uri:", uri)
|
|
|
|
|
|
|
|
|
|
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
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type SubscribeExpressStateResp struct {
|
|
|
|
|
Result bool `json:"result"`
|
|
|
|
|
ReturnCode string `json:"returnCode"`
|
|
|
|
|
Message string `json:"message"`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func SubscribeExpressState(expressCompanyNo, expressNum string) (*SubscribeExpressStateResp, error) {
|
|
|
|
|
resp := &SubscribeExpressStateResp{}
|
|
|
|
|
|
|
|
|
|
paramsMap := &map[string]interface{}{
|
|
|
|
|
"company": expressCompanyNo,
|
|
|
|
|
"number": expressNum,
|
|
|
|
|
"key": kdClient.AuthorizeKey,
|
|
|
|
|
"parameters": map[string]interface{}{
|
|
|
|
|
"callbackurl": "https://admin.deovo.com:9521/goadminapi/api/v1/express/state_push", // 正式环境
|
|
|
|
|
//"callbackurl": "https://dev.admin.deovo.com:9527/goadminapi/api/v1/express/state_push",// 测试环境
|
|
|
|
|
"salt": "FT1GHJ68798GJH3G",
|
|
|
|
|
"resultv2": 1,
|
|
|
|
|
},
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
paramsBytes, err := json.Marshal(paramsMap)
|
|
|
|
|
if err != nil {
|
|
|
|
|
logger.Error("err:", err)
|
|
|
|
|
return resp, err
|
|
|
|
|
}
|
|
|
|
|
params := &url.Values{}
|
|
|
|
|
params.Set("schema", "json")
|
|
|
|
|
params.Set("param", string(paramsBytes))
|
|
|
|
|
|
|
|
|
|
err = kdClient.subscribePost("/poll?", 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
|
|
|
|
|
}
|