java中通物流api详解

2 篇文章 0 订阅
1 篇文章 0 订阅

前言:中通一共有2种类型的物流接口,分别是总对总、预约寄件接口。刚开始普通公司都是用我下面这套预约寄件接口的;只有等你寄件数量达到某一个数量就会有中通工作人员联系你切换物流接口,也就是让你用总对总的接口。

简介:本文共封装中通接口有【创建订单】、【预约寄件-订单取消】、【预约寄件-订单明细查询】、【获取订单轨迹】

中通api文档https://zop.zto.com/apiDoc/

下面是我封装的工具类和配置文件:

1.中通物流api工具类

package com.htcloud.xgsixteen.zto.util;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.nio.charset.Charset;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;
import java.util.ResourceBundle;
import java.util.stream.Collectors;

public class ZTOUtil {

    final static Logger logger = LoggerFactory.getLogger(ZTOUtil.class);

    public static  String company = null;
    public static  String companyProv = null;
    public static  String companyCity = null;
    public static  String companyCounty = null;
    public static  String companyAddress = null;
    /**
     * 初始化配置文件信息
     */
    public static ResourceBundle resourceBundle = null;
    static {
        resourceBundle =  ResourceBundle.getBundle("ztotest");//测试接口
//        resourceBundle =  ResourceBundle.getBundle("ztodev");//正式接口
        try {
        	//中文乱码处理
            company = new String(resourceBundle.getString("company").getBytes("ISO-8859-1"),"GBK");
            companyProv = new String(resourceBundle.getString("companyProv").getBytes("ISO-8859-1"),"GBK");
            companyCity = new String(resourceBundle.getString("companyCity").getBytes("ISO-8859-1"),"GBK");
            companyCounty = new String(resourceBundle.getString("companyCounty").getBytes("ISO-8859-1"),"GBK");
            companyAddress = new String(resourceBundle.getString("companyAddress").getBytes("ISO-8859-1"),"GBK");
        }catch (Exception e){
            logger.error(e.getMessage());
        }
    }
    public static  String companyId = resourceBundle.getString("companyId");
    public static  String key = resourceBundle.getString("key");
    public static  String createOrderUrl = resourceBundle.getString("createOrderUrl");
    public static  String cancelOrderUrl = resourceBundle.getString("cancelOrderUrl");
    public static  String getOrderDetailUrl = resourceBundle.getString("getOrderDetailUrl");
    public static  String getTraceInterfaceUrl = resourceBundle.getString("getTraceInterfaceUrl");
    public static  String typeUPDATE = resourceBundle.getString("type_UPDATE");
    public static  String type_SEARCHBYCODE = resourceBundle.getString("type_SEARCHBYCODE");
    public static  String typeNEW_TRACES = resourceBundle.getString("type_NEW_TRACES");
    public static  String companyPhone = resourceBundle.getString("companyPhone");


    /**
     * 中通物流-创建订单
     * @param map :请参考中通接口入参,有些是非必传的都不传就行了
     * @return
     * @throws Exception
     */
    public static String createOrder(Map<String,Object> map)throws Exception{
        Map<String, String> parameters = new HashMap<>();
        parameters.put("orderGroup",
                        "{\"partnerCode\":\""+map.get("orderId").toString()+"\"," +
                        "\"type\":1," +
                        "\"tradeId\":\""+map.get("orderNo")+"\"," +
                        "\"sender\":" +
                            "{" +
                                "\"id\":\""+map.get("sId")+"\"," +
                                "\"name\":\""+map.get("sName")+"\"," +
                                "\"company\":\""+map.get("sCompany")+"\"," +
                                "\"mobile\":\""+map.get("sMobile")+"\"," +
                                "\"prov\":\""+map.get("sProv")+"\"," +
                                "\"city\":\""+map.get("sCity")+"\"," +
                                "\"county\":\""+map.get("sCounty")+"\"," +
                                "\"address\":\""+map.get("sAddress")+"\"," +
                            "}," +
                        "\"receiver\":" +
                        "{" +
                            "\"name\":\""+map.get("rName")+"\"," +
                            "\"mobile\":\""+map.get("rMobile")+"\"," +
                            "\"prov\":\""+map.get("rProv")+"\"," +
                            "\"city\":\""+map.get("rCity")+"\"," +
                            "\"county\":\""+map.get("rCounty")+"\"," +
                            "\"address\":\""+map.get("rAddress")+"\"" +
                        "}}");
        String result =  ZTOUtil.sendUrl(parameters,createOrderUrl,key);
        return  result;
    }

