How does Baishi Express Free Docking Express Bird Single Number Query api Interface

Posted by revjoe on Tue, 06 Aug 2019 08:10:34 +0200

The API interface of express inquiry is to use logistics number to query logistics information. Mainly used in e-commerce malls, ERP systems, WMS systems, express cabinets, banks and other enterprises. Several express logistics companies have unified interface access. It is suggested that docking interface providers can access multiple express delivery services at one time, which will save a lot of work in the later stage of technical maintenance.

At present, there are two ways to implement API interface of express query, one is active query, the other is subscription interface pushing data. Take Express Bird Interface as an example. (Interface docking needs interface secret key, which is used for testing, can not be used formally, you can apply to Express Bird official website. http://www.kdniao.com/ It's free to apply for the secret key.) The last demo with the method is demo. More demos can be accessed to the Express Bird website for inquiry.

Active Query (Instant Query API)

1) Interface Rules

a. The query interface supports querying according to the shipping order number (single query, concurrent no more than 10/S).

b. The designated logistics bill number chooses the corresponding express company code, if the format is wrong or the coding error will return the failure information. For example, Yuantong Express Logistics Number should choose the Baishi Express Company Code (HTKY)

c. Logistics tracking information returned is arranged in ascending order according to the time of occurrence.

d. Interface instruction 1002.

e. Request Address: Express Bird Registration

2) System-level and application-level input parameters

System-level input parameters

3) Return result parameters

4) Examples of JSON requests
{
"OrderCode": "",
"ShipperCode": "SF",
"LogisticCode": "118650888018"
}
// "HTKY" is the code of Baishi Express Company. Other codes can be downloaded from the official website of Express Bird.

5) JSON return example

//No logistics trajectory
{
"EBusinessID": "1109259",
"Traces":[],
"OrderCode": "",
"ShipperCode": "SF",
"LogisticCode": "118461988807",
"Success": true,
"Reason": null
}
//Logistics trajectory
{
"EBusinessID": "1109259",
"OrderCode":"",
"ShipperCode": "SF",
"LogisticCode": "118461988807",
"Success": true,
"CallBack":"",
"State": 3,
"Reason": null,
"Traces":[
    {
       "AcceptTime": "2014/06/25 08:05:37",
       "AcceptStation": "Delivery in progress..(Dispatcher:Deng Yufu,Telephone:18718866310)[Shenzhen]",
       "Remark": null
    },
    {
       "AcceptTime": "2014/06/25 04:01:28",
       "AcceptStation": "Express in Shenzhen Distribution Center ,Ready for next stop in Shenzhen [Shenzhen City]",
       "Remark": null
    },
    {
       "AcceptTime": "2014/06/2501:41:06",
       "AcceptStation": "Express in Shenzhen Distribution Center [Shenzhen City]",
       "Remark": null
    },
    {
       "AcceptTime": "2014/06/24 20:18:58",
       "AcceptStation": "Received[Shenzhen City]",
       "Remark": null
   },
    {
       "AcceptTime": "2014/06/24 20:55:28",
       "AcceptStation": "Express in Shenzhen ,Preparing to be sent to the next station, Shenzhen Distribution Center [Shenzhen City]",
       "Remark": null
    },
    {
       "AcceptTime": "2014/06/25 10:23:03",
      "AcceptStation": "The dispatch has been signed[Shenzhen City]",
       "Remark": null
    },
    {
       "AcceptTime": "2014/06/25 10:23:03",
       "AcceptStation": "Signatory: Signed[Shenzhen City]",
       "Remark": null
    }
]

Subscription Interface Push Data (Logistics Tracking API)

Subscription query interface is a customized service. Users can subscribe the order information to express companies. After the express companies update their trajectories, they will convert real-time to standard interface form and push it to users, which will play the role of real-time push and improve efficiency.

At the same time, the data subscribed by users can also choose whether to notify the courier to come to the door, so as to realize the function of placing orders online. In addition, express bird also has on-the-way monitoring, electronic face sheet and other interface schemes, which can be selected according to the company's needs.

1) Interface Rules

