201 lines
5.1 KiB
Go
201 lines
5.1 KiB
Go
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
|
||
}
|
||
|
||
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
|
||
}
|