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的加密方式