a. The information received by the order (the information distributed to the network and the salesman) will be pushed to the customer through the push interface (subscription and concurrency is no more than 30 times/S). The customer needs to implement the interface as required.

b. Support Json format only.

c. Request instruction 1008.

d. Test interface address:

e. After the Joint Commission is passed, please change it to the official address:

f, Distribution and Subscription Interfaces require the client to implement the callback interface and call back RequestType(1008)

2) System-level and application-level parameters

RequestData (required parameters, request content, JSON format, consistent with DataType)
User-defined callback information
WareHouseID
 Payment of postage:
1-cash, 2-cash, 3-month, 4-third-party payment
ExpType
String
O
 Express Type: 1 - Standard Express
Cost
Double
O
 Delivery (Freight)
OtherCost
Double
O
 Other expenses
Receiver
Company
String
O
 Recipient Company
Name
String
O
 Addressee
Tel
String
O
 Telephone
Mobile
String
O
 Mobile phone
PostCode
String
O
 Recipient's postcode
ProvinceName
String
O
 Receiving provinces (e.g. Guangdong Province, do not lack "provinces")
CityName
String
O
 Receiving City (such as Shenzhen, do not lack "city")
ExpAreaName
String
O
 Receiving area (such as Futian district, do not lack "district" or "county")
Address
String
O
 Recipient's Detailed Address
Sender
Company
String
O
 Sender Company
Name
String
O
 Sender
Tel
String
O
 Sender telephone
Mobile
String
O
 Sender cell phone
PostCode
String
O
 Sender's postcode
ProvinceName
String
O
 Sending provinces (e.g. Guangdong Province, do not lack "provinces")
CityName
String
O
 Sending City (such as Shenzhen, do not lack "city")
ExpAreaName
String
O
 Sending area (such as Futian district, do not lack "district" or "county")
Address
String
O
 Sending Detailed Address
StartDate
String
O
 Door-to-door pick-up period:
"yyyy-MM-dd HH:mm:ss" formatting, all the time formats in this article are the same
EndDate
String
O
Weight
Double
O
 Total weight of articles kg
Quantity
Int
O
 Number of Parts/Parcels
Volume
Double
O
 Total Item Volume m3
Remark
String
O
 Remarks
IsNotice
Int
O
 Whether to distribute to express company: 1 - not distribute; 0 - distribute. Default is 0
IsSendMessage
Int
O
 Whether to Subscribe to SMS
 0 - No need; 1 - Need
AddService
Name
String
0
 Value-added Service Name
Value
String
0
 Value-added Service Value
CustomerID
String
0
 Customer ID (optional)
Commodity
GoodsName
String
O
 Name of commodity
GoodsCode
String
O
 Commodity Code
Goodsquantity
Int
O
 Number
GoodsPrice
Double
O
 commodity price
GoodsWeight
Double
O
 Commodity weight kg
GoodsDesc
String
O
 Commodity Description
GoodsVol
Double
O
 Commodity volume m3
EBusinessID
String
R
 Business ID
RequestType
String
R
 Request instruction type: 1008
DataSign
String
R
 Data Content Signature
DataType
String
R
 Request and return data type: 2-json;

Logistics Tracking APIdemo

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;

/**

*

Express Bird Subscription Push 2.0 Interface

ID and Key Please Apply to the Official Website: Express Single Number Query Interface

//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();
    }
}

//E-commerce ID
private String EBusinessID="Please apply to express bird website http://www.kdniao.com/ServiceApply.aspx";
//E-commerce encryption private key, courier bird provides, take care of, do not leak
private String AppKey="Please apply to express bird website http://www.kdniao.com/ServiceApply.aspx";
//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':'Shanghai','CityName':'Shanghai','ExpAreaName':'Qingpu District','Address':'73 Mingzhu Road'}," +
                            "'Receiver':" +
                            "{" +
                            "'Company':'GCCUI','Name':'Yann','Mobile':'15018442396','ProvinceName':'Beijing','CityName':'Beijing','ExpAreaName':'Chaoyang District','Address':'Yaxiu Building, Sanlitun Street'}," +
                            "'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 method
 * @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 method
 * @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 method
 * @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(); 
}

Topics: PHP Java JSON Mobile network