    /**
     * 中通物流-预约寄件-订单取消
     * @param orderCodes :中通的订单号
     * @return
     * @throws Exception
     */
    public static String cancelOrder(String orderCodes)throws Exception{
        Map<String, String> parameters = new HashMap<>();
        parameters.put("data", "[{\"orderCode\":\""+orderCodes+"\",\"fieldName\":\"status\",\"fieldValue\":\"cancel\",\"reason\":\"客户取消订单\"}]");
        parameters.put("msg_type", typeUPDATE);
        parameters.put("company_id", companyId);
        String result =  ZTOUtil.sendUrl(parameters,cancelOrderUrl,key);
        return  result;
    }

    /**
     * 中通物流-预约寄件-订单明细查询(用来获取运单号,以便查询物流轨迹)
     * @param map
     * orderCode :中通的订单号
     * sendId : 配置文件内的companyId
     * @return
     * @throws Exception
     */
    public static String getOrderDetail(Map<String,Object> map)throws  Exception{
        Map<String, String> parameters = new HashMap<>();
        parameters.put("data", "{\"orderCode\":[\""+map.get("orderCode")+"\"],\"sendId\":\""+map.get("sendId")+"\"}");
        parameters.put("msg_type", type_SEARCHBYCODE);
        parameters.put("company_id", companyId);
        String result =  ZTOUtil.sendUrl(parameters,getOrderDetailUrl,key);
        return  result;
    }

    /**
     * 中通物流-获取订单轨迹
     * @param code :中通的运单号
     * @return
     * @throws Exception
     */
    public static String getTraceInterface(String code)throws Exception{
        Map<String, String> parameters = new HashMap<>();
        parameters.put("data", "[\""+code+"\"]");
        parameters.put("msg_type", typeNEW_TRACES);
        parameters.put("company_id", companyId);
        String result =  ZTOUtil.sendUrl(parameters,getTraceInterfaceUrl,key);
        return  result;
    }

    /**
     * 发送请求
     * @param parameters
     * @param Url
     * @param appKey
     * @return
     * @throws Exception
     */
    public static String sendUrl(Map<String, String> parameters,String Url,String appKey)throws Exception{
        String strToDigest = paramsToQueryString(parameters) + key;
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(strToDigest.getBytes(Charset.forName("UTF-8")));
        String dataDigest = Base64.getEncoder().encodeToString(md.digest());
//        System.out.println("============dataDigest:"+dataDigest);
        URL url = new URL(Url);//https://japi.zto.com/traceInterfaceNewTraces        http://58.40.16.122:8080/OpenOrderCreate
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("POST");
        con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=utf-8");
        con.setDoOutput(true);
        con.setConnectTimeout(5000);
        con.setReadTimeout(5000);
        con.setRequestProperty("x-datadigest", dataDigest);
        con.setRequestProperty("x-companyid", companyId);
        DataOutputStream out = new DataOutputStream(con.getOutputStream());
        out.write(paramsToQueryStringUrlencoded(parameters).getBytes(Charset.forName("UTF-8")));
        out.flush();
        out.close();
        BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()));
        String inputLine;
        StringBuffer content = new StringBuffer();
        while ((inputLine = in.readLine()) != null) {
            content.append(inputLine);
        }
        in.close();
        return  content.toString();
    }
    /**
     * 获取签名
     */
    public static String getDatadigest(Map<String, String> parameters)throws Exception{
        String strToDigest = paramsToQueryString(parameters) + key;
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(strToDigest.getBytes(Charset.forName("UTF-8")));
        String dataDigest = Base64.getEncoder().encodeToString(md.digest());
        return dataDigest;
    }
    public static String paramsToQueryString(Map<String, String> params) {
        return params.entrySet().stream().map(e -> e.getKey() + "=" + e.getValue()).collect(Collectors.joining("&"));
    }


    public static String paramsToQueryStringUrlencoded(Map<String, String> params) {
        return params.entrySet().stream().map(e -> {
            try {
                return e.getKey() + "=" + URLEncoder.encode(e.getValue(), "UTF-8");
            } catch (UnsupportedEncodingException e1) {
                return e.getValue();
            }
        }).collect(Collectors.joining("&"));
    }
}

