JavaWeb企业级项目中接入顺丰官方API实现物流实时查询(亲测有效)
由于现在顺丰与快递100闹掰了,所以使用快递一百已经查不到顺丰的物流信息了,包括快递鸟等,现在想要在项目中实现顺丰快递的物流查询只能用顺丰官方API来查询,然而这个官方的API并没有快递一百那些接口那么容易,需要很复杂的一套流程,并且顺丰用的返回形式都是XML文件,就需要设计到XML文件的修改与写入,想要接入顺丰API需要先下载顺丰的Java端的接口文档(里面包含了接口代码和jar包),然后导入到项目中,包括jar包!
注意:查询物流的路由信息需要先在丰桥上接入API并且申请一个月结卡号!接入成功后,通过Api只能查询月结卡号下的订单!
其他的订单会查不到!(虽然很复杂,但是没办法,顺丰查询只能这样啦)
(关于更多接口中的具体的参数请——点击查看)
首先看看顺丰API文档的里的结构
然后进入第一个文件夹
把这些都导入到项目中,java-demo中提供了查询的方法,并且顺丰官方提供一个测试账号,可以在main方法中使用测试账号查询测试订单,如果没有问题就进入后面的步骤!
(有的人导入后会发现
CallExpressServiceTools client = CallExpressServiceTools.getInstance()
方法报错,解决方法——点击查看
)
还有个要注意的地方就是,我把xml文件放在了项目中resources资源文件夹中,所以写路径的时候要注意点,具体的书写方式参考下面的代码~
下面就把我写的接口代码贡献出来~
package com.sixmac.platform.service.impl;
import com.sf.csim.express.service.CallExpressServiceTools;
import com.sixmac.platform.service.ShunFengService;
import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
import org.json.JSONObject;
import org.json.XML;
import org.springframework.stereotype.Service;
import java.io.*;
import java.util.List;
@Service
public class ShunFengServiceImpl implements ShunFengService {
//resources资源目录下 tomcat中对应的路径
String path = this.getClass().getClassLoader().getResource("./txt/shunfeng.xml").getPath();
/**
*
* @param num 传过来的运单号
* @return
* @throws IOException
* @throws DocumentException
*/
@Override
public String findShunFeng(String num) throws IOException, DocumentException {
String reqXml = "";
xmlUpdate(num);
try {
InputStream is = new FileInputStream(path);//路由查询-通过订单号
System.out.println();
byte[] bs = new byte[is.available()];
is.read(bs);
reqXml = new String(bs);
JSONObject xmlJSONObj = XML.toJSONObject(reqXml);
} catch (Exception e) {
}
//丰桥平台公共测试账号
//SLKJ2019
//FBIqMkZjzxbsZgo7jTpeq7PD8CVzLT4Q
String reqURL = "https://bsp-oisp.sf-express.com/bsp-oisp/sfexpressService";
String clientCode = "";//此处替换为您在丰桥平台获取的顾客编码
String checkword = "";//此处替换为您在丰桥平台获取的校验码
CallExpressServiceTools client = CallExpressServiceTools.getInstance();
String myReqXML = reqXml.replace("SLKJ2019", clientCode);//这里不需要改动
System.out.println("请求报文:" + myReqXML);
String respXml = client.callSfExpressServiceByCSIM(reqURL, myReqXML, clientCode, checkword);
if (respXml != null) {
System.out.println("---------------------------------------");
System.out.println("返回报文XML格式: " + respXml);
System.out.println("返回报文Json: " + XML.toJSONObject(respXml));
System.out.println("---------------------------------------");
}
JSONObject json = XML.toJSONObject(respXml);
String s = json.toString();
System.out.println(s);
return s;
}
/**
* 接收传过来的运单号,然后对路由查询的XML文件进行修改与写入
* @param num
* @throws DocumentException
* @throws IOException
*/
public void xmlUpdate(String num) throws DocumentException, IOException {
System.out.println(path);
/* 2.java修改xml */
// 创建SAXReader的对象
SAXReader sr = new SAXReader();
// 关联xml
Document document = sr.read(path);
// 获取根元素
Element root = document.getRootElement();
// 获取Body标签(不能直接获取Body下的RouteRequest标签)
Element b = root.element("Body");
System.out.println(b.getName());
System.out.println(b.getStringValue());
// b.addAttribute() 增加属性
//获取Body下的RouteRequest标签
Element req = b.element("RouteRequest");
//获取RouteRequest标签的tracking_number属性
Attribute number = req.attribute("tracking_number");
//设置tracking_number属性的值(修改XML文件中的订单号,改为需要查询的订单号)
number.setText(num);
System.out.println(number.getValue());
System.out.println("成功");
//----------到这里已经修改完成了,可以直接打印在控制显示,但是xml的实体并没有改变,如果想要改变实体文件内容,需要通过流写到xml文件中---------
// 创建输出流
Writer osWrite = new OutputStreamWriter( new FileOutputStream(path));
OutputFormat format = OutputFormat.createPrettyPrint(); // 获取输出的指定格式
format.setEncoding("UTF-8");// 设置编码 ,确保解析的xml为UTF-8格式
XMLWriter writer = new XMLWriter(osWrite, format);// XMLWriter
// 指定输出文件以及格式
writer.write(document);
// 把document写入xmlFile指定的文件(可以为被解析的文件或者新创建的文件)
writer.flush();
writer.close();
}
}
方法里的代码基本上就这么多,具体的参数自己对号入座就行!
最后附上一张查询成功后的图,返回的也是XML格式,但是可以转换成json格式~
The end !!!