国际快递查询API接口对接JAVA示例

合集下载

快递单号查询API接口签名Java代码

快递单号查询API接口签名Java代码

快递单号查询API接⼝签名Java代码import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .HttpURLConnection;import .URL;import .URLEncoder;import java.security.MessageDigest;import java.util.HashMap;import java.util.Map;public class KdniaoTrackQueryAPI {//DEMOpublic 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();}}//电商IDprivate String EBusinessID="请到快递鸟官⽹申请/ServiceApply.aspx";//电商加密私钥,快递鸟提供,注意保管,不要泄漏private String AppKey="test";//请求urlprivate String ReqURL="/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接口调用对接

快递物流寄件下单api接口调用对接

快递物流寄件下单api接口调用对接为了让你对接更简单,我会分享源代码,把源码复制到你的项目上,就能快速完成电商售后退货快递寄件下单预约快递员上门取件接口对接,调用快递鸟提供的上门取件API标准接口,成功调用后,快递员会准时上门取件,同时支持快递单号物流轨迹查询,快递鸟物流单号查询api接口不区分开发语言,支持Java,C#,PHP,Python,ObjectC等开发语言的程序调用。

1 接口规范说明1.1 接口规范及说明1.1.1 报文及报文编码报文格式:Json格式请求方法的编码格式(utf-8):交互协议上统一用UTF-8,避免传递中文数据出现乱码。

1.1.2 接口数据包结构图例- 数据包结构(系统级{数据})1.1.3 JSON示例1.1.4 系统级参数*快递所有接口统一使用此系统级参数,根据不同的请求接口指令接入不同的接口。

1.1.5 流程示意图1.1.6 名词定义1.2 签名说明1.2.1 关于签名快递鸟和第三方电子商务公司系统进行对接,有一定的安全机制。

采用IP认证加签名的方式对接,具体方案如下:1. 防止数据被篡改2. 注:DataSign生成后,对方接收到数据后,以同样的算法进行签名(推送接口RequestType为101/102不需要进行URL编码),生成摘要,对比两者的摘要是否相同,如果不同,说明传递过程中发生数据篡改。

2.调用接口的身份认证注册成为快递鸟用户后,会生成对应的用户ID和APIKey,用户ID相当于用户名,APIKey相当于密码。

举例:1.假设2.那么DataSign签名的内容为3.接收方收到数据后,获得EBusinessID 和RequestData和DataSign等这几个数据。

4.接收方对EBusinessID得到APIKey,RequestData+APIKey的数据进行md5和base64后的内容就为OWFhM2I5N2ViM2U2MGRkMjc4YzU2NmVlZWI3ZDk0MmE=5.接收方判断签名后的数据跟传递过来的DataSign是否一致,如果一致进行业务操作,如果不一致返回错误。

快递单号查询api 开发快递查询应用程序

快递单号查询api 开发快递查询应用程序

快递单号查询api 开发快递查询应用程序快递单号查询api是对外开放的应用程序接口,基于该API开发自己的快递查询应用程序。

接口名称:快递单号查询api接口平台:聚合数据接口地址:/exp/index支持格式:JSON/XML请求方式:HTTP POST/GET请求示例:/exp/index?key=key&com=sf&no=575677355677请求参数:名称类型必填说明com string 是需要查询的快递公司编号no string 是需要查询的订单号key string 是应用APPKEY(应用详细页查询)dtype string 否返回数据的格式,xml或json,默认json调用样例及调试工具:API测试工具返回字段:名称类型说明参考JSON返回示例- -快递单号查询api JSON返回示例:{"resultcode":"200",/*返回标识码*/"reason":"查询成功!","result":{"company":"顺丰","com":"sf","no":"575677355677","list":[{"datetime":"2013-06-25 10:44:05", /*时间*/"remark":"已收件", /*描述*/"zone":"台州市" /*区域*/},{"datetime":"2013-06-25 11:05:21","remark":"快件在台州,准备送往下一站台州集散中心","zone":"台州市"},{"datetime":"2013-06-25 20:36:02","remark":"快件在台州集散中心,准备送往下一站台州集散中心","zone":"台州市"},{"datetime":"2013-06-25 21:17:36","remark":"快件在台州集散中心,准备送往下一站杭州集散中心","zone":"台州市"},{"datetime":"2013-06-26 12:20:00","remark":"快件在杭州集散中心,准备送往下一站西安集散中心","zone":"杭州市"},{"datetime":"2013-06-27 05:48:42","remark":"快件在西安集散中心,准备送往下一站西安","zone":"西安市/咸阳市"},{"datetime":"2013-06-27 08:03:03","remark":"正在派件..","zone":"西安市/咸阳市"},{"datetime":"2013-06-27 08:51:33","remark":"派件已签收","zone":"西安市/咸阳市"},{"datetime":"2013-06-27 08:51","remark":"签收人是:已签收","zone":"西安市/咸阳市"}]"status": "1", /*0或1,1表示签收或退回*/}}快递单号查询api XML返回示例:<root><resultcode>200</resultcode><reason>查询成功!</reason><result><company>顺丰</company><com>sf</com><no>575677355677</no><list><item><datetime>2013-06-25 10:44:05</datetime><remark>已收件</remark><zone>台州市</zone></item><item><datetime>2013-06-25 11:05:21</datetime><remark>快件在台州,准备送往下一站台州集散中心</remark><zone>台州市</zone></item><item><datetime>2013-06-25 20:36:02</datetime><remark>快件在台州集散中心,准备送往下一站台州集散中心</remark><zone>台州市</zone></item><item><datetime>2013-06-25 21:17:36</datetime><remark>快件在台州集散中心,准备送往下一站杭州集散中心</remark><zone>台州市</zone></item><item><datetime>2013-06-26 12:20:00</datetime><remark>快件在杭州集散中心,准备送往下一站西安集散中心</remark><zone>杭州市</zone></item><item><datetime>2013-06-27 05:48:42</datetime><remark>快件在西安集散中心,准备送往下一站西安</remark><zone>西安市/咸阳市</zone></item><item><datetime>2013-06-27 08:03:03</datetime><remark>正在派件..</remark><zone>西安市/咸阳市</zone></item><item><datetime>2013-06-27 08:51:33</datetime><remark>派件已签收</remark><zone>西安市/咸阳市</zone></item><item><datetime>2013-06-27 08:51</datetime><remark>签收人是:已签收</remark><zone>西安市/咸阳市</zone></item></list><status>1</status></result></root>。

快递单号查询API接口对接流程

快递单号查询API接口对接流程

快递单号查询API接口对接后可以在自己的网站点击查询就能查到物流轨迹,像京东淘宝查询物流的功能一样,适合一些自己研发的系统商、微信小程序,还有自己的电商网站。

方法/步骤
进入快递鸟网站下载对接相关的接口文档,和接口demo案例,接口demo案例可以直接调用,不用自己编写代码。

如果需要自己编写,可以参照接口文档
另外即时查询API、物流跟踪API和在途监控API都是查询快递的,可以根据不同情况对接使用
在右上角注册账号登录后进行账号认证,就可以对接接口了
在账号登录后首页可以查看接口ID和接口KEY,复制到demo中的“EBusinessID”和“AppKey”两个参数中,demo就可以使用了
对接完成后就是在调试平台调试接口,对比请求报文和返回报文确认对接是不是正确的。

这里需要注意的是,对接的是什么接口,就查看什么接口的调试报文
测试后就可以正式调用了,正式调用的时候在正式地址调用
最后做一个物流轨迹的数据展现就可以了,如下图。

跨越速运 java 调用api 查询路由基础信息的方法 -回复

跨越速运 java 调用api 查询路由基础信息的方法 -回复

跨越速运java 调用api 查询路由基础信息的方法-回复跨越速运是一家知名的物流公司,为了方便开发者查询路由基础信息,他们提供了一套完善的API。

本文将以Java编程语言为例,教您如何使用跨越速运的API查询路由基础信息。

第一步,注册并获取API密钥要使用跨越速运的API,您首先需要注册一个开发者账号,并且申请一个API密钥。

在跨越速运的官方网站上,找到开发者中心,在那里您可以注册一个开发者账号。

注册成功后,登录您的账号,在账号管理中心找到API密钥管理选项,并生成一个API密钥。

第二步,配置开发环境在您的电脑上安装Java开发环境,确保您可以使用Java编程语言进行开发。

您可以选择安装JDK并将其配置到系统环境变量中。

第三步,导入API库跨越速运为开发者提供了Java的API库,您需要将该库导入到您的项目中。

您可以在官方网站的开发者中心下载API库文件,完成下载后解压缩文件,并将其中的jar文件添加到Java项目的依赖中。

第四步,调用API查询路由基础信息在Java项目中,您可以使用Java的HTTP请求库调用跨越速运的API。

以下是一个简单的例子,演示如何使用Java发送HTTP GET请求,并通过API查询路由基础信息。

javaimport java.io.BufferedReader;import java.io.InputStreamReader;import .HttpURLConnection;import .URL;import .URLEncoder;public class Main {public static void main(String[] args) {try {String apiKey = "YOUR_API_KEY"; 替换为您的API 密钥String apiUrl = "String waybillNo = "YOUR_WAYBILL_NO"; 替换为您要查询的运单号码String encodedWaybillNo =URLEncoder.encode(waybillNo, "UTF-8");String requestUrl = apiUrl + "?api_key=" + apiKey + "&waybill_no=" + encodedWaybillNo;URL url = new URL(requestUrl);HttpURLConnection connection =(HttpURLConnection) url.openConnection();connection.setRequestMethod("GET");int responseCode =connection.getResponseCode();if (responseCode == HttpURLConnection.HTTP_OK) {BufferedReader bufferedReader = new BufferedReader(newInputStreamReader(connection.getInputStream()));StringBuffer response = new StringBuffer();String line;while ((line = bufferedReader.readLine()) != null) {response.append(line);}bufferedReader.close();System.out.println(response.toString());} else {System.out.println("请求错误,错误码:" + responseCode);}connection.disconnect();} catch (Exception e) {e.printStackTrace();}}}上述代码中,您需要将YOUR_API_KEY替换为您在第一步中获取到的API密钥,将YOUR_WAYBILL_NO替换为您要查询的运单号码。

免费物流查询API接口对接案例

免费物流查询API接口对接案例

免费物流查询API接口对接案例这是来自快递鸟的一个快递查询的api接口,支持快递单号查询,接口不错,分享给大家。

接口申请地址:/regPHP代码<?php//电商IDdefined('EBusinessID') or define('EBusinessID', 1237100);//电商加密私钥,注意保管,不要泄漏defined('AppKey') or define('AppKey', '518a73d8-1f7f-441a-b644-33e77b49d846');//请求urldefined('ReqURL') or define('ReqURL', '/Ebusiness/EbusinessOrderHandle.aspx');/*** Json方式查询订单物流轨迹*/function getOrderTracesByJson(){$requestData= "{'OrderCode':'','ShipperCode':'SF','LogisticCode':'589707398027'}";$datas = array('EBusinessID' => EBusinessID,'RequestType' => '1002','RequestData' => urlencode($requestData) ,'DataType' => '2',);$datas['DataSign'] = encrypt($requestData, AppKey);$result=sendPost(ReqURL, $datas);//根据公司业务处理返回的信息......return $result;}/*** XML方式查询订单物流轨迹*/function getOrderTracesByXml(){$requestData= "<?xml version=\"1.0\" encoding=\"utf-8\" ?>"."<Content>"."<OrderCode></OrderCode>"."<ShipperCode>SF</ShipperCode>"."<LogisticCode>589707398027</LogisticCode>"."</Content>";$datas = array('EBusinessID' => EBusinessID,'RequestType' => '1002','RequestData' => urlencode($requestData) ,'DataType' => '1',);$datas['DataSign'] = encrypt($requestData, AppKey);$result=sendPost(ReqURL, $datas);//根据公司业务处理返回的信息......return $result;}/*** post提交数据* @param string $url 请求Url* @param array $datas 提交的数据* @return url响应返回的html*/function sendPost($url, $datas) {$temps = array();foreach ($datas as $key => $value) {$temps[] = sprintf('%s=%s', $key, $value);}$post_data = implode('&', $temps);$url_info = parse_url($url);if($url_info['port']==''){$url_info['port']=80;}echo $url_info['port'];$httpheader = "POST " . $url_info['path'] . " HTTP/1.0\r\n";$httpheader.= "Host:" . $url_info['host'] . "\r\n";$httpheader.= "Content-Type:application/x-www-form-urlencoded\r\n";$httpheader.= "Content-Length:" . strlen($post_data) . "\r\n";$httpheader.= "Connection:close\r\n\r\n";$httpheader.= $post_data;$fd = fsockopen($url_info['host'], $url_info['port']);fwrite($fd, $httpheader);$gets = "";$headerFlag = true;while (!feof($fd)) {if (($header = @fgets($fd)) && ($header == "\r\n" || $header == "\n")) {break;}}while (!feof($fd)) {$gets.= fread($fd, 128);}fclose($fd);return $gets;}/*** 电商Sign签名生成* @param data 内容* @param appkey Appkey* @return DataSign签名*/function encrypt($data, $appkey) {return urlencode(base64_encode(md5($data.$appkey)));}?>.NET代码using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Web;using ;using System.IO;namespace KdGoldAPI{public class KdApiSearchDemo{//电商IDprivate string EBusinessID = "1237100";//电商加密私钥,注意保管,不要泄漏private string AppKey = "518a73d8-1f7f-441a-b644-33e77b49d846";//请求urlprivate string ReqURL = "/Ebusiness/EbusinessOrderHandle.aspx";/// <summary>/// Json方式查询订单物流轨迹/// </summary>/// <returns></returns>public string getOrderTracesByJson(){string requestData = "{'OrderCode':'','ShipperCode':'SF','LogisticCode':'589707398027'}";Dictionary<string, string> param = new Dictionary<string, string>();param.Add("RequestData", HttpUtility.UrlEncode(requestData, Encoding.UTF8));param.Add("EBusinessID", EBusinessID);param.Add("RequestType", "1002");string dataSign = encrypt(requestData, AppKey, "UTF-8");param.Add("DataSign", HttpUtility.UrlEncode(dataSign, Encoding.UTF8));param.Add("DataType", "2");string result = sendPost(ReqURL, param);//根据公司业务处理返回的信息......return result;}/// <summary>/// XML方式查询订单物流轨迹/// </summary>/// <returns></returns>public string getOrderTracesByXml(){string requestData = "<?xml version=\"1.0\" encoding=\"utf-8\" ?>" +"<Content>" +"<OrderCode></OrderCode>" +"<ShipperCode>SF</ShipperCode>" +"<LogisticCode>589707398027</LogisticCode>" +"</Content>";Dictionary<string, string> param = new Dictionary<string, string>();param.Add("RequestData", HttpUtility.UrlEncode(requestData, Encoding.UTF8));param.Add("EBusinessID", EBusinessID);param.Add("RequestType", "1002");string dataSign = encrypt(requestData, AppKey, "UTF-8");param.Add("DataSign", HttpUtility.UrlEncode(dataSign, Encoding.UTF8));param.Add("DataType", "1");string result = sendPost(ReqURL, param);//根据公司业务处理返回的信息......return result;}/// <summary>/// Post方式提交数据,返回网页的源代码/// </summary>/// <param name="url">发送请求的URL</param>/// <param name="param">请求的参数集合</param>/// <returns>远程资源的响应结果</returns>private string sendPost(string url, Dictionary<string, string> param){string result = "";StringBuilder postData = new StringBuilder();if (param != null && param.Count > 0){foreach (var p in param){if (postData.Length > 0){postData.Append("&");}postData.Append(p.Key);postData.Append("=");postData.Append(p.Value);}}byte[] byteData = Encoding.GetEncoding("UTF-8").GetBytes(postData.ToString());try{HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);request.ContentType = "application/x-www-form-urlencoded";request.Referer = url;request.Accept = "*/*";request.Timeout = 30 * 1000;erAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)";request.Method = "POST";request.ContentLength = byteData.Length;Stream stream = request.GetRequestStream();stream.Write(byteData, 0, byteData.Length);stream.Flush();stream.Close();HttpWebResponse response = (HttpWebResponse)request.GetResponse();Stream backStream = response.GetResponseStream();StreamReader sr = new StreamReader(backStream, Encoding.GetEncoding("UTF-8"));result = sr.ReadToEnd();sr.Close();backStream.Close();response.Close();request.Abort();}catch (Exception ex){result = ex.Message;}return result;}///<summary>///电商Sign签名///</summary>///<param name="content">内容</param>///<param name="keyValue">Appkey</param>///<param name="charset">URL编码</param>///<returns>DataSign签名</returns>private string encrypt(String content, String keyValue, String charset){if (keyValue != null){return base64(MD5(content + keyValue, charset), charset);}return base64(MD5(content, charset), charset);}///<summary>/// 字符串MD5加密///</summary>///<param name="str">要加密的字符串</param>///<param name="charset">编码方式</param>///<returns>密文</returns>private string MD5(string str, string charset){byte[] buffer = System.Text.Encoding.GetEncoding(charset).GetBytes(str);try{System.Security.Cryptography.MD5CryptoServiceProvider check;check = new System.Security.Cryptography.MD5CryptoServiceProvider();byte[] somme = puteHash(buffer);string ret = "";foreach (byte a in somme){if (a < 16)ret += "0" + a.ToString("X");elseret += a.ToString("X");}return ret.ToLower();}catch{throw;}}/// <summary>/// base64编码/// </summary>/// <param name="str">内容</param>/// <param name="charset">编码方式</param>/// <returns></returns>private string base64(String str, String charset){returnConvert.ToBase64String(System.Text.Encoding.GetEncoding(charset).GetBytes(str));}}}。

国际快递查询API接口对接JAVA示例

国际快递查询API接口对接JAVA示例

国际快递查询API接⼝对接JAVA⽰例国际物流快递查询API接⼝java如何对接国际快递查询接⼝的需求量很⼤,例如⼀些跨境电商B2C⽹站、快递查询APP、快递柜、跨境物流公司等都会需要⽤到国际快递接⼝。

⽬前市⾯上的快递接⼝,以国内快递居多,有些虽然号称⽀持多家国际快递和国际邮政,但实际调⽤时,由于国际快递⽹站变化较多,所以经常出现不稳定的情况。

这⾥我要介绍的是快递鸟的国际快递接⼝,他们⼀直专做国际快递,⽀持的国内外600多家快递,⼤部分国外主流快递物流公司的接⼝可以对接,提供的接⼝也⾮常可靠。

国际快递特性(含国际邮政)1.可在两个⽹站查询到信息:属于万国邮联的国际邮政单号,可以分别在发件国家邮政官⽹与⽬的国家邮政官⽹查询到数据。

相对⽽⾔,国内快递⼀般只需要在⼀个⽹站查询数据。

2.海关问题:国际包裹是跨国包裹,需要通过两国的海关查验,有时候会被海关扣押,进⽽导致时效不如国内快递稳定。

3.运输时间长:国际邮政包裹相对国际快递价格便宜很多,所以运输时间也慢,甚⾄会需要1到2个⽉才能签收。

4.多语⾔问题:由于包裹是跨国的,必然会涉及多语⾔问题,国内客户需要看到的是中⽂信息,⽽国外客户希望看到的是当地语⾔的物流信息。

国际快递API特性(快递鸟)1.包含发件国与⽬的国的数据:快递鸟的API中包含的参数有 origin_info(发件国物流信息)和destination_info(⽬的国物流信息),所以通过该接⼝可以让⽤户看到最为完整的物信息。

2.智能识别快递状态:当检测到包裹在海关停滞,或者包裹被退回等信息,快递鸟会返回“exception”(可能异常)的状态,帮助⽤户第⼀时间发现异常件,从⽽尽早处理。

3.按照单号个数计费:由于国际包裹的运输时间很长,完整的运输周期可能需要两个⽉,⽽每天⾄少需要查询两次以上。

所以按照查询单号个数计费⽽不是按照API调⽤次数计费,是最为良⼼的计费⽅式。

4.多语⾔API:针对不同的快递商,可以按照语⾔返回不同的结果。

接入快递接口API单号识别查询接口demo

接入快递接口API单号识别查询接口demo

接入快递接口API单号识别查询接口demo背景:分享一篇关于在电商系统中同步物流轨迹到本地服务器的文章,当前方案使用了快递鸟集成api做为数据来源接口,这个接口是免费使用的,不过提供的功能还是非常强大的,有专门的售后维护团队。

有多种语言demo可以进行调用1. 需求根据用户输入的订单号,我们的后台识别订单号并根据快递鸟查询快递Api接口,实现自动查询的功能2.应用场景(如图)3、进入“我的会员中心”进行实名认证注:3.1、认证类型、应用类型根据用户实际情况选择即可,接口返回数据与选择结果无关;3.2、标记为*的为必填,要求上传清晰、jpg格式且小于2M的证件图片;3.3、技术对接人信息为用户方对接工程师的信息;3.4、如有其他疑问可进入官网加入商务合作群进行咨询。

认证成功后,进入“产品服务管理”,开通相关会员服务Demo由第三方写好,只需要下载就可以运行用上,(自己做简单的修改)下面是下载Demo的网站,根据自己需要下载6. 下面是java版本的根据单号查询物流跟踪信息的详细代码6.1 创建KdniaoTrackQueryAPI 接口类下面是Demo的main方法测试代码import net.sf.json.JSONArray;import net.sf.json.JSONObject;//测试接口public class Demo {public static void main(String[] args) {KdniaoTrackQueryAPI api = new KdniaoTrackQueryAPI();try {//第一个参数是快递公司简称(YD -- 韵达速递)//第二个参数是需要查询的快递单号String result = api.getOrderTracesByJson("YD", "3827670147715"); JSONObject jsonObject = JSONObject.fromObject(result);String ShipperCode = jsonObject.getString("ShipperCode");String LogisticCode = jsonObject.getString("LogisticCode");JSONArray Traces = jsonObject.getJSONArray("Traces");System.out.print(result+"\n");System.out.println("快递名称"+ShipperCode);System.out.println("快递单号"+LogisticCode);for(int i = 0; i < Traces.size(); i++) {JSONObject object = (JSONObject) Traces.get(i);String AcceptTime = object.getString("AcceptTime");String AcceptStation = object.getString("AcceptStation");System.out.println("时间:"+AcceptTime+"\t"+AcceptStation); }} catch (Exception e) {e.printStackTrace();}}}测试效果实图。

浅谈各种快递单号查询接口种类及对接方法

浅谈各种快递单号查询接口种类及对接方法

浅谈各种快递单号查询接口种类及对接方法目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。

第一种耗费时间长,但是是直接和快递公司合作,第二种虽然是间接对接,但是对接简便,对后期的接口维护可以省很多时间和人力成本。

集成接口还有其他公司提供,有其他需要可以去找,快递鸟其实能满足电商、ERP系统商这些企业需求了。

这里就以快递鸟为例说说对接方法。

快递鸟物流查询接口有免费和收费版本,对接周期大概在一天左右,他们有写好的demo,可以直接使用。

一.即时查询接口1. 接口规则(1)、查询接口支持按照运单号查询(单个查询,并发不超过10个/S)。

(2)、指定的物流运单号选择相应的快递公司编码,格式不对或则编码错误都会返失败的信息。

如EMS物流单号应选择快递公司编码(EMS)(3)、返回的物流跟踪信息按照发生的时间升序排列。

(4)、接口指令1002。

2. 系统级和应用级输入参数返回结果参数4. 示例//请求示例<br>{"OrderCode": "","ShipperCode": "SF","LogisticCode": "118650888018" }//返回示例<br>//没有物流轨迹的{"EBusinessID": "1109259","Traces": [],"OrderCode": "",2.2接收接口这个是用户在订阅单号成功且有物流轨迹更新后,快递鸟的推送客户通过下单、订阅接口,把运单号在快递鸟系统订阅。

运单物流信息有更新,快递鸟通过推送接口把更新的信息推送给客户。

JAVA快递查询API接口调用代码示例

JAVA快递查询API接口调用代码示例

∙1、应用场景∙(1)电商网站用户打开“我的订单”时调用此API显示物流信息详情。

(2)电商管理后台的物流系统,客服在对账前查询所有运单的签收状态,并追踪问题。

(3)每日调用次数限制不超过3000次,如超过该限制,请对接订阅推送API。

∙2、是否需要授权∙要∙3、接口描述/说明∙(1)查询接口支持按照运单号查询(单个查询)。

(2)接口需要指定快递单号的快递公司编码,格式不对或则编码错误都会返失败的信息。

如:EMS物流单号应选择快递公司编码(EMS)查看快递公司编码(3)返回的物流跟踪信息按照发生的时间升序排列。

(4)接口指令1002。

(5)接口支持的消息接收方式为HTTP POST,请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8"。

(6)请求系统级参数说明:∙备注:R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)。

(7)接口地址:API ID:点击申请API Key:点击申请API地址:/Ebusiness/EbusinessOrderHandle.aspx∙4、接口参数∙(1)请求内容字段定义∙(3)返回参数定义∙5、示例∙(1)请求示例JSON格式show sourceview sourceprint?1 {2 "OrderCode": "",3 "ShipperCode": "SF",4 "LogisticCode": "118650888018"5 }(2)返回示例JSON格式show sourceview sourceprint?01 没有物流轨迹的02 {03 "EBusinessID": "1109259",04 "Traces": [],05 "OrderCode": "",06 "ShipperCode": "SF",07 "LogisticCode": "118461988807",08 "Success": false,09 "Reason": null10 }11 有物流轨迹的12 {13 "EBusinessID": "1109259",14 "OrderCode": "",15 "ShipperCode": "SF",16 "LogisticCode": "118461988807",17 "Success": true,18 "State": 3,19 "Reason": null,20 "Traces": [21 {22 "AcceptTime": "2014/06/25 08:05:37",23 "AcceptStation": "正在派件..(派件人:邓裕富,电话:xxxxxxxxxx)[深圳市]",24 "Remark": null25 },26 {27 "AcceptTime": "2014/06/25 04:01:28",28 "AcceptStation": "快件在深圳集散中心 ,准备送往下一站深圳 [深圳市]",29 "Remark": null30 },31 {32 "AcceptTime": "2014/06/25 01:41:06",33 "AcceptStation": "快件在深圳集散中心[深圳市]",34 "Remark": null35 },36 {37 "AcceptTime": "2014/06/24 20:18:58",38 "AcceptStation": "已收件[深圳市]",39 "Remark": null40 },41 {42 "AcceptTime": "2014/06/24 20:55:28",43 "AcceptStation": "快件在深圳 ,准备送往下一站深圳集散中心 [深圳市]",44 "Remark": null45 },46 {47 "AcceptTime": "2014/06/25 10:23:03",48 "AcceptStation": "派件已签收[深圳市]",49 "Remark": null50 },51 {52 "AcceptTime": "2014/06/25 10:23:03",53 "AcceptStation": "签收人是:已签收[深圳市]",54 "Remark": null55 }56 ]57 }6、单号识别接口Demo工具.JAVA版DEMO import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .HttpURLConnection;import .URL;import .URLEncoder;import java.security.MessageDigest;import java.util.HashMap;import java.util.Map;** 快递鸟单号识别接口** @技术QQ群: xxxxx* @copyright: 深圳市快金数据技术服务有限公司*** ID和Key请到官网申请:/ServiceApply.aspx*/public class KdApiOrderDistinguish {//DEMOpublic static void main(String[] args) {KdApiOrderDistinguish api = new KdApiOrderDistinguish();try {String result = api.getOrderTracesByJson("3967950525457");System.out.print(result);} catch (Exception e) {e.printStackTrace();}}//电商IDprivate String EBusinessID="请到快递鸟官网申请/ServiceApply.aspx";//电商加密私钥,快递鸟提供,注意保管,不要泄漏private String AppKey="请到快递鸟官网申请/ServiceApply.aspx";//请求urlprivate StringReqURL="/Ebusiness/EbusinessOrderHandle.aspx";/*** Json方式单号识别* @throws Exception*/public String getOrderTracesByJson(String expNo) throws Exception{ String requestData= "{'LogisticCode':'" + expNo + "'}";Map<String, String> params = new HashMap<String, String>();params.put("RequestData", urlEncoder(requestData, "UTF-8"));params.put("EBusinessID", EBusinessID);params.put("RequestType", "2002");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();}5、}开发对接5.1、即时查询(RequestType:1002/8001)5.1.1、请求接口之前需要先实名认证,开通相关会员服务,否则会请求失败并返回提示“未申请开通接口”;5.1.2、接口开发可以下载“快递鸟接口技术文档”进行参考;即时查询,参考技术文档中的4.1或5.1.1部分;5.1.3、接口开发可以下载“即时查询demo”进行参考(仅提供了.NET、Java、PHP三种语言demo);5.1.4、查看快递公司对应快递鸟的编码可以下载“2018快递鸟接口支持快递公司编码列表.xlsx”。

Java实战之在线寄查快递系统的实现

Java实战之在线寄查快递系统的实现

Java实战之在线寄查快递系统的实现⽬录介绍效果图核⼼代码后台⾓⾊管理控制器后台管理员管理控制器投诉控制层前台申请地点申请控制层介绍超级管理员:系统管理、⽤户管理、⽹点管理、运输点管理、快递员管理、⽹点申请管理(审核)、报价管理(时效报价)等。

普通⽤户:注册登录、个⼈信息管理(个⼈资料、密码修改等)、地址管理、实名认证、在线寄件(单件寄件、批量导⼊寄件)、订单查询(物流信息查询)、在线申请⽹点、投诉建议等。

⽹点管理员:揽收负责区域的快递,进⾏快递快递运输,确认到达快递,快递到达后指派⽹点下快递员进⾏派送。

运输点管理员:负责运输⾄该运输点的快递再次运输。

运⾏环境:windows/Linux均可、jdk1.8、mysql5.7、idea/eclipse均可。

效果图核⼼代码后台⾓⾊管理控制器/*** 后台⾓⾊管理控制器* @author yy**/@RequestMapping("/admin/role")@Controllerpublic class RoleController {private Logger log = LoggerFactory.getLogger(RoleController.class);@Autowiredprivate MenuService menuService;@Autowiredprivate OperaterLogService operaterLogService;@Autowiredprivate RoleService roleService;* 分页搜索⾓⾊列表* @param model* @param role* @param pageBean* @return*/@RequestMapping(value="/list")public String list(Model model,Role role,PageBean<Role> pageBean){model.addAttribute("title", "⾓⾊列表");model.addAttribute("name", role.getName());model.addAttribute("pageBean", roleService.findByName(role, pageBean));return "admin/role/list";}/*** ⾓⾊添加页⾯* @param model* @return*/@RequestMapping(value="/add",method=RequestMethod.GET)public String add(Model model){List<Menu> findAll = menuService.findAll();model.addAttribute("roleTypes", UserRoleTypeEnum.values());model.addAttribute("topMenus",MenuUtil.getTopMenus(findAll));model.addAttribute("secondMenus",MenuUtil.getSecondMenus(findAll));model.addAttribute("thirdMenus",MenuUtil.getThirdMenus(findAll));return "admin/role/add";}/*** ⾓⾊添加表单提交处理* @param role* @return*/@RequestMapping(value="/add",method=RequestMethod.POST)@ResponseBodypublic Result<Boolean> add(Role role){Role top1ByRoleType = roleService.findTop1ByRoleTypeAndRoleTypeNot(role.getRoleType()); if (top1ByRoleType != null){return Result.error(CodeMsg.ADMIN_ROLE_EXIST);}//⽤统⼀验证实体⽅法验证是否合法CodeMsg validate = ValidateEntityUtil.validate(role);if(validate.getCode() != CodeMsg.SUCCESS.getCode()){return Result.error(validate);}if(roleService.save(role) == null){return Result.error(CodeMsg.ADMIN_ROLE_ADD_ERROR);}("添加⾓⾊【"+role+"】");operaterLogService.add("添加⾓⾊【"+role.getName()+"】");return Result.success(true);}/*** ⾓⾊编辑页⾯* @param id* @param model* @return*/@RequestMapping(value="/edit",method=RequestMethod.GET)public String edit(@RequestParam(name="id",required=true)Long id,Model model){List<Menu> findAll = menuService.findAll();model.addAttribute("topMenus",MenuUtil.getTopMenus(findAll));model.addAttribute("secondMenus",MenuUtil.getSecondMenus(findAll));model.addAttribute("thirdMenus",MenuUtil.getThirdMenus(findAll));Role role = roleService.find(id);model.addAttribute("role", role);model.addAttribute("authorities",JSONArray.toJSON(role.getAuthorities()).toString());model.addAttribute("roleTypes", UserRoleTypeEnum.values());return "admin/role/edit";}/*** ⾓⾊修改表单提交处理* @param request* @param role* @return*/@RequestMapping(value="/edit",method=RequestMethod.POST)@ResponseBodypublic Result<Boolean> edit(Role role){//⽤统⼀验证实体⽅法验证是否合法CodeMsg validate = ValidateEntityUtil.validate(role);if(validate.getCode() != CodeMsg.SUCCESS.getCode()){return Result.error(validate);}Role existRole = roleService.find(role.getId());if(existRole == null){return Result.error(CodeMsg.ADMIN_ROLE_NO_EXIST);}existRole.setName(role.getName());existRole.setRemark(role.getRemark());existRole.setStatus(role.getStatus());existRole.setAuthorities(role.getAuthorities());if(roleService.save(existRole) == null){return Result.error(CodeMsg.ADMIN_ROLE_EDIT_ERROR);}("编辑⾓⾊【"+role+"】");operaterLogService.add("编辑⾓⾊【"+role.getName()+"】");return Result.success(true);}/*** 删除⾓⾊* @param request* @param id* @return*/@RequestMapping(value="delete",method=RequestMethod.POST)@ResponseBodypublic Result<Boolean> delete(@RequestParam(name="id",required=true)Long id){try {roleService.delete(id);} catch (Exception e) {// TODO: handle exceptionreturn Result.error(CodeMsg.ADMIN_ROLE_DELETE_ERROR);}("编辑⾓⾊ID【"+id+"】");operaterLogService.add("删除⾓⾊ID【"+id+"】");return Result.success(true);后台管理员管理控制器/*** 后台管理员管理控制器* @author yy**/@RequestMapping("/admin/user")@Controllerpublic class UserController {@Autowiredprivate UserService userService;@Autowiredprivate RoleService roleService;@Autowiredprivate OperaterLogService operaterLogService;/*** 管理员列表页⾯* @param model* @param user* @param pageBean* @return*/@RequestMapping(value="/list")public String list(Model model,User user,PageBean<User> pageBean){model.addAttribute("title", "管理员列表");model.addAttribute("username", user.getUsername());model.addAttribute("pageBean", userService.findList(pageBean,user.getUsername(), UserRoleTypeEnum.ADMIN)); return "admin/user/list";}/*** 新增管理员页⾯* @param model* @return*/@RequestMapping(value="/add",method=RequestMethod.GET)public String add(Model model){model.addAttribute("roles", roleService.findAllByRoleType(UserRoleTypeEnum.ADMIN));return "admin/user/add";}/*** 管理员添加表单提交处理* @param user* @return*/@RequestMapping(value="/add",method=RequestMethod.POST)@ResponseBodypublic Result<Boolean> add(User user){//⽤统⼀验证实体⽅法验证是否合法CodeMsg validate = ValidateEntityUtil.validate(user);if(validate.getCode() != CodeMsg.SUCCESS.getCode()){return Result.error(validate);}if(user.getRole() == null || user.getRole().getId() == null){return Result.error(CodeMsg.ADMIN_USER_ROLE_EMPTY);}//判断管理员名是否存在if(userService.isExistUsername(user.getUsername(), 0L)){return Result.error(CodeMsg.ADMIN_USERNAME_EXIST);}user.setUserType(UserRoleTypeEnum.ADMIN);//到这说明⼀切符合条件,进⾏数据库新增if(userService.save(user) == null){return Result.error(CodeMsg.ADMIN_USE_ADD_ERROR);}operaterLogService.add("添加管理员,管理员名:" + user.getUsername());return Result.success(true);}/*** 管理员编辑页⾯* @param model* @return*/@RequestMapping(value="/edit",method=RequestMethod.GET)public String edit(Model model,@RequestParam(name="id",required=true)Long id){model.addAttribute("roles", roleService.findAllByRoleType(UserRoleTypeEnum.ADMIN));model.addAttribute("user", userService.find(id));return "admin/user/edit";}/*** 编辑管理员信息表单提交处理* @param user* @return*/@RequestMapping(value="/edit",method=RequestMethod.POST)@ResponseBodypublic Result<Boolean> edit(User user){//⽤统⼀验证实体⽅法验证是否合法CodeMsg validate = ValidateEntityUtil.validate(user);if(validate.getCode() != CodeMsg.SUCCESS.getCode()){return Result.error(validate);}if(user.getRole() == null || user.getRole().getId() == null){return Result.error(CodeMsg.ADMIN_USER_ROLE_EMPTY);}if(user.getId() == null || user.getId().longValue() <= 0){return Result.error(CodeMsg.ADMIN_USE_NO_EXIST);}if(userService.isExistUsername(user.getUsername(), user.getId())){return Result.error(CodeMsg.ADMIN_USERNAME_EXIST);}//到这说明⼀切符合条件,进⾏数据库保存User findById = userService.find(user.getId());//讲提交的管理员信息指定字段复制到已存在的user对象中,该⽅法会覆盖新字段内容BeanUtils.copyProperties(user, findById, "id","createTime","updateTime","userType");if(userService.save(findById) == null){return Result.error(CodeMsg.ADMIN_USE_EDIT_ERROR);}operaterLogService.add("编辑管理员,管理员名:" + user.getUsername());return Result.success(true);}/*** 删除管理员* @param id@RequestMapping(value="/delete",method=RequestMethod.POST)@ResponseBodypublic Result<Boolean> delete(@RequestParam(name="id",required=true)Long id){try {userService.delete(id);} catch (Exception e) {return Result.error(CodeMsg.ADMIN_USE_DELETE_ERROR);}operaterLogService.add("删除管理员,管理员ID:" + id);return Result.success(true);}}投诉控制层/*** @info : 投诉控制层* @author: yy*/@RequestMapping("/admin/complaint")@Controllerpublic class ComplaintController {@Autowiredprivate ComplaintService complaintService;/*** 分页搜索投诉列表* @param model* @param complaint* @param pageBean* @return*/@RequestMapping(value="/list")public String list(Model model, Complaint complaint, PageBean<Complaint> pageBean){model.addAttribute("title", "投诉列表");model.addAttribute("waybillNumber", complaint.getWaybillNumber());model.addAttribute("pageBean", complaintService.findList(complaint, pageBean));return "admin/complaint/list";}@RequestMapping(value="/accepted",method= RequestMethod.POST)@ResponseBodypublic Result<Boolean> accepted(@RequestParam(name="id")Long id){Complaint complaint = complaintService.find(id);complaint.setStatus(Complaint.ACCEPTED);if (complaintService.save(complaint) == null){return Result.error(PLAINT_ACCEPTED_ERROR);}return Result.success(true);}}前台申请地点申请控制层/*** @info : 前台⽹点申请⽹点申请控制层* @author: yy*/@RequestMapping("/admin/branchApplyFor")@Controllerpublic class BranchApplyForController {@Autowiredprivate BranchApplyForService branchApplyForService;@Autowiredprivate UserService userService;@Autowiredprivate RoleService roleService;/*** ⽹点申请列表页⾯* @param model* @param branchApplyFor* @param pageBean* @return*/@RequestMapping(value="/list")public String list(Model model, BranchApplyFor branchApplyFor, PageBean<BranchApplyFor> pageBean){model.addAttribute("title", "⽹点申请列表");model.addAttribute("branchName", branchApplyFor.getBranchName());model.addAttribute("pageBean", branchApplyForService.findList(pageBean,branchApplyFor.getBranchName(), null)); return "admin/branch_apply_for/list";}/*** 通过申请* @param id* @return*/@RequestMapping(value="/agree",method=RequestMethod.POST)@ResponseBodypublic Result<Boolean> agree(@RequestParam(name="id")Long id){Role role = roleService.findTop1ByRoleType(UserRoleTypeEnum.BRANCHES);if (role == null){return Result.error(CodeMsg.BRANCHAPPLYFOR_ROLE_NO_EXIST);}Integer integer = branchApplyForService.agreeBranchApplyFor(id, role);if (1 == integer){return Result.error(CodeMsg.BRANCHAPPLYFOR_THROUGH_ERROR);}return Result.success(true);}/*** 驳回申请* @param id* @return*/@RequestMapping(value="/rejected",method=RequestMethod.POST)branchApplyFor.setBranchApplyForStatus(BranchApplyForStatusEnum.NOTTHROUGH);if (StringUtils.isEmpty(rejectReason)){return Result.error(CodeMsg.BRANCHAPPLYFOR_NOTTHROUGH_NULL);}if (rejectReason.length() >= 188){return Result.error(CodeMsg.BRANCHAPPLYFOR_NOTTHROUGH_LENGTH);}branchApplyFor.setRejectReason(rejectReason);if (branchApplyForService.save(branchApplyFor) == null){return Result.error(CodeMsg.BRANCHAPPLYFOR_NOTTHROUGH_ERROR);}return Result.success(true);}}以上就是Java实战之在线寄查快递系统的实现的详细内容,更多关于Java寄查快递系统的资料请关注其它相关⽂章!。

java对接接口实例

java对接接口实例

java对接接口实例Java 是一种广泛使用的编程语言,它可以与许多不同的接口进行对接。

以下是一个简单的 Java 对接接口的实例:假设我们有一个名为 "HelloWorld" 的接口,它有一个名为 "sayHello" 的方法,该方法返回一条问候语。

首先,我们需要在 Java 代码中声明该接口:```javapublic interface HelloWorld {String sayHello();}```然后,我们可以创建一个实现该接口的类:```javapublic class HelloWorldImpl implements HelloWorld {@Overridepublic String sayHello() {return "Hello, World!";}}```现在,我们可以使用该类来对接接口:```javapublic class Main {public static void main(String[] args) {HelloWorld helloWorld = new HelloWorldImpl();System.out.println(helloWorld.sayHello());}}```在上面的代码中,我们首先创建了一个实现了"HelloWorld" 接口的类"HelloWorldImpl"。

然后,我们使用该类创建了一个对象 "helloWorld",并调用了它的"sayHello" 方法。

最后,我们将问候语打印到控制台上。

这只是一个简单的 Java 对接接口的实例,实际情况可能会更加复杂。

例如,接口可能有多个方法,或者需要处理异常情况。

但是,这个例子应该能够帮助您理解如何使用 Java 对接接口。

跨越速运 java 调用api 查询路由基础信息的方法

跨越速运 java 调用api 查询路由基础信息的方法

跨越速运java 调用api 查询路由基础信息的方法1.引言1.1 概述概述部分提供了对本文主题的一个简要介绍。

在本文中,我们将探讨跨越速运(Cross-border Express)如何使用Java调用API来查询路由基础信息的方法。

我们将详细讨论Java调用API的基本原理,并展望未来这种方法的发展前景。

跨越速运是一家国际物流公司,专注于为跨境电商和国际贸易提供快速可靠的物流服务。

对于这样的物流公司来说,准确的路由信息是非常重要的。

了解货物在途中所经过的地点、时间和运输方式将有助于提供及时而可靠的服务。

Java作为一种广泛使用的计算机编程语言,以其跨平台性和强大的性能优势而受到广大开发者的喜爱。

借助Java的强大功能,我们可以轻松地调用API来获取所需的信息。

本文将重点介绍如何使用Java调用跨越速运的API来获取货物的路由基础信息。

在展示具体的实现方法之前,我们需要了解Java调用API的基本原理。

通过对API的分析和理解,我们可以更好地利用API提供的功能。

本文将介绍API的基本概念、工作原理以及如何在Java中使用API进行开发。

总结起来,本文旨在介绍跨越速运Java调用API查询路由基础信息的方法。

我们将详细讨论Java调用API的基本原理,并展望未来这种方法的发展前景。

通过阅读本文,读者将能够了解如何使用Java调用API来查询跨越速运的路由基础信息,并在实际应用中进行相应的开发和实现。

1.2文章结构1.2 文章结构本文将以跨越速运的Java调用API查询路由基础信息的方法为主题,分为引言、正文和结论三个部分展开讨论。

在引言中,我们将进行概述,介绍本文的主要内容和目的,以引起读者的兴趣。

同时,我们还会简要介绍跨越速运以及Java调用API的基本原理,为后文的内容铺垫。

接下来的正文部分将分为两个小节。

首先,我们将对跨越速运进行简要介绍,包括其背景、发展情况以及相关的基础知识。

然后,我们将深入探讨Java调用API的基本原理,包括API的定义、调用方式以及常用的API开发工具和技术。

常用快递单号物流查询接口通用API(JAVA对接)

常用快递单号物流查询接口通用API(JAVA对接)

常用快递单号物流查询接口通用API (JAVA 对接)快递查询接口通用API 是给发货电商以实现查询快递物流轨迹功能的,接口对接前要先到快递鸟网站申请接口秘钥和APIKEY快递API 的应用场景与用途最常见的应用场景如下:(1)电商网站:例如B2C ,团购,B2B ,批发分销站,C2C ,本地生活交易等网站。

(2)管理系统:订单处理平台,调度平台,发货平台,分销系统,渠道管理系统,客户管理系统,ERP 等。

快递API 的用途如下:(1)让顾客登录网站后,直接在“我的订单”页面上可以看到订单的物流状态。

(2)自动筛选出“已签收”,“疑难件”等状态的单号,减轻物流跟单人员的压力。

(3)更改订单的状态和交易流程,例如单号变为“已签收”,可以让订单转化可以确认退换货等。

(4)评估选择快递公司,根据“已签收”的运单数,可以算出销售人员的业绩,并进行应对的结算。

(5)邮件,短信提醒用户运单的最新状态,可以安抚用户,也可以利用邮件短信二次营销。

对接要求:(1),查询接口支持遵循运输单号查询(个别查询,并发不超过10个/ S )。

(2),指定的物流运输单号选择相应的快递公司编码,格式不对或则编码错误都会返回失败的信息。

例如EMS 物流单号应选择快递公司编码(EMS )(3),返回的物流跟踪信息遵循发生的时间升序排列。

(4),接口指令1002(5),接口提供:快递鸟 (6),请求地址:http ://java 请求示例: 1个2 3 4 5 6 7 8 9 10 import java.io.BufferedReader;import java.io.IOException; import java.io.InputStreamReader;import java.io.OutputStreamWriter;import java.io.UnsupportedEncodingException;import .HttpURLConnection;import .URL;import .URLEncoder;import java.security.MessageDigest;import java.util.HashMap;import java.util.Map;11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 /**** 单日超过500单查询量,建议接入物流轨迹订阅推送接口**/public class KdniaoTrackQueryAPI {//DEMOpublic 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();}}//电商IDprivate String EBusinessID="申请";//电商加密私钥,注意保管,不要泄漏private String AppKey="申请";//请求urlprivate String ReqURL="/Ebusiness/EbusinessOrderHandle.aspx";/*** Json 方式 查询订单物流轨迹* @throws Exception*/public String getOrderTracesByJson(String expCode, String expNo) throws Exception{String requestData= "{'OrderCode':'','ShipperCode':'" + expCode + "','LogisticCode':'" + expNo + "'}";Map params = new HashMap();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);//根据公司业务处理返回的信息......5556575859606162636465666768697071727374757677787980818283848586878889909192939495969798return 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;}/**99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142* 电商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 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();143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186// 获取URLConnection对象对应的输出流out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");// 发送请求参数if(params != null) {StringBuilder param = new StringBuilder();for(Map.Entry 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();188 189190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 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();}。

java物流查询接口测试代码-快递100

java物流查询接口测试代码-快递100

java物流查询接⼝测试代码-快递100测试代码返回json格式,xml/html格式⾃⾏修改参数1import java.io.IOException;2import java.io.InputStream;3import .MalformedURLException;4import .URL;5import .URLConnection;67public class kuaidi100 {89public static void main(String[] agrs) {10 String wuLiu = getWuLiu("huitongkuaidi", "*********");11 System.out.println(wuLiu);12 }13/**14 *15 * @author16 * @date17 * @param com 快递公司代码18 * @param nu 物流单号19 * @return20*/21public static String getWuLiu(String com,String nu){22 String content = null;23try {24/*id:⾝份授权key,需要申请(此处的key为本⼈在⽹上查询)25 com:要查询的快递公司代码,不⽀持中⽂,⾃⾏查看官⽅⽂档26 nu:要查询的快递单号,请勿带特殊符号,不⽀持中⽂(⼤⼩写不敏感)27 show:返回类型:28 0:返回json字符串,29 1:返回xml对象,30 2:返回html对象,31 3:返回text⽂本。

32如果不填,默认返回json字符串。

33 muti:返回信息数量:34 1:返回多⾏完整的信息,35 0:只返回⼀⾏信息。

36不填默认返回多⾏。

37 order:排序:38 desc:按时间由新到旧排列,39 asc:按时间由旧到新排列。

基于JAVA的免费快递api调用代码实例

基于JAVA的免费快递api调用代码实例

基于JAVA的免费快递api调用代码实例代码描述:基于JA V A的免费快递api调用代码实例接口平台:快递网免费快递接口API地址申请:/openapi.htmlJA V A代码:package com.kuaidi.openapi;import java.io.BufferedReader;import java.io.InputStreamReader;import .URL;import .URLConnection;import java.util.List;import java.util.Map;public class Openapi {private String app_key = "";private String api_url = "/openapi.html?";private String show = "0";private String muti = "0";private String order = "desc";/*** 您获得的快递网接口查询KEY。

** @param app_key**/public void setApp_key(String app_key) {this.app_key = app_key;}/*** 设置数据返回类型。

0: 返回json 字符串; 1:返回xml 对象** @param show**/public void setShow(String show) {this.show = show;}/*** 设置返回物流信息条目数, 0:返回多行完整的信息; 1:只返回一行信息** @param muti**/public void setMuti(String muti) {this.muti = muti;}/*** 设置返回物流信息排序。

快递API物流轨迹查询接口接入表

快递API物流轨迹查询接口接入表

方案说明 2、通过快递鸟电子面单接口直接打印对应快递公司电子面单,同时订阅单号信息。 3、快递鸟定时推送新的物流信息到用户系统。 适用对象 电商 ERP、仓储系统、清关公司、网站管理后台
快递鸟通讯录
商务对接联系人信息 姓名 QQ 手机 职务 邮箱 技术对接联系人信息
姓名
QQ 手机
职务 邮箱 产品对接联系人信息 姓名 QQ 手机 职务 邮箱
1、为什么有些邮政单号查不到物流信息? 答:首先,确认单号所属物流公司,并前往对应快递公司官网确认 单号可用。 然后,确认请求调用的对应物流编码正确无误。 如:邮政小包对应编码 YZPY,EMS 对应编码 EMS。 2、 快递公司那边已经签收了, 为什么快递鸟推送的内容还是派件中
接口问题
状态? 答:首先,确认接收接口是否可以正常访问。然后,确认接口是否 能承受压力,导致接收信息响应时间过长,影响推送的效率。 3、 快递公司那边已经更新了, 为什么即时查询接口的数据没更新? 答:首先,确认单号所属物流公司,确认快递鸟是否支持该物流公 司的物流信息查询。然后,确认调用参数格式。
透露。对于已被盗用的 Key,我们将会作禁用处理。
2、接口支持什么语言? 答:快递鸟接口适用于任何开发语言 3、有没有相关的 demo? 答:快递鸟提供 PHP、java、 语言 DEMO 工具,请前往 /ResourceDownload.aspx 下载 4、订阅推送可以指定多台接收服务器吗? 答:一个用户 ID 只能对应一台推送服务器,如需配置多台,可注册 多个 ID 并提交快递鸟研发人员进行资源配置
订阅频率:*个订阅线程,每秒并发**个请求,每个请求**个单号 联调方案 推送频率:*个推送线程,每秒并发**个请求,每个请求**个单号 推送类型:全量推送 调试结果 优化方案 下次联调时 间 第 2 次联调 联调时间 调试单量 执行人

快递鸟物流查询接口demo

快递鸟物流查询接口demo
StringBuffersb= newStringBuffer();
intlen=data.length;
inti= 0;
intb1, b2, b3;
while (i<len) {
b1 = data[i++] & 0xff;
if (i==len)
{
sb.append(base64EncodeChars[b1 >>> 2]);
}
}
catch(IOExceptionex){
ex.printStackTrace();
}
}
returnresult.toString();
}
private static char[] base64EncodeChars = new char[] {
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
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");
{

常用快递API接口方案

常用快递API接口方案
params.put("RequestData", urlEncoder(requestData, "UTF-8"));
params.put("EBusinessID", EBusinessID);
params.put("RequestType", "1001");
String dataSign=encrypt(requestData, AppKey, "UTF-8");
"'Volume':0.0," +
"'Remark':'小心轻放'," +
"'Commodity':" +
"[{" +
"'GoodsName':'鞋子'," +
"'Goodsquantity':1," +
"'GoodsWeight':1.0}]" +
"}";
Map<String, String> params = new HashMap<String, String>();
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(str.getBytes(charset));
byte[] result = md.digest();
StringBuffer sb = new StringBuffer(32);
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

国际物流快递查询API接口java如何对接国际快递查询接口的需求量很大,例如一些跨境电商B2C网站、快递查询APP、快递柜、跨境物流公司等都会需要用到国际快递接口。

目前市面上的快递接口,以国内快递居多,有些虽然号称支持多家国际快递和国际邮政,但实际调用时,由于国际快递网站变化较多,所以经常出现不稳定的情况。

这里我要介绍的是快递鸟的国际快递接口,他们一直专做国际快递,支持的国内外600多家快递,大部分国外主流快递物流公司的接口可以对接,提供的接口也非常可靠。

国际快递特性(含国际邮政)1.可在两个网站查询到信息:属于万国邮联的国际邮政单号,可以分别在发件国家邮政官网与目的国家邮政官网查询到数据。

相对而言,国内快递一般只需要在一个网站查询数据。

2.海关问题:国际包裹是跨国包裹,需要通过两国的海关查验,有时候会被海关扣押,进而导致时效不如国内快递稳定。

3.运输时间长:国际邮政包裹相对国际快递价格便宜很多,所以运输时间也慢,甚至会需要1到2个月才能签收。

4.多语言问题:由于包裹是跨国的,必然会涉及多语言问题,国内客户需要看到的是中文信息,而国外客户希望看到的是当地语言的物流信息。

国际快递API特性(快递鸟)1.包含发件国与目的国的数据:快递鸟的API中包含的参数有 origin_info(发件国物流信息)和destination_info(目的国物流信息),所以通过该接口可以让用户看到最为完整的物信息。

2.智能识别快递状态:当检测到包裹在海关停滞,或者包裹被退回等信息,快递鸟会返回“exception”(可能异常)的状态,帮助用户第一时间发现异常件,从而尽早处理。

3.按照单号个数计费:由于国际包裹的运输时间很长,完整的运输周期可能需要两个月,而每天至少需要查询两次以上。

所以按照查询单号个数计费而不是按照API调用次数计费,是最为良心的计费方式。

4.多语言API:针对不同的快递商,可以按照语言返回不同的结果。

包含中文、英文、日语、印度语、阿拉伯语等等。

对接示例这里以快递鸟为例,不同的接口的对接方式比较类似,都需要注册,并生成自己的API key。

接口支持的消息接收方式为HTTP POST请求方法的编码格式为utf-8请求body部分的参数的数据格式为json 格式请求头部信息参数请求bodycarrier_code 参数是自己定义的快递商家的简码,具体的可以在这里查看。

还有需要注意的就是body部分这两个参数需要时json数据格式。

大概样子就是这样的返回参数定义返回示例{"meta": {"code": 200,"type": "Success","message": "Success"},"data": {"items": [{"id": "442f798ea35749e7605d1a73d4181a01","tracking_number": "RE113184005HK","carrier_code": "hong-kong-post","status": "transit","original_country": "Hong Kong [CN]","destination_country": "Colombia","itemTimeLength": null,"origin_info": {"weblink": "http:\/\/www.hongkongpost.hk\/","phone": "852 2921 2222","carrier_code": "hong-kong-post","trackinfo": [{"Details": "CO","StatusDescription": "The item ( RE113184005HK ) left Hong Kong for its destination on 10-Oct-2015 ", "Date": "2015-10-09 00:00"china-ema参数名称参数类型参数说明是否一定要返回该项值code 数字返回码成功返回200,失败有其他队列的错误码type string 接口类型成功返回Successmessage string 返回信息说明成功返回Succes,失败返回队列的错误信息data json 查询到的物流信息成功返回物流信息,失败返回空},"destination_info": {"weblink": "http:\/\/.co\/","phone": "(57-1) 4722000","carrier_code": "colombia-post","trackinfo": [{"Date": "2015-10-22 20:52","StatusDescription": "DIGITALIZADO","Details": "CTP.CENTRO A"}, {"Date": "2015-10-22 17:02","StatusDescription": "Registro de entrega exitosa","Details": ""}, {"Date": "2015-10-22 16:55","StatusDescription": "ENTREGADO","Details": "CD.MONTEVIDEO"}, {"Date": "2015-10-22 09:31","StatusDescription": "REASIGNADO","Details": "CD.NORTE"}, {"Date": "2015-10-22 08:52","StatusDescription": "REASIGNADO","Details": "CD.NORTE"}, {"Date": "2015-10-22 02:39","StatusDescription": "En proceso","Details": "CTP.CENTRO A"}, {"Date": "2015-10-21 16:36","StatusDescription": "En proceso","Details": "CTP.CENTRO A"}, {"Date": "2015-10-20 06:29","StatusDescription": "Envío Recibido en la oficina de cambio internacional", "Details": "COBOGC"} }]}}JAVA接口对接示例12345678910111213141516171819202122232425262728String urlStr =null;String requestData="{\"tracking_number\":\"RQ958152738CN\",\"carrier_code\":\"china-ems\"}";String result= new Tracker().orderOnlineByJson(requestData,urlStr,"realtime");package trackingMore;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.io.OutputStreamWriter;import .HttpURLConnection;import .URL;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;public class Tracker {/** Apikey*/private String Apikey="Apikey you get from trackingMore";/*** Json*/public String orderOnlineByJson(String requestData,String urlStr,String293031323334353637383940414243444546474849505152535455565758596061626364 type) throws Exception{//---headerParamsMap headerparams = new HashMap();headerparams.put("Trackingmore-Api-Key", Apikey);headerparams.put("Content-Type", "application/json");//---bodyParamsList bodyParams = new ArrayList();String result =null;if(type.equals("post")){String ReqURL="/v2/trackings/post"; bodyParams.add(requestData);result=sendPost(ReqURL, headerparams , bodyParams,"POST");}else if(type.equals("get")){String ReqURL="/v2/trackings/get"; String RelUrl = ReqURL+urlStr;result=sendPost(RelUrl, headerparams , bodyParams,"GET");}else if(type.equals("batch")){String ReqURL="/v2/trackings/batch"; bodyParams.add(requestData);result=sendPost(ReqURL, headerparams , bodyParams,"POST");}else if(type.equals("codeNumberGet")){String ReqURL="/v2/trackings";String RelUrl = ReqURL+urlStr;result=sendGet(RelUrl, headerparams,"GET");}else if(type.equals("codeNumberPut")){String ReqURL="/v2/trackings";bodyParams.add(requestData);String RelUrl = ReqURL+urlStr;6566676869707172737475767778798081828384858687888990919293949596979899 100 result=sendPost(RelUrl, headerparams , bodyParams,"PUT"); }else if(type.equals("codeNumberDelete")){String ReqURL="/v2/trackings"; String RelUrl = ReqURL+urlStr;result=sendGet(RelUrl, headerparams ,"DELETE");}else if(type.equals("realtime")){StringReqURL="/v2/trackings/realtime";bodyParams.add(requestData);result=sendPost(ReqURL, headerparams , bodyParams,"POST"); }return result;}private String sendPost(String url, Map headerParams , List bodyParams,String mothod) {OutputStreamWriter out = null;BufferedReader in = null;StringBuilder result = new StringBuilder();try {URL realUrl = new URL(url);HttpURLConnection conn =(HttpURLConnection)realUrl.openConnection();conn.setDoOutput(true);conn.setDoInput(true);101102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 conn.setRequestMethod(mothod);for (Map.Entry entry : headerParams.entrySet()) {conn.setRequestProperty(entry.getKey(), entry.getValue()); }conn.connect();out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8");StringBuffer sbBody = new StringBuffer();for (String str : bodyParams) {sbBody.append(str);}out.write(sbBody.toString());out.flush();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{try{if(out!=null){out.close();}if(in!=null){in.close();}137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 }catch(IOException ex){ex.printStackTrace();}}return result.toString();}public static String sendGet(String url, Map headerParams,String mothod ) {String result = "";BufferedReader in = null;try {String urlNameString = url;URL realUrl = new URL(urlNameString);HttpURLConnection connection =(HttpURLConnection)realUrl.openConnection();connection.setRequestMethod(mothod);for (Map.Entry entry : headerParams.entrySet()) {connection.setRequestProperty(entry.getKey(),entry.getValue());}connection.connect();Map> map = connection.getHeaderFields();for (String key : map.keySet()) {System.out.println(key + "--->" + map.get(key));}in = new BufferedReader(new InputStreamReader(connection.getInputStream()));173 174 175 176 177 178 179 180 181 182 183 184 185 String line;while ((line = in.readLine()) != null) { result += line;}} catch (Exception e) {System.out.println("Exception " + e);e.printStackTrace();}finally {try {if (in != null) {in.close();}} catch (Exception e2) {e2.printStackTrace();}}return result;}}。

相关文档
最新文档