调用第三方快递物流公司API接口即时查询信息方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了调用第三方快递物流公司API接口即时查询信息方法相关的知识,希望对你有一定的参考价值。

主要是利用快递鸟提供的物流服务,通过对接快递鸟的API,调用即时查询接口,获取物流信息。
这里采用java语言,调用快递鸟的接口为例。步骤如下:

1.首先,得去快递鸟的官方网站注册一个账号并进行实名认证,获得一个用户ID跟API key ,主要是作为个人唯一标识方便调用接口

技术图片

2.接下来介绍API接口参数:
API参数
一、接口描述/说明
(1)查询接口支持按照运单号查询(单个查询)。?
(2)接口需要指定快递单号的快递公司编码,格式不对或则编码错误都会返失败的信息。?
如:EMS物流单号应选择快递公司编码(EMS)?查看快递公司编码?
(3)返回的物流跟踪信息按照发生的时间升序排列。?
(4)接口指令1002。?
(5)接口支持的消息接收方式为?HTTP POST,请求方法的编码格式(utf-8):?"application/x-www-form-urlencoded;charset=utf-8"。?
(6)测试地址:http://sandboxapi.kdniao.cc:8080/kdniaosandbox/gateway/exterfaceInvoke.json?
(7)正式地址:http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx
请求系统参数:
技术图片
请求示例 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();?
????}
}

以上是关于调用第三方快递物流公司API接口即时查询信息方法的主要内容,如果未能解决你的问题,请参考以下文章

PHP使用第三方即时获取物流动态

快递查询API接口对接方法

物流即时查询功能-百世快递

java对接快递鸟单号查询自动识别接口,调用示例

物流即时查询功能-韵达快递

快递查询增值接口-在途监控demo(即时)