How to Dock Express Bird Logistics Single Number Query Interface API with java

The express birds do not limit the express logistics track query interface free docking, the principle is to subscribe the order content to the interface, the interface monitors the order in real time. When the logistics track is updated, the data is obtained in real time, the data is formatted, the estimated arrival time of the waybill, the logistics status of the whole process, and the data of the current city are pushed back. Monitor until the order is signed and received. It is more suitable for e-commerce and some system software.

Interface specification

(1) the interface support message receiving method is HTTP POST, and the encoding format of the request method (utf-8): "application/x-www-form-urlencoded;charset=utf-8".

(2) the designated logistics waybill number selects the corresponding courier company code, the format is incorrect or the coding error will fail. For example, EMS logistics number should choose express company code (EMS).

(3) API test address: http://testapi.kdniao.cc:8081/api/dist

(4) API official address: http://api.kdniao.cc/api/dist

(5) Pushing new logistics information on time

(6) Application for Interface Key: Express Bird( http://www.kdniao.com/reg)

JSON request

{
    "ShipperCode":"SF",
    "OrderCode":"SF201608081055208281",
    "LogisticCode":"3100707578976",
    "PayType":"1",
    "ExpType":"1",
    "CustomerName":"",
    "CustomerPwd":"",
    "MonthCode":"",
    "IsNotice":"0",
    "Sender":{
        "Name":"1255760",
        "Tel":"",
        "Mobile":"13700000000",
        "ProvinceName":"Guangdong Province",
        "CityName":"Shenzhen City",
        "ExpAreaName":"Xie",
        "Address":"Test address"
    },
    "Receiver":{
        "Name":"1255760",
        "Tel":"",
        "Mobile":"13800000000",
        "ProvinceName":"Guangdong Province",
        "CityName":"Shenzhen City",
        "ExpAreaName":"Longhua New District",
        "Address":"Test address 2"
    },
    "Commodity":[
        {
            "GoodsName":"Book"
        }
    ]
}
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.util.HashMap;
import java.util.Map;
import java.security.MessageDigest;
 
 
public class KdniaoSubscribeAPI {
     
    //DEMO
    public static void main(String[] args) {
        KdniaoSubscribeAPI api = new KdniaoSubscribeAPI();
        try {
            String result = api.orderTracesSubByJson();
            System.out.print(result);
             
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
     
    //Electricity supplier ID
    private String EBusinessID="Please apply to express bird website";
    //E-commerce Encryption Private Key, Pay Attention to Storage, Do not Leak
    private String AppKey="Please apply";
    //Test request url
    private String ReqURL = "http://testapi.kdniao.cc:8081/api/dist";
    //Formal request url
    //private String ReqURL = "http://api.kdniao.cc/api/dist";
  
    /**
     * Json Mode Logistics Information Subscription
     * @throws Exception
     */
    public String orderTracesSubByJson() throws Exception{
        String requestData="{'OrderCode': 'SF201608081055208281'," +
                                "'ShipperCode':'SF'," +
                                "'LogisticCode':'3100707578976'," +
                                "'PayType':1," +
                                "'ExpType':1," +
                                "'CustomerName':'',"+
                                "'CustomerPwd':''," +
                                "'MonthCode':''," +
                                "'IsNotice':0," +
                                "'Cost':1.0," +
                                "'OtherCost':1.0," +
                                "'Sender':" +
                                "{" +
                                "'Company':'LV','Name':'Taylor','Mobile':'15018442396','ProvinceName':'Xie','CityName':'Xie','ExpAreaName':'District','Address':'73 Mingzhu Road'}," +
                                "'Receiver':" +
                                "{" +
                                "'Company':'GCCUI','Name':'Yann','Mobile':'15018442396','ProvinceName':'Xie','CityName':'Xie','ExpAreaName':'Chaoyang District','Address':'Ya Street Mansion'}," +
                                "'Commodity':" +
                                "[{" +
                                "'GoodsName':'shoes','Goodsquantity':1,'GoodsWeight':1.0}]," +
                                "'Weight':1.0," +
                                "'Quantity':1," +
                                "'Volume':0.0," +
                                "'Remark':'Handle with care'}";
         
        Map<String, String> params = new HashMap<String, String>();
        params.put("RequestData", urlEncoder(requestData, "UTF-8"));
        params.put("EBusinessID", EBusinessID);
        params.put("RequestType", "1008");
        String dataSign=encrypt(requestData, AppKey, "UTF-8");
        params.put("DataSign", urlEncoder(dataSign, "UTF-8"));
        params.put("DataType", "2");
         
        String result=sendPost(ReqURL, params);
         
        //Processing the returned information according to the company's business...
         
        return result;
    }
         
    /**
     * MD5 encryption
     * @param str content      
     * @param charset Coding mode
     * @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 Code
     * @param str content      
     * @param charset Coding mode
     * @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 Signature Generation in E-commerce
     * @param content content  
     * @param keyValue Appkey 
     * @param charset Coding mode
     * @throws UnsupportedEncodingException ,Exception
     * @return DataSign autograph
     */
    @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);
    }
     
     /**
     * Send a request for a POST method to a specified URL    
     * @param url The URL to send the request   
     * @param params Request parameter set    
     * @return RESPONSE RESULTS OF REMOTE RESOURCES
     */
    @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();
            // To send a POST request, you must set the following two lines
            conn.setDoOutput(true);
            conn.setDoInput(true);
            // POST method
            conn.setRequestMethod("POST");
            // Setting Common Request Properties
            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();
            // Get the output stream corresponding to the URLConnection object
            out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");
            // Send request parameters           
            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());
            }
            // Buffer of flush output stream
            out.flush();
            // Define the BufferedReader input stream to read the response of the 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();
        }
        //Close the output and input streams using the final block
        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();
    }
}

Tags: Java Mobile JSON encoding

Posted on Sun, 06 Oct 2019 12:13:46 -0700 by Desai