Express third-party logistics company call API interface method for real-time query information

Mainly the use of express logistics services provided by birds, by docking courier bird API, real-time query interface calls, access to logistics information.
Here the use of java language, calling birds Express interface as an example. Proceed as follows:

1. First, you have to express the bird's official website to register an account and make real-name authentication, access to a user ID with API key, mainly as a personal call interface that uniquely identifies convenient

Express third-party logistics company call API interface method for real-time query information

2. Next description API interface parameters:
API parameters
a, Interface Description / Description
(1) supports a query interface according Tracking Number (single query). 
(2) express a single number to specify the interface of Express encoding format will not return an error or failure information is encoded. 
Such as: EMS single stream number should be selected coding Express (EMS) Express view coding 
(3) tracking information returned stream are arranged in ascending order of time occurrence. 
(4) 1002 interface commands. 
(5) the interface to support message receiving mode HTTP POST, the request method of encoding format (utf-8): "application  / x-www-form-urlencoded; charset = utf-8".
(6) Test Address: http://sandboxapi.kdniao.cc:8080/kdniaosandbox/gateway/exterfaceInvoke.json 
(. 7) official Address: http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx
request system parameters:
Express third-party logistics company call API interface method for real-time query information
example request JSON

{        "OrderCode": "",        "ShipperCode": "SF",        "LogisticCode": "118650888018"        
}
返回示例 JSON
没有物流轨迹的
        {        "EBusinessID": "1109259",        "Traces": [],        "OrderCode": "",        "ShipperCode": "SF",        "LogisticCode": "118461988807",        "Success": false,        "Reason": null
        }
        有物流轨迹的
        {        "EBusinessID": "1109259",        "OrderCode": "",        "ShipperCode": "SF",        "LogisticCode": "118461988807",        "Success": true,        "State": 3,        "Reason": null,        "Traces": [
        {        "AcceptTime": "2014/06/25 08:05:37",        "AcceptStation": "正在派件..(派件人:邓裕富,电话:18718866310)[深圳 市]",        "Remark": null
        },
        {        "AcceptTime": "2014/06/25 04:01:28",        "AcceptStation": "快件在 深圳集散中心 ,准备送往下一站 深圳 [深圳市]",        "Remark": null
        },
        {        "AcceptTime": "2014/06/25 01:41:06",        "AcceptStation": "快件在 深圳集散中心 [深圳市]",        "Remark": null
        },
        {        "AcceptTime": "2014/06/24 20:18:58",        "AcceptStation": "已收件[深圳市]",        "Remark": null
        },
        {        "AcceptTime": "2014/06/24 20:55:28",        "AcceptStation": "快件在 深圳 ,准备送往下一站 深圳集散中心 [深圳市]",        "Remark": null
        },
        {        "AcceptTime": "2014/06/25 10:23:03",        "AcceptStation": "派件已签收[深圳市]",        "Remark": null
        },
        {        "AcceptTime": "2014/06/25 10:23:03",        "AcceptStation": "签收人是:已签收[深圳市]",        "Remark": null
        }
        ]
        }
具体代码实现可以可以参照如下:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map; 
/**
 *
 * 快递鸟物流轨迹即时查询接口
 *
 * @技术QQ群: 456320272
 * @see: http://www.kdniao.com/YundanChaxunAPI.aspx
 * @copyright: 深圳市快金数据技术服务有限公司
 *
 * DEMO中的电商ID与私钥仅限测试使用,正式环境请单独注册账号
 * 单日超过500单查询量,建议接入我方物流轨迹订阅推送接口
 * 
 * ID和Key请到官网申请:http://www.kdniao.com/ServiceApply.aspx
 */
public class KdniaoTrackQueryAPI {
     
