对接顺丰接口相关

今天做了下对接顺丰的接口,对接的是http的接口,这个没什么说的,主要记录下返回的xml格式数据,并解析

import java.io.ByteArrayInputStream;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.Node;
import org.dom4j.io.SAXReader;

import com.alibaba.fastjson.JSONObject;

/**
 * 顺丰类
 * 
 * @author admin
 *
 */
public class ShunFengService {
    // 对接接口,这里是开发环境
    private static final String url1 = "http://bsp-ois.sit.sf-express.com:9080/bsp-ois/sfexpressService";
    private static final String url2 = "https://bsp-ois.sit.sf-express.com:9443/bsp-ois/sfexpressService";
    // 对接秘钥
    private static final String checkword = "";

    /**
     * 请求顺丰接口汇总 :1下单2查询快递信息3查询费用
     * 
     * @param map
     * @param type
     * @return
     * @throws Exception
     */
    public static JSONObject sfExpressMethod(Map<String, String> map, int type) throws Exception {
        String xml = "";
        switch (type) {
        // 下订单
        case 1:
            xml = orderRequestXml(map);
            break;
        // 查询快递信息
        case 2:
            xml = queryRequestXml(map);
            break;
        // 查询快递费用
        case 3:
            xml = billRequestXml(map);
            break;
        default:
            break;
        }
        return getResultExpress(xml);
    }

    /**
     * 请求顺丰接口,处理xml格式的数据
     * 
     * @param xml
     * @return
     * @throws Exception
     */
    public static JSONObject getResultExpress(String xml) throws Exception {
        String code = xml + checkword;
        MessageDigest md5 = MessageDigest.getInstance("MD5");
        md5.update(code.getBytes("UTF-8"));
        String bs = new sun.misc.BASE64Encoder().encode(md5.digest());
        Map<String, String> map = new HashMap<String, String>();
        map.put("xml", xml);
        map.put("verifyCode", bs);
        String result = HttpClientUntil.doPost(url1, map);
        // 处理返回的xml格式的数据
        JSONObject obj = new JSONObject();
        SAXReader reader = new SAXReader();
        Document doc = reader.read(new ByteArrayInputStream(result.getBytes("UTF-8")));
        Node node = doc.selectSingleNode("//Response/Head");
        String res = node.getText();
        if ("ERR".equals(res)) {
            node = doc.selectSingleNode("//Response/ERROR");
            res = node.getText();
            obj.put("code", 400);
            obj.put("msg", res);
            return obj;
        }
        node = doc.selectSingleNode("//Response/Body");
        Element element = (Element) node;
        obj = treeWalk(element);
        return obj;
    }

    /**
     * 循环解析xml获取节点数据
     * 包括有jsonArray循环的
     * @param element
     * @param o
     * @return
     */
  

public static JSONObject treeWalk(Element element) {
        JSONObject obj = new JSONObject();
        List<Attribute> list = element.attributes();
        for (Attribute att : list) {
            obj.put(att.getName(), att.getValue());
        }
        Map<String, List<JSONObject>> subNodes = new HashMap();
        for (int i = 0, size = element.nodeCount(); i < size; i++) {
            Node node = element.node(i);
            String name = node.getName();
            Element el = (Element) node;

            if (node instanceof Element) {
                JSONObject newNode = treeWalk(el);
                List<JSONObject> _subNodes = subNodes.get(name);
                if (_subNodes == null) {
                    _subNodes = new ArrayList();
                    subNodes.put(name, _subNodes);
                }
                _subNodes.add(newNode);
            } else {
                obj.put(name, node.getText());
            }
        }

        for (String key : subNodes.keySet()) {
            List<JSONObject> _subNodes = subNodes.get(key);
            if (_subNodes.size() > 1) {
                JSONArray jsonArray = new JSONArray();
                for (JSONObject o : _subNodes) {
                    jsonArray.add(o);
                }
                obj.put(key, jsonArray);
            } else {
                obj.put(key, _subNodes.get(0));
            }
        }

        return obj;
    }