2.中通物流properties配置文件

*放在resources目录下
	共俩个文件:
		测试(ztotest.properties):存放请求中通测试接口凭据
		正式(ztodev.properties):存放请求中通正式接口凭据

1、ztotest.properties

#合作商编码
companyId = kfpttestCode
#合作商key
key = kfpttestkey==
#中通物流-创建订单api
createOrderUrl = http://58.40.16.122:8080/OpenOrderCreate
#中通物流-取消订单api
cancelOrderUrl = http://58.40.16.122:8080/commonOrderUpdate
#中通物流-获取订单详情api
getOrderDetailUrl = http://58.40.16.122:8080/commonOrderSearchbycode
#中通物流-获取订单轨迹api
getTraceInterfaceUrl = http://58.40.16.122:8080/traceInterfaceNewTraces
#中通物流-取消订单api参数type
type_UPDATE = UPDATE
#中通物流-订单查询api参数type
type_SEARCHBYCODE = SEARCHBYCODE
#中通物流-获取订单轨迹api参数type
type_NEW_TRACES = NEW_TRACES

company = 腾讯科技(深圳)有限公司
companyPhone = 0755-8601****
companyProv = 广东省
companyCity = 深圳市
companyCounty = 南山
companyAddress = 深圳市南山区高新区科技中一路腾讯大厦35

2、ztodev.properties

#合作商编码
companyId = 你申请中通账号的companyId 
#合作商key
key = 你申请中通账号的key
#中通物流-创建订单api
createOrderUrl = http://japi.zto.cn/OpenOrderCreate
#中通物流-取消订单api
cancelOrderUrl = http://japi.zto.cn/commonOrderUpdate
#中通物流-获取订单详情api
getOrderDetailUrl = http://japi.zto.cn/commonOrderSearchbycode
#中通物流-获取订单轨迹api
getTraceInterfaceUrl = http://japi.zto.cn/traceInterfaceNewTraces
#中通物流-取消订单api参数type
type_UPDATE = UPDATE
#中通物流-订单查询api参数type
type_SEARCHBYCODE = SEARCHBYCODE
#中通物流-获取订单轨迹api参数type
type_NEW_TRACES = NEW_TRACES

company = 腾讯科技(深圳)有限公司
companyPhone = 0755-8601****
companyProv = 广东省
companyCity = 深圳市
companyCounty = 南山
companyAddress = 深圳市南山区高新区科技中一路腾讯大厦35

3.中通物流测试类

