JavaWeb企业级项目中接入顺丰官方API实现物流实时查询(亲测有效)

版权声明:本文为博主原创文章,未经博主允许不得转载! https://blog.csdn.net/MaNongXf/article/details/84102608

由于现在顺丰与快递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 !!!
 

猜你喜欢

转载自blog.csdn.net/MaNongXf/article/details/84102608