1、丰桥接口调用返回的都是xml格式内容,要去封装一个对象映射返回结果。下面类就是映射对象:
import java.io.Serializable;
import java.util.List;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlValue;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Response")
public class SfExpressResponse implements Serializable{
private static final long serialVersionUID = 1L;
//响应状态
@XmlElement(name = "Head")
private String Head;
//响应失败原因
@XmlElement(name = "ERROR")
private ERROR ERROR;
//响应结果
@XmlElement(name = "Body")
private Body Body;
@XmlAccessorType(XmlAccessType.NONE)
public static class ERROR implements Serializable{
private static final long serialVersionUID = 1L;
@XmlAttribute(name = "code")
private String code;
@XmlValue
private String text;
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
@Override
public String toString() {
return "ERROR [code=" + code + ", text=" + text + "]";
}
}
@XmlAccessorType(XmlAccessType.NONE)
public static class Body implements Serializable{
private static final long serialVersionUID = 1L;
@XmlElement(name = "OrderResponse")
private OrderResponse OrderResponse;
@XmlElement(name = "RouteResponse")
private RouteResponse RouteResponse;
public SfExpressResponse.OrderResponse getOrderResponse() {
return OrderResponse;
}
public void setOrderResponse(SfExpressResponse.OrderResponse orderResponse) {
OrderResponse = orderResponse;
}
public SfExpressResponse.RouteResponse getRouteResponse() {
return RouteResponse;
}
public void setRouteResponse(SfExpressResponse.RouteResponse routeResponse) {
RouteResponse = routeResponse;
}
@Override
public String toString() {
return "Body [OrderResponse=" + OrderResponse + ", RouteResponse="
+ RouteResponse + "]";
}
}
@XmlRootElement(name="rls_info")
@XmlAccessorType(XmlAccessType.NONE)
public static class Rls_info implements Serializable{
private static final long serialVersionUID = 1L;
@XmlAttribute(name = "invoke_result")
private String invoke_result;
@XmlElement(name = "rls_detail")
private Rls_detail rls_detail;
public String getInvoke_result() {
return invoke_result;
}
public void setInvoke_result(String invoke_result) {
this.invoke_result = invoke_result;
}
public Rls_detail getRls_detail() {
return rls_detail;
}
public void setRls_detail(Rls_detail rls_detail) {
this.rls_detail = rls_detail;
}
}
@XmlRootElement(name="rls_detail")
@XmlAccessorType(XmlAccessType.NONE)
public static class Rls_detail implements Serializable{
private static final long serialVersionUID = 1L;
@XmlAttribute(name = "sourceTransferCode")
private String sourceTransferCode;
@XmlAttribute(name = "sourceCityCode")
private String sourceCityCode;
@XmlAttribute(name = "sourceDeptCode")
private String sourceDeptCode;
@XmlAttribute(name = "sourceTeamCode")
private String sourceTeamCode;
@XmlAttribute(name = "destCityCode")
private String destCityCode;
@XmlAttribute(name = "destDeptCode")
private String destDeptCode;
@XmlAttribute(name = "destDeptCodeMapping")
private String destDeptCodeMapping;
@XmlAttribute(name = "destTeamCode")
private String destTeamCode;
@XmlAttribute(name = "destTransferCode")
private String destTransferCode;
@XmlAttribute(name = "destRouteLabel")
private String destRouteLabel;
@XmlAttribute(name = "cargoTypeCode")
private String cargoTypeCode;
@XmlAttribute(name = "limitTypeCode")
private String limitTypeCode;
@XmlAttribute(name = "expressTypeCode")
private String expressTypeCode;
@XmlAttribute(name = "twoDimensionCode")
private String twoDimensionCode;
@XmlAttribute(name = "proCode")
private String proCode;
@XmlAttribute(name = "printIcon")
private String printIcon;
@XmlAttribute(name = "codingMapping")
private String codingMapping;
public String getCodingMapping() {
return codingMapping;
}
public void setCodingMapping(String codingMapping) {
this.codingMapping = codingMapping;
}
public String getPrintIcon() {
return printIcon;
}
public void setPrintIcon(String printIcon) {
this.printIcon = printIcon;
}
public String getDestDeptCodeMapping() {
return destDeptCodeMapping;
}
public void setDestDeptCodeMapping(String destDeptCodeMapping) {
this.destDeptCodeMapping = destDeptCodeMapping;
}
public String getDestTeamCode() {
return destTeamCode;
}
public void setDestTeamCode(String destTeamCode) {
this.destTeamCode = destTeamCode;
}
public String getDestTransferCode() {
return destTransferCode;
}
public void setDestTransferCode(String destTransferCode) {
this.destTransferCode = destTransferCode;
}
public String getSourceTransferCode() {
return sourceTransferCode;
}
public void setSourceTransferCode(String sourceTransferCode) {
this.sourceTransferCode = sourceTransferCode;
}
public String getSourceCityCode() {
return sourceCityCode;
}
public void setSourceCityCode(String sourceCityCode) {
this.sourceCityCode = sourceCityCode;
}
public String getSourceDeptCode() {
return sourceDeptCode;
}
public void setSourceDeptCode(String sourceDeptCode) {
this.sourceDeptCode = sourceDeptCode;
}
public String getSourceTeamCode() {
return sourceTeamCode;
}
public void setSourceTeamCode(String sourceTeamCode) {
this.sourceTeamCode = sourceTeamCode;
}
public String getDestCityCode() {
return destCityCode;
}
public void setDestCityCode(String destCityCode) {
this.destCityCode = destCityCode;
}
public String getDestDeptCode() {
return destDeptCode;
}
public void setDestDeptCode(String destDeptCode) {
this.destDeptCode = destDeptCode;
}
public String getDestRouteLabel() {
return destRouteLabel;
}
public void setDestRouteLabel(String destRouteLabel) {
this.destRouteLabel = destRouteLabel;
}
public String getCargoTypeCode() {
return cargoTypeCode;
}
public void setCargoTypeCode(String cargoTypeCode) {
this.cargoTypeCode = cargoTypeCode;
}
public String getLimitTypeCode() {
return limitTypeCode;
}
public void setLimitTypeCode(String limitTypeCode) {
this.limitTypeCode = limitTypeCode;
}
public String getExpressTypeCode() {
return expressTypeCode;
}
public void setExpressTypeCode(String expressTypeCode) {
this.expressTypeCode = expressTypeCode;
}
public String getTwoDimensionCode() {
return twoDimensionCode;
}
public void setTwoDimensionCode(String twoDimensionCode) {
this.twoDimensionCode = twoDimensionCode;
}
public String getProCode() {
return proCode;
}
public void setProCode(String proCode) {
this.proCode = proCode;
}
}
@XmlRootElement(name="OrderResponse")
@XmlAccessorType(XmlAccessType.NONE)
public static class OrderResponse implements Serializable{
private static final long serialVersionUID = 1L;
//订单号
@XmlAttribute(name = "orderid")
private String orderId;
//运单号
@XmlAttribute(name = "mailno")
private String mailNo;
//原寄地区域代码(可用于顺丰电子运单标签打印)
@XmlAttribute(name = "origincode")
private String originCode;
//目的地区域代码(可用于顺丰电子运单标签打印)
@XmlAttribute(name = "destcode")
private String destCode;
//筛单结果:1:人工确认 2:可收派 3:不可以收派
@XmlAttribute(name = "filter_result")
private String filterResult;
@XmlElement(name = "rls_info")
private Rls_info rls_info;
public Rls_info getRls_info() {
return rls_info;
}
public void setRls_info(Rls_info rls_info) {
this.rls_info = rls_info;
}
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getMailNo() {
return mailNo;
}
public void setMailNo(String mailNo) {
this.mailNo = mailNo;
}
public String getOriginCode() {
return originCode;
}
public void setOriginCode(String originCode) {
this.originCode = originCode;
}
public String getDestCode() {
return destCode;
}
public void setDestCode(String destCode) {
this.destCode = destCode;
}
public String getFilterResult() {
return filterResult;
}
public void setFilterResult(String filterResult) {
this.filterResult = filterResult;
}
@Override
public String toString() {
return "OrderResponse [orderId=" + orderId + ", mailNo=" + mailNo
+ ", originCode=" + originCode + ", destCode=" + destCode
+ ", filterResult=" + filterResult + "]";
}
}
@XmlRootElement(name="RouteResponse")
@XmlAccessorType(XmlAccessType.NONE)
public static class RouteResponse implements Serializable{
private static final long serialVersionUID = 1L;
//运单号
@XmlAttribute(name = "mailno")
private String mailNo;
//路由
@XmlElement(name = "Route")
private List<Route> Route ;
public String getMailNo() {
return mailNo;
}
public void setMailNo(String mailNo) {
this.mailNo = mailNo;
}
public List<SfExpressResponse.Route> getRoute() {
return Route;
}
public void setRoute(List<SfExpressResponse.Route> route) {
Route = route;
}
@Override
public String toString() {
return "RouteResponse [mailNo=" + mailNo + ", Route=" + Route + "]";
}
}
@XmlRootElement(name="Route")
@XmlAccessorType(XmlAccessType.NONE)
public static class Route implements Serializable{
private static final long serialVersionUID = 1L;
//路由节点发生的时间
@XmlAttribute(name = "accept_time")
private String acceptTime;
//路由节点具体描述
@XmlAttribute(name = "remark")
private String remark;
//路由节点操作码
@XmlAttribute(name = "opcode")
private String opcode;
public String getAcceptTime() {
return acceptTime;
}
public void setAcceptTime(String acceptTime) {
this.acceptTime = acceptTime;
}
public String getRemark() {
return remark;
}
public void setRemark(String remark) {
this.remark = remark;
}
public String getOpcode() {
return opcode;
}
public void setOpcode(String opcode) {
this.opcode = opcode;
}
}
public String getHead() {
return Head;
}
public void setHead(String head) {
Head = head;
}
public SfExpressResponse.ERROR getERROR() {
return ERROR;
}
public void setERROR(SfExpressResponse.ERROR ERROR) {
this.ERROR = ERROR;
}
public SfExpressResponse.Body getBody() {
return Body;
}
public void setBody(SfExpressResponse.Body body) {
Body = body;
}
@Override
public String toString() {
return "SfExpressResponse [Head=" + Head + ", ERROR=" + ERROR
+ ", Body=" + Body + "]";
}
}
有了上面的类还需要一个xml解析的工具类,为了清楚那个类是哪个包下面的,直接连import一起复制出来:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.StringReader;
import java.io.StringWriter;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import javax.xml.bind.Unmarshaller;
public class XmlUtils {
/**
* 将对象直接转换成String类型的 XML输出
*
* @param obj
* @return
*/
public static String convertToXml(Object obj) {
// 创建输出流
StringWriter sw = new StringWriter();
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
// 将对象转换成输出流形式的xml
marshaller.marshal(obj, sw);
} catch (JAXBException e) {
e.printStackTrace();
}
return sw.toString();
}
/**
* 将对象根据路径转换成xml文件
*
* @param obj
* @param path
* @return
*/
public static void convertToXml(Object obj, String path) {
try {
// 利用jdk中自带的转换类实现
JAXBContext context = JAXBContext.newInstance(obj.getClass());
Marshaller marshaller = context.createMarshaller();
// 格式化xml输出的格式
marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT,
Boolean.TRUE);
// 将对象转换成输出流形式的xml
// 创建输出流
FileWriter fw = null;
try {
fw = new FileWriter(path);
} catch (IOException e) {
e.printStackTrace();
}
marshaller.marshal(obj, fw);
} catch (JAXBException e) {
e.printStackTrace();
}
}
@SuppressWarnings("unchecked")
/**
* 将String类型的xml转换成对象
*/
public static Object convertXmlStrToObject(Class clazz, String xmlStr) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
// 进行将Xml转成对象的核心接口
Unmarshaller unmarshaller = context.createUnmarshaller();
StringReader sr = new StringReader(xmlStr);
xmlObject = unmarshaller.unmarshal(sr);
} catch (JAXBException e) {
e.printStackTrace();
}
return xmlObject;
}
@SuppressWarnings("unchecked")
/**
* 将file类型的xml转换成对象
*/
public static Object convertXmlFileToObject(Class clazz, String xmlPath) {
Object xmlObject = null;
try {
JAXBContext context = JAXBContext.newInstance(clazz);
Unmarshaller unmarshaller = context.createUnmarshaller();
FileReader fr = null;
try {
fr = new FileReader(xmlPath);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
xmlObject = unmarshaller.unmarshal(fr);
} catch (JAXBException e) {
e.printStackTrace();
}
return xmlObject;
}
}
再加一个顺丰接口实体类就完事了:
public class SfParam implements Serializable{
private static final long serialVersionUID = 1L;
private String orderNo; // 客户运单号 (不能重复)
private String mailNo; // 顺丰运单号
private String jiContact; // 寄件人
private String jiCompany; // 寄件人公司
private String jiTel; // 寄件人电话
private String jiAdress; // 寄件人地址
private String jiProvince; // 寄件人省份
private String jiCity; // 寄件人城市
private String jiCounty; // 寄件人区域
private String shouContact; // 收件人
private String shouCompany; // 收件人公司
private String shouTel; // 收件人电话
private String shouAdress; // 收件人地址
private String shouProvince; // 收件人省份
private String shouCity; // 收件人城市
private String shouCounty; // 收件人区域
private String orderSn; // 合同号
private Double invoiceMoney; // 开票金额
private String cargo; // 货物
private String cargoNum; // 货物 (数量/重量)
private String originCode; // 原寄地区域代码,可用于顺丰电子面单标签打印。
private String destCode; // 目的地区域代码,可用于顺丰电子面单标签打印。
private String destRouteLabel;
private String qRCode;
private Integer source; // 打印机所在地址
public Integer getSource() {
return source;
}
public void setSource(Integer source) {
this.source = source;
}
public String getOrderSn() {
return orderSn;
}
public void setOrderSn(String orderSn) {
this.orderSn = orderSn;
}
public Double getInvoiceMoney() {
return invoiceMoney;
}
public void setInvoiceMoney(Double invoiceMoney) {
this.invoiceMoney = invoiceMoney;
}
public String getqRCode() {
return qRCode;
}
public void setqRCode(String qRCode) {
this.qRCode = qRCode;
}
public String getDestRouteLabel() {
return destRouteLabel;
}
public void setDestRouteLabel(String destRouteLabel) {
this.destRouteLabel = destRouteLabel;
}
public Long getMemberId() {
return memberId;
}
public void setMemberId(Long memberId) {
this.memberId = memberId;
}
public String getOriginCode() {
return originCode;
}
public void setOriginCode(String originCode) {
this.originCode = originCode;
}
public String getDestCode() {
return destCode;
}
public void setDestCode(String destCode) {
this.destCode = destCode;
}
public String getMailNo() {
return mailNo;
}
public void setMailNo(String mailNo) {
this.mailNo = mailNo;
}
public String getOrderNo() {
return orderNo;
}
public void setOrderNo(String orderNo) {
this.orderNo = orderNo;
}
public String getJiContact() {
return jiContact;
}
public void setJiContact(String jiContact) {
this.jiContact = jiContact;
}
public String getJiCompany() {
return jiCompany;
}
public void setJiCompany(String jiCompany) {
this.jiCompany = jiCompany;
}
public String getJiTel() {
return jiTel;
}
public void setJiTel(String jiTel) {
this.jiTel = jiTel;
}
public String getJiAdress() {
return jiAdress;
}
public void setJiAdress(String jiAdress) {
this.jiAdress = jiAdress;
}
public String getJiProvince() {
return jiProvince;
}
public void setJiProvince(String jiProvince) {
this.jiProvince = jiProvince;
}
public String getJiCity() {
return jiCity;
}
public void setJiCity(String jiCity) {
this.jiCity = jiCity;
}
public String getJiCounty() {
return jiCounty;
}
public void setJiCounty(String jiCounty) {
this.jiCounty = jiCounty;
}
public String getShouContact() {
return shouContact;
}
public void setShouContact(String shouContact) {
this.shouContact = shouContact;
}
public String getShouCompany() {
return shouCompany;
}
public void setShouCompany(String shouCompany) {
this.shouCompany = shouCompany;
}
public String getShouTel() {
return shouTel;
}
public void setShouTel(String shouTel) {
this.shouTel = shouTel;
}
public String getShouAdress() {
return shouAdress;
}
public void setShouAdress(String shouAdress) {
this.shouAdress = shouAdress;
}
public String getShouProvince() {
return shouProvince;
}
public void setShouProvince(String shouProvince) {
this.shouProvince = shouProvince;
}
public String getShouCity() {
return shouCity;
}
public void setShouCity(String shouCity) {
this.shouCity = shouCity;
}
public String getShouCounty() {
return shouCounty;
}
public void setShouCounty(String shouCounty) {
this.shouCounty = shouCounty;
}
public String getCargo() {
return cargo;
}
public void setCargo(String cargo) {
this.cargo = cargo;
}
public String getCargoNum() {
return cargoNum;
}
public void setCargoNum(String cargoNum) {
this.cargoNum = cargoNum;
}
}
就这两个比较重要,有了上面两个工具类,顺丰接口就方便多了,看一下自己公司所用到的:
String path;
private static final Logger logger = Logger.getLogger(SFServiceIml.class);
private final String reqURL="https://bsp-oisp.sf-express.com/bsp-oisp/sfexpressService";
private final String clientCode="******";//此处替换为您在丰桥平台获取的顾客编码
private final String checkword="******";//此处替换为您在丰桥平台获取的校验码
private final String url ="******"; // 打印机地址
@Override
public SfExpressResponse sfExpressMethod(SfParam params,int type) {
// 请求文
String requestXml = "";
// 请求方法
String methodName = "";
if (type < 1) {
logger.warn("调用接口类型传错");
return null;
}
// 1 下单 2 查询...
if (type == 1) {
requestXml = getOrderServiceRequestXml(params);
methodName = "orderSerivce";
}
if (type == 2) {
requestXml = getOrderSearchServiceRequestXml(params);
methodName = "OrderSearchService";
}
String respXml= CallExpressServiceTools.callSfExpressServiceByCSIM(reqURL, requestXml, clientCode, checkword);
logger.info("顺丰接口请求:" + "方法:" + methodName + " 返回报文 :" + respXml);
SfExpressResponse response = (SfExpressResponse)XmlUtils.convertXmlStrToObject(SfExpressResponse.class, respXml);
return response;
}
/**
* 1 顺丰下单 xml报文
*/
private String getOrderServiceRequestXml(SfParam params){
//订单号
String orderNo = params.getOrderNo();
/*****************寄件方******************/
// 公司名称
String j_company = params.getJiCompany() == null ? "" : params.getJiCompany();
// 联系人
String j_contact = params.getJiContact();
// 手机号
String j_tel = params.getJiTel();
// 省份
String j_province = params.getJiProvince() == null ? "" : params.getJiProvince();
String j_city = params.getJiCity() == null ? "" : params.getJiCity();
String j_county = params.getJiCounty() == null ? "" : params.getJiCounty();
String j_address = params.getJiAdress();
/****************寄件方*******************/
/****************收件人*******************/
String d_contact = params.getShouContact();
//收件人公司
String d_company = params.getShouCompany() == null ? "" : params.getShouCompany();
//收件人电话
String d_tel = params.getShouTel();
//收件人详细地址
String d_province = params.getShouProvince() == null ? "" : params.getShouProvince();
String d_city = params.getShouCity() == null ? "" : params.getShouCity();
String d_county = params.getShouCounty() == null ? "" : params.getShouCounty();
String d_address = params.getShouAdress();
/****************收件人*******************/
//商品名称
String cargo = params.getCargo();
//商品数量
String cargoNum = params.getCargoNum();
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("<Request service='OrderService' lang='zh-CN'>");
strBuilder.append("<Head>" + clientCode + "</Head>");
strBuilder.append("<Body>");
strBuilder.append("<Order").append(" ");
strBuilder.append("orderid='" + orderNo.toString().trim() + "" + "'").append(" ");
//返回顺丰运单号
strBuilder.append("is_gen_bill_no='1'").append(" ");
//寄件方信息
strBuilder.append("j_company='" + j_company + "'").append(" ");
strBuilder.append("j_contact='" + j_contact + "'").append(" ");
strBuilder.append("j_tel='" + j_tel + "'").append(" ");
strBuilder.append("j_address='" + j_province+j_city+j_county+j_address + "'").append(" ");
//收件方信息
strBuilder.append("d_company='" + d_company + "'").append(" ");
strBuilder.append("d_contact='" + d_contact.toString().trim() + "'").append(" ");
strBuilder.append("d_tel='" + d_tel.toString().trim() + "'").append(" ");
strBuilder.append("d_address='" + d_province+d_city+d_county+d_address.toString().trim() + "'").append(" ");
strBuilder.append("pay_method='1'").append(" ");
strBuilder.append("routelabelService = '1' ");
strBuilder.append(" > ");
//货物信息
strBuilder.append("<Cargo").append(" ");
strBuilder.append("name='" + cargo + "'").append(" ");
strBuilder.append("count='" + cargoNum.toString() + "'").append(" ");
strBuilder.append(">");
strBuilder.append("</Cargo>");
strBuilder.append("</Order>");
strBuilder.append("</Body>");
strBuilder.append("</Request>");
return strBuilder.toString();
}
/**
* 2 顺丰查询报文
*/
private String getOrderSearchServiceRequestXml(SfParam params){
String orderNo =params.getOrderNo();
StringBuilder strBuilder = new StringBuilder();
strBuilder.append("<Request service='OrderSearchService' lang='zh-CN'>");
strBuilder.append("<Head>" + clientCode + "</Head>");
strBuilder.append("<Body>");
strBuilder.append("<OrderSearch").append(" ");
strBuilder.append("orderid='" + orderNo.toString().trim() + "" + "'").append(" > ");
strBuilder.append("</OrderSearch>");
strBuilder.append("</Body>");
strBuilder.append("</Request>");
return strBuilder.toString();
}
需要用到丰桥接口的小伙伴直接可以拿去使用。