golang 調用順豐API接口測試


golang 調用順豐API接口首先得去https://qiao.sf-express.com/pages/service/API.html這個網站申請注冊,拿到我的API接口如下圖所示

之后就可以按照文檔生成xml請求信息

為了方便快速搭建 golang 的結構粘貼如下

type Rquest struct {
	XMLName xml.Name `xml:"Request"`
	Service string   `xml:"service,attr"`
	Lang    string   `xml:"lang,attr"`
	Head    string   `xml:"Head"`
	Error   string   `xml:"ERROR"`
	Body    Body     `xml:"Body"`
}
type Body struct {
	SFOrder SFOrder `xml:"Order"`
}
type SFOrder struct {
	XMLName           xml.Name `xml:"Order"`
	OrderId           string   `xml:"orderid,attr"`
	ExpressType       string   `xml:"express_type,attr"`
	JProvince         string   `xml:"j_province,attr"`
	JCity             string   `xml:"j_city,attr"`
	JCounty           string   `xml:"j_county,attr"`
	JCompany          string   `xml:"j_company,attr"`
	JContact          string   `xml:"j_contact,attr"`
	JTel              string   `xml:"j_tel,attr"`
	JAddress          string   `xml:"j_address,attr"`
	DProvince         string   `xml:"d_province,attr"`
	DCity             string   `xml:"d_city,attr"`
	DCounty           string   `xml:"d_county,attr"`
	DCompany          string   `xml:"d_company,attr"`
	DContact          string   `xml:"d_contact,attr"`
	DTel              string   `xml:"d_tel,attr"`
	DAddress          string   `xml:"d_address,attr"`
	ParcelQuantity    string   `xml:"parcel_quantity,attr"`
	CargoTotalWeight  string   `xml:"cargo_total_weight,attr"`
	Custid            string   `xml:"custid,attr"`
	PayMethod         string   `xml:"pay_method,attr"`
	RoutelabelService string   `xml:"routelabelService,attr"`
	Cargo             Cargo
}
type Cargo struct {
	XMLName xml.Name `xml:"Cargo"`
	Name    string   `xml:"name,attr"`
}
type Response struct {
	XMLName xml.Name `xml:"Response"`
	Service string   `xml:"service,attr"`
	Lang    string   `xml:"lang,attr"`
	Head    string   `xml:"Head"`
	Error   string   `xml:"ERROR"`
	Body    RBody    `xml:"Body"`
}
type RBody struct {
	ResponseBody ResponseBody `xml:"OrderResponse"`
}
type ResponseBody struct {
	XMLName      xml.Name `xml:"OrderResponse"`
	FilterResult string   `xml:"filter_result,attr"`
	DestCode     string   `xml:"destcode,attr"`
	Mailno       string   `xml:"mailno,attr"`
	Origincode   string   `xml:"origincode,attr"`
	OrderId      string   `xml:"orderid,attr"`
	RlsInfo      RlsInfo  `xml:"rls_info"`
}
type RlsInfo struct {
	RlsErrormsg  string    `xml:"rls_errormsg,attr"`
	InvokeResult string    `xml:"invoke_result,attr"`
	RlsCode      string    `xml:"rls_code,attr"`
	RlsDetail    RlsDetail `xml:"rls_detail"`
}
type RlsDetail struct {
	WaybillNo           string `xml:"waybillNo,attr"`
	SourceTransferCode  string `xml:"sourceTransferCode,attr"`
	SourceCityCode      string `xml:"sourceCityCode,attr"`
	SourceDeptCode      string `xml:"sourceDeptCode,attr"`
	SourceTeamCode      string `xml:"sourceTeamCode,attr"`
	DestCityCode        string `xml:"destCityCode,attr"`
	DestDeptCode        string `xml:"destDeptCode,attr"`
	DestDeptCodeMapping string `xml:"destDeptCodeMapping,attr"`
	DestTeamCode        string `xml:"destTeamCode,attr"`
	DestTransferCode    string `xml:"destTransferCode,attr"`
	DestRouteLabel      string `xml:"destRouteLabel,attr"`
	ProName             string `xml:"proName,attr"`
	CargoTypeCode       string `xml:"cargoTypeCode,attr"`
	LimitTypeCode       string `xml:"limitTypeCode,attr"`
	ExpressTypeCode     string `xml:"expressTypeCode,attr"`
	CodingMapping       string `xml:"codingMapping,attr"`
	XbFlag              string `xml:"xbFlag,attr"`
	PrintFlag           string `xml:"printFlag,attr"`
	TwoDimensionCode    string `xml:"twoDimensionCode,attr"`
	ProCode             string `xml:"proCode,attr"`
	PrintIcon           string `xml:"printIcon,attr"`
}

 將數據結構轉換為xml格式化字符串代碼如下

        xmlorder, _ := xml.Marshal(sfOrder)
	str2 := string(xmlorder[:])

 根據文檔提示將信息加密,注意這邊是兩層加密方式

// str為xml code 為效驗碼
func md5V(str string, code string) string { md5Key := md5.New() md5Key.Write([]byte(fmt.Sprintf("%s%s", str, code))) xmlKey := base64.StdEncoding.EncodeToString(md5Key.Sum(nil)) return xmlKey }

之后調用http post請求傳入兩個參數分別為 xml 和 verifyCode

代碼如下

func HttpPost(xmls string) (err error, res model.Response) {
	checkwork := "rIGDqQhU5JbIVQ*******vjcivbg"
	urls := "http://bsp-oisp.sf-express.com/bsp-oisp/sfexpressService"
	stringMd5 := md5V(xmls, checkwork)
	responseData := model.Response{}
	resp, err := http.PostForm(urls, url.Values{"xml": {xmls}, "verifyCode": {stringMd5}})
	if err != nil {
		return err, responseData
	}

	defer resp.Body.Close()
	body, err := ioutil.ReadAll(resp.Body)
	err = xml.Unmarshal(body, &responseData)
	if err != nil {
		return err, responseData
	}
	return err, responseData
}

 主要的突出問題是:xml的轉化,xml與chekwork的加密方式


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM