mh_server/kdapisearch/kd_api_search.go

135 lines
4.1 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package kdapisearch
import (
"crypto/md5"
"encoding/base64"
"fmt"
"io"
"io/ioutil"
"net/http"
"strings"
)
/**
* @技术QQ群: 可登录官网https://www.kdniao.com/右侧查看技术群号
* @see: https://kdniao.com/api-track
* @copyright: 深圳市快金数据技术服务有限公司
* ID和Key请到官网申请https://kdniao.com/reg
* 即时查询接口
* 此接口用于向快递公司实时查询物流轨迹信息。该功能支持情况需查看技术文档。
* 正式地址https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx
*
*
* 系统级参数
* RequestData String R 请求内容为JSON格式 详情可参考接口技术文档https://www.kdniao.com/documents
* EBusinessID String R 用户ID
* RequestType String R 请求接口指令
* DataSign String R 数据内容签名,加密方法为:把(请求内容(未编码)+ApiKey)进行MD5加密--32位小写然后Base64编码最后进行URL(utf-8)编码
* DataType String R DataType=2请求、返回数据类型均为JSON格式
* 应用级参数
* R-必填RequiredO-可选OptionalC-报文中该参数在一定条件下可选Conditional
* OrderCode String(30) O 订单编号
* ShipperCode String(10) R 快递公司编码 详细编码参考《快递鸟接口支持快递公司编码.xlsx》 https://www.kdniao.com/documents
* LogisticCode String(30) R 快递单号
* CustomerName String(50) C ShipperCode为SF时必填对应寄件人/收件人手机号后四位ShipperCode为其他快递时可不填或保留字段不可传值
* 请求示例
* ZTO请求示例
* {
* "OrderCode": "",
* "ShipperCode": "ZTO",
* "LogisticCode": "638650888018",
* }
*
* JD请求示例
* {
* "OrderCode": "",
* "CustomerName": "",
* "ShipperCode": "JD",
* "LogisticCode": "JDVA00003618100",
* }
*
* SF请求示例
* {
* "OrderCode": "",
* "CustomerName": "1234",
* "ShipperCode": "SF",
* "LogisticCode": "SF00003618100",
* }
*/
// 请求url --正式地址
const Url string = "https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx"
// 用户ID快递鸟提供注意保管不要泄漏
const EBusinessID string = "1237100" //即用户ID登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
// API key快递鸟提供注意保管不要泄漏
const ApiKey string = "56da2cf8-c8a2-44b2-b6fa-476cd7d1ba17" //即API key登录快递鸟官网会员中心获取 https://www.kdniao.com/UserCenter/v4/UserHome.aspx
func main() {
getResult()
}
func getResult() {
//以form表单形式提交post请求post请求体中包含了应用级参数和系统级参数
result := post(Url, getParams())
fmt.Println(result)
} //输出结果
func getParams() (v map[string]string) {
//请求接口指令
const RequestType string = "1002" //免费即时查询接口指令1002/在途监控即时查询接口指令8001/地图版即时查询接口指令8003
// 组装应用级参数
const RequestData string = "{" +
"'CustomerName': ''," +
"'OrderCode': ''," +
"'ShipperCode': 'YTO'," +
"'LogisticCode': 'YT00003618100'," +
"}"
var DataSign string = getSign(RequestData)
// 组装系统级参数
v = map[string]string{
"RequestType": RequestType,
"EBusinessID": EBusinessID,
"DataType": "2",
"RequestData": RequestData,
"DataSign": DataSign,
}
return v
}
func base64Encode(src []byte) []byte {
return []byte(base64.StdEncoding.EncodeToString(src))
}
func getSign(n string) (data string) {
str := n + ApiKey
w := md5.New()
io.WriteString(w, str)
md5str := fmt.Sprintf("%x", w.Sum(nil))
debyte := base64Encode([]byte(md5str))
data = fmt.Sprintf("%s", debyte)
return data
} //签名
func post(url string, params map[string]string) string {
var values []string
for k, v := range params {
values = append(values, fmt.Sprintf("%s=%s", k, v))
}
resp, err := http.Post(url, "application/x-www-form-urlencoded", strings.NewReader(strings.Join(values, "&")))
if err != nil || resp.StatusCode != 200 {
fmt.Println(err.Error())
}
contentBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
fmt.Println(err.Error())
}
return string(contentBytes)
}