zoukankan      html  css  js  c++  java
  • 快递物流查询接口介绍

    快递查询接口是指快递查询网对外开放的应用程序接口,开发人员能够通过调用该接口与快递查询网进行交互,并基于该接口开发自己的快递查询应用程序。目前比较常用的接口有快递鸟、快递100、快递网等。

    应用场景

            电商网站用户打开“我的订单”时调用此API显示物流信息详情;或者是电商管理后台的物流系统,客服在对账前查询所有运单的签收状态,并追踪问题。

    快递查询接口分类

            物流轨迹查询接口有即时查询和订阅查询两种,即时是请求即返回数据,订阅则是订阅快递单号到接口,有物流轨迹更新则全量返回数据。

            快递鸟即时接口可以查询3000次,3000以上接订阅接口,统一接口模式接入,常用快递均支持查询,还有订阅接口、在线下单接口、电子面单接口,接口均不收取费用,        没有要求用户添加外链,支持418家国内外快递物流查询。

            快递100每天可以免费查询2000次,超过2000次收费,每次0.06~0.1元不等,如果查询的量大的话可以降低费用,免费的接口有几家常用快递不支持接口模式,只支持   htmlAPI,要求用户添加外链,支持300多家国内外快递物流查询。

            快递网每天可以免费查询500次,超过500次收费,每次0.05元,只有即时查询和订阅推送接口,要求用户添加外链,支持395家国内外快递物流查询。

    对接说明

             不同公司的快递查询接口接入类似,都需要注册http://www.kdniao.com/ServiceApply.aspx ,申请账号获取KEY和ID,如果是订阅接口需要技术联调。以快递鸟及时查询接口接入为例。

          根据快递单号和快递公司编码查询物流轨迹信息。接口需要指定快递单号的快递公司编码,格式不对或则编码错误都会返失败的信息。如:EMS物流单号应选择快递公司编码(EMS)查看快递公司编码返回的物流跟踪信息按照发生的时间升序排列。

            接口支持的消息接收方式为HTTP POST

            请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"

            API地址:http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx

    请求系统级参数

    参数名称类型说明必须要求
    RequestData String 请求内容需进行URL(utf-8)编码。请求内容JSON或XML格式,须和DataType一致。 R
    EBusinessID String 商户ID,请在我的服务页面查看。 R
    RequestType String 请求指令类型:1002 R
    DataSign String 数据内容签名:把(请求内容(未编码)+AppKey)进行MD5加密,然后Base64编码,最后进行URL(utf-8)编码。详细过程请查看Demo。 R
    DataType String 请求、返回数据类型:1-xml,2-json;默认为xml格式 O

    请求内容字段定义

    参数类型说明必须要求
    OrderCode String 订单编号 O
    ShipperCode String 快递公司编码 R
    LogisticCode String 物流单号 R

    返回参数定义

    参数名称类型说明必须要求
    EBusinessID String 用户ID R
    OrderCode String 订单编号 O
    ShipperCode String 快递公司编码 R
    LogisticCode String 物流运单号 R
    Success Bool 成功与否 R
    Reason String 失败原因 O
    State String 物流状态:2-在途中,3-签收,4-问题件 R
    Traces
    Trace AcceptTime String 时间 R
    AcceptStation String 描述 R
    Remark String 备注 O

    Java调用示例

      1.  
        import java.io.BufferedReader;
      2.  
        import java.io.IOException;
      3.  
        import java.io.InputStreamReader;
      4.  
        import
      5.  
         
      6.  
        java.io.OutputStreamWriter;
      7.  
        import
      8.  
         
      9.  
        java.io.UnsupportedEncodingExcept
      10.  
         
      11.  
        ion;
      12.  
        import
      13.  
         
      14.  
        java.net.HttpURLConnection;
      15.  
        import java.net.URL;
      16.  
        import java.net.URLEncoder;
      17.  
        import
      18.  
         
      19.  
        java.security.MessageDigest;
      20.  
        import java.util.HashMap;
      21.  
        import java.util.Map;
      22.  
         
      23.  
        /**
      24.  
        *
      25.  
        * 快递鸟物流轨迹即时查询接口
      26.  
        *
      27.  
        * @技术QQ群: 456320272
      28.  
        * @see:
      29.  
         
      30.  
        http://www.kdniao.com/YundanChaxu
      31.  
         
      32.  
        nAPI.aspx
      33.  
        * @copyright: 深圳市快金数据技术
      34.  
         
      35.  
        服务有限公司
      36.  
        *
      37.  
        * DEMO中的电商ID与私钥仅限测试使
      38.  
         
      39.  
        用,正式环境请单独注册账号
      40.  
        * 单日超过500单查询量,建议接入
      41.  
         
      42.  
        我方物流轨迹订阅推送接口
      43.  
        *
      44.  
        * ID和Key请到官网申请:
      45.  
         
      46.  
        http://www.kdniao.com/ServiceAppl
      47.  
         
      48.  
        y.aspx
      49.  
        */
      50.  
         
      51.  
        public class KdniaoTrackQueryAPI
      52.  
         
      53.  
        {
      54.  
         
      55.  
        //DEMO
      56.  
        public static void main
      57.  
         
      58.  
        (String[] args) {
      59.  
         
      60.  
         
      61.  
        KdniaoTrackQueryAPI api = new
      62.  
         
      63.  
        KdniaoTrackQueryAPI();
      64.  
        try {
      65.  
        String
      66.  
         
      67.  
        result =
      68.  
         
      69.  
        api.getOrderTracesByJson("ANE",
      70.  
         
      71.  
        "210001633605");
      72.  
         
      73.  
         
      74.  
        System.out.print(result);
      75.  
         
      76.  
        } catch
      77.  
         
      78.  
        (Exception e) {
      79.  
         
      80.  
         
      81.  
        e.printStackTrace();
      82.  
        }
      83.  
        }
      84.  
         
      85.  
        //电商ID
      86.  
        private String
      87.  
         
      88.  
        EBusinessID="请到快递鸟官网申请
      89.  
         
      90.  
        http://www.kdniao.com/ServiceAppl
      91.  
         
      92.  
        y.aspx";
      93.  
        //电商加密私钥,快递鸟提
      94.  
         
      95.  
        供,注意保管,不要泄漏
      96.  
        private String AppKey="请
      97.  
         
      98.  
        到快递鸟官网申请
      99.  
         
      100.  
        http://www.kdniao.com/ServiceAppl
      101.  
         
      102.  
        y.aspx";
      103.  
        //请求url
      104.  
        private String
      105.  
         
      106.  
        ReqURL="http://api.kdniao.cc/Ebus
      107.  
         
      108.  
        iness/EbusinessOrderHandle.aspx";
      109.  
         
      110.  
        /**
      111.  
        * Json方式 查询订单物流轨迹
      112.  
        * @throws Exception
      113.  
        */
      114.  
        public String
      115.  
         
      116.  
        getOrderTracesByJson(String
      117.  
         
      118.  
        expCode, String expNo) throws
      119.  
         
      120.  
        Exception{
      121.  
        String
      122.  
         
      123.  
        requestData=
      124.  
         
      125.  
        "{'OrderCode':'','ShipperCode':'"
      126.  
         
      127.  
        + expCode + "','LogisticCode':'"
      128.  
         
      129.  
        + expNo + "'}";
      130.  
         
      131.  
        Map<String,
      132.  
         
      133.  
        String> params = new
      134.  
         
      135.  
        HashMap<String, String>();
      136.  
        params.put
      137.  
         
      138.  
        ("RequestData", urlEncoder
      139.  
         
      140.  
        (requestData, "UTF-8"));
      141.  
        params.put
      142.  
         
      143.  
        ("EBusinessID", EBusinessID);
      144.  
        params.put
      145.  
         
      146.  
        ("RequestType", "1002");
      147.  
        String
      148.  
         
      149.  
        dataSign=encrypt(requestData,
      150.  
         
      151.  
        AppKey, "UTF-8");
      152.  
        params.put
      153.  
         
      154.  
        ("DataSign", urlEncoder(dataSign,
      155.  
         
      156.  
        "UTF-8"));
      157.  
        params.put
      158.  
         
      159.  
        ("DataType", "2");
      160.  
         
      161.  
        String
      162.  
         
      163.  
        result=sendPost(ReqURL, params);
      164.  
         
      165.  
        //根据公司业务处
      166.  
         
      167.  
        理返回的信息......
      168.  
         
      169.  
        return result;
      170.  
        }
      171.  
         
      172.  
        /**
      173.  
        * XML方式 查询订单物流轨迹
      174.  
        * @throws Exception
      175.  
        */
      176.  
        public String
      177.  
         
      178.  
        getOrderTracesByXml() throws
      179.  
         
      180.  
        Exception{
      181.  
        String
      182.  
         
      183.  
        requestData= "<?xml version=
      184.  
         
      185.  
        "1.0" encoding="utf-8" ?>"+
      186.  
         
      187.  
         
      188.  
        "<Content>"+
      189.  
         
      190.  
         
      191.  
         
      192.  
         
      193.  
        "<OrderCode></OrderCode>"+
      194.  
         
      195.  
         
      196.  
         
      197.  
         
      198.  
        "<ShipperCode>SF</ShipperCode>"+
      199.  
         
      200.  
         
      201.  
         
      202.  
         
      203.  
        "<LogisticCode>589707398027</Logi
      204.  
         
      205.  
        sticCode>"+
      206.  
         
      207.  
         
      208.  
        "</Content>";
      209.  
         
      210.  
        Map<String,
      211.  
         
      212.  
        String> params = new
      213.  
         
      214.  
        HashMap<String, String>();
      215.  
        params.put
      216.  
         
      217.  
        ("RequestData", urlEncoder
      218.  
         
      219.  
        (requestData, "UTF-8"));
      220.  
        params.put
      221.  
         
      222.  
        ("EBusinessID", EBusinessID);
      223.  
        params.put
      224.  
         
      225.  
        ("RequestType", "1002");
      226.  
        String
      227.  
         
      228.  
        dataSign=encrypt(requestData,
      229.  
         
      230.  
        AppKey, "UTF-8");
      231.  
        params.put
      232.  
         
      233.  
        ("DataSign", urlEncoder(dataSign,
      234.  
         
      235.  
        "UTF-8"));
      236.  
        params.put
      237.  
         
      238.  
        ("DataType", "1");
      239.  
         
      240.  
        String
      241.  
         
      242.  
        result=sendPost(ReqURL, params);
      243.  
         
      244.  
        //根据公司业务处
      245.  
         
      246.  
        理返回的信息......
      247.  
         
      248.  
        return result;
      249.  
        }
      250.  
         
      251.  
        /**
      252.  
        * MD5加密
      253.  
        * @param str 内容
      254.  
        * @param charset 编码方式
      255.  
        * @throws Exception
      256.  
        */
      257.  
        @SuppressWarnings
      258.  
         
      259.  
        ("unused")
      260.  
        private String MD5(String
      261.  
         
      262.  
        str, String charset) throws
      263.  
         
      264.  
        Exception {
      265.  
        MessageDigest md =
      266.  
         
      267.  
        MessageDigest.getInstance("MD5");
      268.  
        md.update
      269.  
         
      270.  
        (str.getBytes(charset));
      271.  
        byte[] result =
      272.  
         
      273.  
        md.digest();
      274.  
        StringBuffer sb = new
      275.  
         
      276.  
        StringBuffer(32);
      277.  
        for (int i = 0; i <
      278.  
         
      279.  
        result.length; i++) {
      280.  
        int val = result
      281.  
         
      282.  
        [i] & 0xff;
      283.  
        if (val <= 0xf) {
      284.  
        sb.append
      285.  
         
      286.  
        ("0");
      287.  
        }
      288.  
        sb.append
      289.  
         
      290.  
        (Integer.toHexString(val));
      291.  
        }
      292.  
        return sb.toString
      293.  
         
      294.  
        ().toLowerCase();
      295.  
        }
      296.  
         
      297.  
        /**
      298.  
        * base64编码
      299.  
        * @param str 内容
      300.  
        * @param charset 编码方式
      301.  
        * @throws
      302.  
         
      303.  
        UnsupportedEncodingException
      304.  
        */
      305.  
        private String base64
      306.  
         
      307.  
        (String str, String charset)
      308.  
         
      309.  
        throws
      310.  
         
      311.  
        UnsupportedEncodingException{
      312.  
        String encoded =
      313.  
         
      314.  
        base64Encode(str.getBytes
      315.  
         
      316.  
        (charset));
      317.  
        return encoded;
      318.  
         
      319.  
         
      320.  
        }
      321.  
         
      322.  
        @SuppressWarnings
      323.  
         
      324.  
        ("unused")
      325.  
        private String
      326.  
         
      327.  
        urlEncoder(String str, String
      328.  
         
      329.  
        charset) throws
      330.  
         
      331.  
        UnsupportedEncodingException{
      332.  
        String result =
      333.  
         
      334.  
        URLEncoder.encode(str, charset);
      335.  
        return result;
      336.  
        }
      337.  
         
      338.  
        /**
      339.  
        * 电商Sign签名生成
      340.  
        * @param content 内容
      341.  
        * @param keyValue Appkey
      342.  
        * @param charset 编码方式
      343.  
        * @throws
      344.  
         
      345.  
        UnsupportedEncodingException
      346.  
         
      347.  
        ,Exception
      348.  
        * @return DataSign签名
      349.  
        */
      350.  
        @SuppressWarnings
      351.  
         
      352.  
        ("unused")
      353.  
        private String encrypt
      354.  
         
      355.  
        (String content, String keyValue,
      356.  
         
      357.  
        String charset) throws
      358.  
         
      359.  
        UnsupportedEncodingException,
      360.  
         
      361.  
        Exception
      362.  
        {
      363.  
        if (keyValue !=
      364.  
         
      365.  
        null)
      366.  
        {
      367.  
        return
      368.  
         
      369.  
        base64(MD5(content + keyValue,
      370.  
         
      371.  
        charset), charset);
      372.  
        }
      373.  
        return base64
      374.  
         
      375.  
        (MD5(content, charset), charset);
      376.  
        }
      377.  
         
      378.  
        /**
      379.  
        * 向指定 URL 发送POST方法的
      380.  
         
      381.  
        请求
      382.  
        * @param url 发送请求的 URL
      383.  
         
      384.  
         
      385.  
        * @param params 请求的参数集
      386.  
         
      387.  
      388.  
        * @return 远程资源的响应结果
      389.  
        */
      390.  
        @SuppressWarnings
      391.  
         
      392.  
        ("unused")
      393.  
        private String sendPost
      394.  
         
      395.  
        (String url, Map<String, String>
      396.  
         
      397.  
        params) {
      398.  
        OutputStreamWriter out =
      399.  
         
      400.  
        null;
      401.  
        BufferedReader in = null;
      402.  
         
      403.  
         
      404.  
        StringBuilder result =
      405.  
         
      406.  
        new StringBuilder();
      407.  
        try {
      408.  
        URL realUrl = new
      409.  
         
      410.  
        URL(url);
      411.  
        HttpURLConnection
      412.  
         
      413.  
        conn =(HttpURLConnection)
      414.  
         
      415.  
        realUrl.openConnection();
      416.  
        // 发送POST请求必须设
      417.  
         
      418.  
        置如下两行
      419.  
        conn.setDoOutput
      420.  
         
      421.  
        (true);
      422.  
        conn.setDoInput
      423.  
         
      424.  
        (true);
      425.  
        // POST方法
      426.  
         
      427.  
         
      428.  
        conn.setRequestMethod("POST");
      429.  
        // 设置通用的请求属性
      430.  
         
      431.  
         
      432.  
        conn.setRequestProperty("accept",
      433.  
         
      434.  
        "*/*");
      435.  
         
      436.  
         
      437.  
        conn.setRequestProperty
      438.  
         
      439.  
        ("connection", "Keep-Alive");
      440.  
         
      441.  
         
      442.  
        conn.setRequestProperty("user-
      443.  
         
      444.  
        agent",
      445.  
        "Mozilla/4.0
      446.  
         
      447.  
        (compatible; MSIE 6.0; Windows NT
      448.  
         
      449.  
        5.1;SV1)");
      450.  
         
      451.  
         
      452.  
        conn.setRequestProperty
      453.  
         
      454.  
        ("Content-Type", "application/x-
      455.  
         
      456.  
        www-form-urlencoded");
      457.  
        conn.connect();
      458.  
        // 获取URLConnection
      459.  
         
      460.  
        对象对应的输出流
      461.  
        out = new
      462.  
         
      463.  
        OutputStreamWriter
      464.  
         
      465.  
        (conn.getOutputStream(), "UTF-
      466.  
         
      467.  
        8");
      468.  
        // 发送请求参数
      469.  
         
      470.  
         
      471.  
        if (params != null) {
      472.  
         
      473.  
         
      474.  
        StringBuilder param = new
      475.  
         
      476.  
        StringBuilder();
      477.  
        for
      478.  
         
      479.  
        (Map.Entry<String, String> entry
      480.  
         
      481.  
        : params.entrySet()) {
      482.  
         
      483.  
         
      484.  
        if(param.length()>0){
      485.  
         
      486.  
         
      487.  
        param.append("&");
      488.  
         
      489.  
         
      490.  
        }
      491.  
         
      492.  
         
      493.  
        param.append(entry.getKey());
      494.  
         
      495.  
         
      496.  
        param.append("=");
      497.  
         
      498.  
         
      499.  
        param.append(entry.getValue());
      500.  
         
      501.  
         
      502.  
         
      503.  
         
      504.  
        //System.out.println
      505.  
         
      506.  
        (entry.getKey
      507.  
         
      508.  
        ()+":"+entry.getValue());
      509.  
        }
      510.  
         
      511.  
         
      512.  
        //System.out.println
      513.  
         
      514.  
        ("param:"+param.toString());
      515.  
         
      516.  
         
      517.  
        out.write(param.toString());
      518.  
        }
      519.  
        // flush输出流的缓冲
      520.  
        out.flush();
      521.  
        // 定义BufferedReader
      522.  
         
      523.  
        输入流来读取URL的响应
      524.  
        in = new
      525.  
         
      526.  
        BufferedReader(
      527.  
        new
      528.  
         
      529.  
        InputStreamReader
      530.  
         
      531.  
        (conn.getInputStream(), "UTF-
      532.  
         
      533.  
        8"));
      534.  
        String line;
      535.  
        while ((line =
      536.  
         
      537.  
        in.readLine()) != null) {
      538.  
        result.append
      539.  
         
      540.  
        (line);
      541.  
        }
      542.  
        } catch (Exception e) {
      543.  
         
      544.  
         
      545.  
        e.printStackTrace();
      546.  
        }
      547.  
        //使用finally块来关闭输出
      548.  
         
      549.  
        流、输入流
      550.  
        finally{
      551.  
        try{
      552.  
        if(out!=null){
      553.  
        out.close();
      554.  
        }
      555.  
        if(in!=null){
      556.  
        in.close();
      557.  
        }
      558.  
        }
      559.  
        catch(IOException
      560.  
         
      561.  
        ex){
      562.  
         
      563.  
         
      564.  
        ex.printStackTrace();
      565.  
        }
      566.  
        }
      567.  
        return result.toString();
      568.  
        }
      569.  
         
      570.  
         
      571.  
        private static char[]
      572.  
         
      573.  
        base64EncodeChars = new char[] {
      574.  
        'A', 'B', 'C', 'D', 'E',
      575.  
         
      576.  
        'F', 'G', 'H',
      577.  
        'I', 'J', 'K', 'L', 'M',
      578.  
         
      579.  
        'N', 'O', 'P',
      580.  
        'Q', 'R', 'S', 'T', 'U',
      581.  
         
      582.  
        'V', 'W', 'X',
      583.  
        'Y', 'Z', 'a', 'b', 'c',
      584.  
         
      585.  
        'd', 'e', 'f',
      586.  
        'g', 'h', 'i', 'j', 'k',
      587.  
         
      588.  
        'l', 'm', 'n',
      589.  
        'o', 'p', 'q', 'r', 's',
      590.  
         
      591.  
        't', 'u', 'v',
      592.  
        'w', 'x', 'y', 'z', '0',
      593.  
         
      594.  
        '1', '2', '3',
      595.  
        '4', '5', '6', '7', '8',
      596.  
         
      597.  
        '9', '+', '/' };
      598.  
         
      599.  
        public static String
      600.  
         
      601.  
        base64Encode(byte[] data) {
      602.  
        StringBuffer sb = new
      603.  
         
      604.  
        StringBuffer();
      605.  
        int len = data.length;
      606.  
        int i = 0;
      607.  
        int b1, b2, b3;
      608.  
        while (i < len) {
      609.  
        b1 = data[i++] &
      610.  
         
      611.  
        0xff;
      612.  
        if (i == len)
      613.  
        {
      614.  
        sb.append
      615.  
         
      616.  
        (base64EncodeChars[b1 >>> 2]);
      617.  
        sb.append
      618.  
         
      619.  
        (base64EncodeChars[(b1 & 0x3) <<
      620.  
         
      621.  
        4]);
      622.  
        sb.append("==");
      623.  
        break;
      624.  
        }
      625.  
        b2 = data[i++] &
      626.  
         
      627.  
        0xff;
      628.  
        if (i == len)
      629.  
        {
      630.  
        sb.append
      631.  
         
      632.  
        (base64EncodeChars[b1 >>> 2]);
      633.  
        sb.append
      634.  
         
      635.  
        (base64EncodeChars[((b1 & 0x03)
      636.  
         
      637.  
        << 4) | ((b2 & 0xf0) >>> 4)]);
      638.  
        sb.append
      639.  
         
      640.  
        (base64EncodeChars[(b2 & 0x0f) <<
      641.  
         
      642.  
        2]);
      643.  
        sb.append("=");
      644.  
        break;
      645.  
        }
      646.  
        b3 = data[i++] &
      647.  
         
      648.  
        0xff;
      649.  
        sb.append
      650.  
         
      651.  
        (base64EncodeChars[b1 >>> 2]);
      652.  
        sb.append
      653.  
         
      654.  
        (base64EncodeChars[((b1 & 0x03)
      655.  
         
      656.  
        << 4) | ((b2 & 0xf0) >>> 4)]);
      657.  
        sb.append
      658.  
         
      659.  
        (base64EncodeChars[((b2 & 0x0f)
      660.  
         
      661.  
        << 2) | ((b3 & 0xc0) >>> 6)]);
      662.  
        sb.append
      663.  
         
      664.  
        (base64EncodeChars[b3 & 0x3f]);
      665.  
        }
      666.  
        return sb.toString();
      667.  
        }
      668.  
        }
  • 相关阅读:
    很实用的html meta标签实现页面跳转
    oracle 实例名和服务名以及数据库名区别
    Oracle 创建 DBLink 的方法
    Java (六):java中Math常用方法
    Java (四):String,StringBuilder,StringBuffer三者的区别
    ROS Learning-001 安装 ROS indigo
    Windows cmd 将命令(/指令)写到一个文件里,直接运行这个文件。提高工作效率
    Blender 基础 骨架-02 骨架的各种呈现方式
    Blender 基础 骨架 01
    Python 解决 :NameError: name 'reload' is not defined 问题
  • 原文地址:https://www.cnblogs.com/dzcWeb/p/9661596.html
Copyright © 2011-2022 走看看