    /**
     * 查询快递信息xml
     * 
     * @param map
     * @return
     */
    public static String queryRequestXml(Map<String, String> map) {
        StringBuffer bf = new StringBuffer();
        bf.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        bf.append("<Request service=\"RouteService\" lang=\"zh-CN\">");
        bf.append("<Head>BSPdevelop</Head>");
        bf.append("<Body>");
        bf.append("tracking_type='1' method_type='1' ");
        bf.append("tracking_number='" + map.get("number") + "'/>");
        bf.append("</Body></Request>");
        return bf.toString();
    }

    /**
     * 订单费用xml
     * 
     * @param map
     * @return
     */
    public static String billRequestXml(Map<String, String> map) {
        StringBuffer bf = new StringBuffer();
        bf.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        bf.append("<Request service=\"QuerySFWaybillService\" lang=\"zh-CN\">");
        bf.append("<Head>BSPdevelop</Head>");
        bf.append("<Body>");
        bf.append("<Waybill type='" + map.get("type") + "' ");
        bf.append("waybillNo='" + map.get("waybillNo") + "' ");
        bf.append("orderId='" + map.get("orderId") + "'/>");
        bf.append("</Body></Request>");
        return bf.toString();
    }

    /**
     * 订单xml
     * 
     * @param map
     * @return
     */
    public static String orderRequestXml(Map<String, String> map) {
        StringBuffer bf = new StringBuffer();
        bf.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        bf.append("<Request service=\"OrderService\" lang=\"zh-CN\">");
        bf.append("<Head>BSPdevelop</Head>");
        bf.append("<Body>");
        bf.append("<Order orderid=\"" + map.get("orderId") + "\" ");
        bf.append("express_type='1' is_gen_bill_no='1' ");
        bf.append("j_province='" + map.get("jProvince") + "' ");
        bf.append("j_city='" + map.get("jCity") + "' ");
        bf.append("j_company='" + map.get("jCompany") + "' ");
        bf.append("j_contact='" + map.get("jContact") + "' ");
        bf.append("j_tel='" + map.get("jTel") + "' ");
        bf.append("j_address='" + map.get("jAddress") + "' ");

        bf.append("d_province='" + map.get("dProvince") + "' ");
        bf.append("d_city='" + map.get("dCity") + "' ");
        bf.append("d_company='" + map.get("dCompany") + "' ");
        bf.append("d_contact='" + map.get("dContact") + "' ");
        bf.append("d_tel='" + map.get("dTel") + "' ");
        bf.append("d_address='" + map.get("dAddress") + "' ");
        bf.append("custid='" + map.get("custId") + "' ");
        bf.append("parcel_quantity='1' pay_method='1' > ");
        bf.append("<Cargo name='文件' ></Cargo>");
        bf.append("</Order></Body></Request>");
        return bf.toString();
    }
}
 

顺丰返回的数据格式:


<?xml version="1.0" encoding="utf-8"?>

<Response service="OrderService">
  <Head>OK</Head>
  <Body>
    <OrderResponse filter_result="2" 
    destcode="571" 
    mailno="444070044141" 
    origincode="571"
     orderid="zhonghui-20190117001">
    <rls_info rls_errormsg="444070044141:" invoke_result="OK" rls_code="1000">
    <rls_detail waybillNo="444070044141" 
sourceCityCode="571" 
sourceDeptCode="571PB" 
sourceTeamCode="019" 
destCityCode="571" 
destDeptCode="571PB" 
destDeptCodeMapping="H12" 
destTeamCode="013" 
destRouteLabel="571PB-H12" 
proName="顺丰标快" 
cargoTypeCode="C201" 
limitTypeCode="T4"
 expressTypeCode="B1" 
codingMapping="6C" 
codingMappingOut="D2" 
xbFlag="0" 
printFlag="000000000" 
twoDimensionCode="MMM={'k1':'','k2':'571PB','k3':'013','k4':'T4','k5':'444070044141','k6':''}" 
proCode="T4" 
printIcon="00000000"/>
      </rls_info>
    </OrderResponse>
  </Body>
</Response>

 

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值