public class ZTtest {
    /**
     * 中通物流-创建订单
     * @return
     * @throws Exception
     */
    @Test
    public void createOrder()throws Exception{
        Map<String, String> parameters = new HashMap<>();
//        parameters.put("orderGroup", "{\"partnerCode\":\"130520142013234\",\"type\":1,\"tradeId\":\"2701843\",\"mailNo\":\"1000000000016\",\"sender\":{\"id\":\"130520142010\",\"name\":\"李琳\",\"company\":\"新南电子商务有限公司\",\"mobile\":\"13912345678\",\"phone\":\"021-87654321\",\"prov\":\"上海市\",\"city\":\"上海市\",\"county\":\"青浦区\",\"address\":\"华新镇华志路123号\",\"zipcode\":\"610012\"},\"receiver\":{\"id\":\"130520142097\",\"name\":\"杨逸嘉\",\"company\":\"逸嘉实业有限公司\",\"mobile\":\"13687654321\",\"phone\":\"010-22226789\",\"prov\":\"四川省\",\"city\":\"成都市\",\"county\":\"武侯区\",\"address\":\"育德路497号\",\"zipcode\":\"610012\"},\"items\":[{\"id\":\"1234567\",\"name\":\"迷你风扇\",\"category\":\"电子产品\",\"material\":\"金属\",\"size\":\"12,11,23\",\"weight\":\"1\",\"unitprice\":\"79\",\"quantity\":\"1\",\"remark\":\"黑色大号\"},{\"name\":\"USB3.0集线器\",\"quantity\":\"1\",\"remark\":\"\"}],\"starttime\":\"2013-05-20 12:00:00\",\"endtime\":\"2013-05-20 15:00:00\",\"weight\":753,\"size\":\"12,23,11\",\"quantity\":2,\"price\":12650,\"freight\":1000,\"premium\":50,\"packCharges\":100,\"otherCharges\":0,\"orderSum\":0,\"collectMoneytype\":\"CNY\",\"collectSum\":1200,\"remark\":\"请勿摔货\"}");
        parameters.put("orderGroup","{\n" +
                "    \"partnerCode\": \"123213\",\n" +
                "    \"type\": 1,\n" +
                "    \"tradeId\": \"12321321\",\n" +
                "    \"mailNo\": \"123213\",\n" +
                "    \"sender\": {\n" +
                "      \"id\": \"130520142010\",\n" +
                "      \"name\": \"李琳\",\n" +
                "      \"company\": \"新南电子商务有限公司\",\n" +
                "      \"mobile\": \"13912345678\",\n" +
                "      \"phone\": \"021-87654321\",\n" +
                "      \"prov\": \"上海市\",\n" +
                "      \"city\": \"上海市\",\n" +
                "      \"county\": \"青浦区\",\n" +
                "      \"address\": \"华新镇华志路123号\",\n" +
                "      \"zipcode\": \"610012\"\n" +
                "    },\n" +
                "    \"receiver\": {\n" +
                "      \"id\": \"130520142097\",\n" +
                "      \"name\": \"杨逸嘉\",\n" +
                "      \"company\": \"逸嘉实业有限公司\",\n" +
                "      \"mobile\": \"13687654321\",\n" +
                "      \"phone\": \"010-22226789\",\n" +
                "      \"prov\": \"四川省\",\n" +
                "      \"city\": \"成都市\",\n" +
                "      \"county\": \"武侯区\",\n" +
                "      \"address\": \"育德路497号\",\n" +
                "      \"zipcode\": \"610012\"\n" +
                "    }}");
        String url = "http://58.40.16.122:8080/OpenOrderCreate";
        String result =  ZTUtil.sendUrl(parameters,url,ZTUtil.key);
        System.out.println(result);
    }
    /**
     * 中通物流-预约寄件-订单取消
     * @return
     * @throws Exception
     */
    @Test
    public void cancelOrder()throws Exception{
        Map<String, String> parameters = new HashMap<>();
        parameters.put("data", "[{\"orderCode\":\"100000000001\",\"fieldName\":\"status\",\"fieldValue\":\"cancel\",\"reason\":\"客户取消订单\"},{\"orderCode\":\"100000000002\",\"fieldName\":\"status\",\"fieldValue\":\"cancel\",\"reason\":\"客户取消订单\"}]");
        parameters.put("msg_type", "UPDATE");
        parameters.put("company_id", ZTUtil.companyId);
        String url = "http://58.40.16.122:8080/commonOrderUpdate";
        String result =  ZTUtil.sendUrl(parameters,url,ZTUtil.key);
        System.out.println(result);
    }
    /**
     * 中通物流-预约寄件-订单明细查询
     * @return
     * @throws Exception
     */
    @Test
    public void getOrderDetail()throws  Exception{
        Map<String, String> parameters = new HashMap<>();
        parameters.put("data", "{\"orderCode\":[\"1234567\",\"123123123\",\"12312312312\"],\"sendId\":\"123456678\",\"partnerId\":\"123456678\"}");
        parameters.put("msg_type", "SEARCHBYCODE");
        parameters.put("company_id", ZTUtil.companyId);
        String url = "http://58.40.16.122:8080/commonOrderSearchbycode";
        String result =  ZTUtil.sendUrl(parameters,url,ZTUtil.key);
        System.out.println(result);
    }

    /**
     * 中通物流-获取订单轨迹
     * @return
     * @throws Exception
     */
    @Test
    public void getTraceInterface()throws Exception{
        Map<String, String> parameters = new HashMap<>();
        parameters.put("data", "[\"680000000000\"]");
        parameters.put("msg_type", "NEW_TRACES");
        parameters.put("company_id", ZTUtil.companyId);
        String url = "http://58.40.16.122:8080/traceInterfaceNewTraces";
        String result =  ZTUtil.sendUrl(parameters,url,ZTUtil.key);
        System.out.println(result);
    }
}
感觉观看,希望能帮到你(#^.^#)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值