    //DEMO
    public static void main(String[] args) {
        KdniaoTrackQueryAPI api = new KdniaoTrackQueryAPI();
        try {
            String result = api.getOrderTracesByJson("ANE", "210001633605");
            System.out.print(result);
             
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
     
    //电商ID--(这里就是上面提到的用户ID)
    private String EBusinessID="请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";
    //电商加密私钥,快递鸟提供,注意保管,不要泄漏
    private String AppKey="请到快递鸟官网申请http://www.kdniao.com/ServiceApply.aspx";
    //请求url
    private String ReqURL="http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx";    
  
    /**
     * Json方式 查询订单物流轨迹
     * @throws Exception 
     */
    public String getOrderTracesByJson(String expCode, String expNo) throws Exception{
        String requestData= "{'OrderCode':'','ShipperCode':'" + expCode + "','LogisticCode':'" + expNo + "'}";
         
        Map<String, String> params = new HashMap<String, String>();
        params.put("RequestData", urlEncoder(requestData, "UTF-8"));
        params.put("EBusinessID", EBusinessID);
        params.put("RequestType", "1002");
        String dataSign=encrypt(requestData, AppKey, "UTF-8");
        params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
        params.put("DataType", "2");
         
        String result=sendPost(ReqURL, params);    
         
        //根据公司业务处理返回的信息......
         
        return result;
    }
  
    /**
     * MD5加密
     * @param str 内容       
     * @param charset 编码方式
     * @throws Exception 
     */
    @SuppressWarnings("unused")
    private String MD5(String str, String charset) throws Exception {
        MessageDigest md = MessageDigest.getInstance("MD5");
        md.update(str.getBytes(charset));
        byte[] result = md.digest();
        StringBuffer sb = new StringBuffer(32);
        for (int i = 0; i < result.length; i++) {
            int val = result[i] & 0xff;
            if (val <= 0xf) {
                sb.append("0");
            }
            sb.append(Integer.toHexString(val));
        }
        return sb.toString().toLowerCase();
    }
     
    /**
     * base64编码
     * @param str 内容       
     * @param charset 编码方式
     * @throws UnsupportedEncodingException 
     */
    private String base64(String str, String charset) throws UnsupportedEncodingException{
        String encoded = base64Encode(str.getBytes(charset));
        return encoded;    
    }    
     
    @SuppressWarnings("unused")
    private String urlEncoder(String str, String charset) throws UnsupportedEncodingException{
        String result = URLEncoder.encode(str, charset);
        return result;
    }
     
    /**
     * 电商Sign签名生成
     * @param content 内容   
     * @param keyValue Appkey  
     * @param charset 编码方式
     * @throws UnsupportedEncodingException ,Exception
     * @return DataSign签名
     */
    @SuppressWarnings("unused")
    private String encrypt (String content, String keyValue, String charset) throws UnsupportedEncodingException, Exception
    {
        if (keyValue != null)
        {
            return base64(MD5(content + keyValue, charset), charset);
        }
        return base64(MD5(content, charset), charset);
    }
     
     /**
     * 向指定 URL 发送POST方法的请求     
     * @param url 发送请求的 URL    
     * @param params 请求的参数集合     
     * @return 远程资源的响应结果
     */
    @SuppressWarnings("unused")
    private String sendPost(String url, Map<String, String> params) {
        OutputStreamWriter out = null;
        BufferedReader in = null;        
        StringBuilder result = new StringBuilder(); 
        try {
            URL realUrl = new URL(url);
            HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection();
            // 发送POST请求必须设置如下两行
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // POST方法
            conn.setRequestMethod("POST");
            // 设置通用的请求属性
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            conn.connect();
            // 获取URLConnection对象对应的输出流
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            // 发送请求参数            
            if (params != null) {
                  StringBuilder param = new StringBuilder(); 
                  for (Map.Entry<String, String> entry : params.entrySet()) {
                      if(param.length()>0){
                          param.append("&");
                      }                  
                      param.append(entry.getKey());
                      param.append("=");
                      param.append(entry.getValue());                      
                      //System.out.println(entry.getKey()+":"+entry.getValue());
                  }
                  //System.out.println("param:"+param.toString());
                  out.write(param.toString());
            }
            // flush输出流的缓冲
            out.flush();
            // 定义BufferedReader输入流来读取URL的响应
            in = new BufferedReader(
                    new InputStreamReader(conn.getInputStream(), "UTF-8"));
            String line;
            while ((line = in.readLine()) != null) {
                result.append(line);
            }
        } catch (Exception e) {            
            e.printStackTrace();
        }
        //使用finally块来关闭输出流、输入流
        finally{
            try{
                if(out!=null){
                    out.close();
                }
                if(in!=null){
                    in.close();
                }
            }
            catch(IOException ex){
                ex.printStackTrace();
            }
        }
        return result.toString();
    }
     
     
    private static char[] base64EncodeChars = new char[] { 
        'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 
        'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 
        'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 
        'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 
        'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 
        'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 
        'w', 'x', 'y', 'z', '0', '1', '2', '3', 
        '4', '5', '6', '7', '8', '9', '+', '/' }; 
     
    public static String base64Encode(byte[] data) { 
        StringBuffer sb = new StringBuffer(); 
        int len = data.length; 
        int i = 0; 
        int b1, b2, b3; 
        while (i < len) { 
            b1 = data[i++] & 0xff; 
            if (i == len) 
            { 
                sb.append(base64EncodeChars[b1 >>> 2]); 
                sb.append(base64EncodeChars[(b1 & 0x3) << 4]); 
                sb.append("=="); 
                break; 
            } 
            b2 = data[i++] & 0xff; 
            if (i == len) 
            { 
                sb.append(base64EncodeChars[b1 >>> 2]); 
                sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); 
                sb.append(base64EncodeChars[(b2 & 0x0f) << 2]); 
                sb.append("="); 
                break; 
            } 
            b3 = data[i++] & 0xff; 
            sb.append(base64EncodeChars[b1 >>> 2]); 
            sb.append(base64EncodeChars[((b1 & 0x03) << 4) | ((b2 & 0xf0) >>> 4)]); 
            sb.append(base64EncodeChars[((b2 & 0x0f) << 2) | ((b3 & 0xc0) >>> 6)]); 
            sb.append(base64EncodeChars[b3 & 0x3f]); 
        } 
        return sb.toString(); 
    }
}

Guess you like

Origin blog.51cto.com/14466758/2462663