快递物流查询接口介绍

快递查询接口是指快递查询网对外开放的应用程序接口,开发人员能够通过调用该接口与快递查询网进行交互,并基于该接口开发自己的快递查询应用程序。目前比较常用的接口有快递鸟、快递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.  
      }
原文地址:https://www.cnblogs.com/dzcWeb/p/9661596.html