1、圆通快递电子面单接口对接说明(全) 1.接口类型说明 1)接口支持的消息接收方式:HTTP POST 2)请求方法的编码格式(utf-8):"application/x-www-form-urlencoded;charset=utf-8" 3)API地址:http://api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx 4)接口提供:快递鸟 5)快递编码:YTO 2.请求系统级参数 参数名称 类型 说明 必须要求 RequestData String 请求内容需进行URL(utf-8)编码。请求内容JSON格式
2、须和DataType一致。 R EBusinessID String 商户ID,请在我的服务页面查看。 R RequestType String 请求指令类型:1007 R DataSign String 数据内容签名:把(请求内容(未编码)+AppKey)进行MD5加密,然后Base64编码,最后进行URL(utf-8)编码。详细过程请查看Demo。 R DataType String 请求、返回数据类型:只支持JSON格式 O 备注:R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional
3、 3.接口参数 1)请求内容字段定义 参数名称 类型 说明 是否必须 CallBack String 用户自定义回调信息 O MemberID String 会员标识 O CustomerName String 电子面单客户账号(与快递网点申请) O CustomerPwd String 电子面单密码 O SendSite String 收件网点标识 O ShipperCode String 快递公司编码 R LogisticCode String 快递单号 O OrderCode String 订单编号
4、R MonthCode String 月结编码 C PayType Int 邮费支付方式:1-现付,2-到付,3-月结,4-第三方支付 R ExpType String 快递类型:1-标准快件 R IsNotice Int 是否通知快递员上门揽件:0-通知;1-不通知;不填则默认为0 O Cost Double 寄件费(运费) O OtherCost Double 其他费用 O Receiver Company String 收件人公司 O Name String 收件人 R Tel String 电话与手机,必填一个
5、R Mobile String PostCode String 收件人邮编 O ProvinceName String 收件省(如广东省,不要缺少“省”) R CityName String 收件市(如深圳市,不要缺少“市”) R ExpAreaName String 收件区(如福田区,不要缺少“区”或“县”) O Address String 收件人详细地址 R Sender Company String 发件人公司 O Name String 发件人 R Tel String 电话与手机,必填一个 R Mobile
6、String PostCode String 发件人邮编 O ProvinceName String 发件省(如广东省,不要缺少“省”) R CityName String 发件市(如深圳市,不要缺少“市”) R ExpAreaName String 发件区(如福田区,不要缺少“区”或“县”) O Address String 发件人详细地址 R StartDate String 上门取货时间段:"yyyy-MM-dd HH:mm:ss"格式化,本文中所有时间格式相同 O EndDate String O Weight Double
7、物品总重量kg O Quantity Int 件数/包裹数 O Volume Double 物品总体积m3 O Remark String 备注 O AddServices AddService Name String 增值服务名称 O Value String 增值服务值 O CustomerID String 客户标识(选填) O Commoditys Commodity GoodsName String 商品名称 R GoodsCode String 商品编码 O Goodsquantity Int 商品数量
8、 O GoodsPrice Double 商品价格 O GoodsWeight Double 商品重量kg O GoodsDesc String 商品描述 O GoodsVol Double 商品体积m3 O IsReturnPrintTemplate String 返回电子面单模板:0-不需要;1-需要 O 2)返回参数定义 参数名称 类型 说明 必须要求 EBusinessID String 用户ID R Order OrderCode String 订单编号 R ShipperCode String
9、快递公司编码 R LogisticCode String 快递单号 R MarkDestination String 大头笔 O OriginCode String 始发地区域编码 O OriginName String 始发地/始发网点 O DestinatioCode String 目的地区域编码 O DestinatioName String 目的地/到达网点 O SortingCode String 分拣编码 O PackageCode String 集包编码 O Success Bool 成功与否 R Res
10、ultCode String 错误编码 R Reason String 失败原因 O UniquerRequestNumber String 唯一标识 R PrintTemplate String 面单打印模板 O EstimatedDeliveryTime String 订单预计到货时间yyyy-mm-dd O Callback String 用户自定义回调信息 O 4. 示例 1)JSON请求示例 { "OrderCode": "012657700387", "ShipperCode": "HTKY
11、", "PayType": 1, "ExpType": 1, "Cost": 1.0, "OtherCost": 1.0, "Sender": { "Company": "LV", "Name": "Taylor", "Mobile": "15018442396", "ProvinceName": "上海", "CityName": "上海", "ExpAreaName": "青浦区", "Addre
12、ss": "明珠路73号" }, "Receiver": { "Company": "GCCUI", "Name": "Yann", "Mobile": "15018442396", "ProvinceName": "北京", "CityName": "北京", "ExpAreaName": "朝阳区", "Address": "三里屯街道雅秀大厦" }, "Commodity": [ {
13、 "GoodsName": "鞋子", "Goodsquantity": 1, "GoodsWeight": 1.0 } ], "AddService": [ { "Name": "COD", "Value": "1020" } ], "Weight": 1.0, "Quantity": 1, "Volume": 0.0, "Remark":
14、"小心轻放", "IsReturnPrintTemplate":1 } 2)JSON返回示例 失败: { "EBusinessID": "1237100", "ResultCode": "105", "Reason": "订单号已存在,请勿重复操作", "UniquerRequestNumber":"5e66486b-8fbc-4131-b875-9b13d2ad1354" } 成功: { "EBusinessID": "12
15、37100", "Order": { "OrderCode": "012657700387", "ShipperCode": "HTKY", "LogisticCode": "50002498503427", "MarkDestination": "京-朝阳(京-1)", "OriginCode": "200000", "OriginName": "上海分拨中心", "PackageCode": "北京" }, "PrintTe
16、mplate":"此处省略打印模板HTML内容", "EstimatedDeliveryTime":"2016-03-06", "Callback":"调用时传入的Callback", "Success": true, "ResultCode": "100", "Reason": "成功" } 5.JAVA对接源码 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;
17、 import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import .HttpURLConnection; import .URL; import .URLEncoder; import java.util.HashMap; import java.util.Map; import com.sun.org.apache.xerces.internal.impl.dv.util.Base64; import java.security.MessageDigest;
18、 /** * * ID和Key请到官网申请: */ public class KdGoldAPIDemo { //电商ID private String EBusinessID="ID请申请"; //电商加密私钥,注意保管,不要泄漏 private String AppKey="KEY请申请"; //请求url, 正式环境地址:http://api.kdniao.cc/api/Eorderservice private String ReqURL="http://testapi.kdniao.cc:8081/api/Eorderservice
19、"; /** * Json方式 电子面单 * @throws Exception */ public String orderOnlineByJson() throws Exception{ String requestData= "{'OrderCode': '118060839871'," + "'ShipperCode':'HHTT'," + "'PayType':1," + "'ExpType':1," +
20、 "'Cost':1.0," + "'OtherCost':1.0," + "'Sender':" + "{" + "'Company':'LV','Name':'Taylor','Mobile':'15018442396','ProvinceName':'上海','CityName':'上海','ExpAreaName':'青浦区','Address':'明珠路73号'}," + "'Receiver':" +
21、 "{" + "'Company':'GCCUI','Name':'Yann','Mobile':'15018442396','ProvinceName':'北京','CityName':'北京','ExpAreaName':'朝阳区','Address':'三里屯街道雅秀大厦'}," + "'Commodity':" + "[{" + "'GoodsName':'鞋子','Goodsquantity':1,'GoodsWeig
22、ht':1.0}]," +
"'Weight':1.0," +
"'Quantity':1," +
"'Volume':0.0," +
"'Remark':'小心轻放'," +
"'IsReturnPrintTemplate':1}";
Map
23、urlEncoder(requestData, "UTF-8")); params.put("EBusinessID", EBusinessID); params.put("RequestType", "1007"); String dataSign=encrypt(requestData, AppKey, "UTF-8"); params.put("DataSign", urlEncoder(dataSign, "UTF-8")); params.put("DataType", "2"); String result=sendPost(ReqURL
24、 params); //根据公司业务处理返回的信息...... return result; } /** * MD5加密 * @param str 内容 * @param charset 编码方式 * @throws Exception */ @SuppressWarnings("unused") private String MD5(String str, String charset) throws Exception { MessageDigest md =
25、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");
26、 } sb.append(Integer.toHexString(val)); } return sb.toString().toLowerCase(); } /** * base64编码 * @param str 内容 * @param charset 编码方式 * @throws UnsupportedEncodingException */ private String base64(String str, String charset) t
27、hrows UnsupportedEncodingException{ String encoded = Base64.encode(str.getBytes(charset)); return encoded; } @SuppressWarnings("unused") private String urlEncoder(String str, String charset) throws UnsupportedEncodingException{ String result = URLEncoder.encode(str, charset);
28、 return result; } /** * 电商Sign签名生成 * @param content 内容 * @param keyValue Appkey * @param charset 编码方式 * @throws UnsupportedEncodingException ,Exception * @return DataSign签名 */ @SuppressWarnings("unused") private String encrypt (String content, St
29、ring 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 发送请求的
30、 URL
* @param params 请求的参数集合
* @return 远程资源的响应结果
*/
@SuppressWarnings("unused")
private String sendPost(String url, Map
31、ngBuilder(); try { URL realUrl = new URL(url); HttpURLConnection conn =(HttpURLConnection) realUrl.openConnection(); // 发送POST请求必须设置如下两行 conn.setDoOutput(true); conn.setDoInput(true); // POST方法 conn.
32、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)
33、"); conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); conn.connect(); // 获取URLConnection对象对应的输出流 out = new OutputStreamWriter(conn.getOutputStream(), "UTF-8"); // 发送请求参数 if (params !
34、 null) {
StringBuilder param = new StringBuilder();
for (Map.Entry
35、m.append("="); param.append(entry.getValue()); System.out.println(entry.getKey()+":"+entry.getValue()); } System.out.println("param:"+param.toString()); out.write(param.toString()); } // flush输出
36、流的缓冲 out.flush(); // 定义BufferedReader输入流来读取URL的响应 in = new BufferedReader( new InputStreamReader(conn.getInputStream(), "UTF-8")); String line; while ((line = in.readLine()) != null) { result.appen
37、d(line); } } catch (Exception e) { e.printStackTrace(); } //使用finally块来关闭输出流、输入流 finally{ try{ if(out!=null){ out.close(); } if(in!=null){
38、 in.close(); } } catch(IOException ex){ ex.printStackTrace(); } } return result.toString(); } } 6.PHP对接源码
39、/电商加密私钥,注意保管,不要泄漏 defined('AppKey') or define('AppKey', '请申请 //请求url,接口正式地址:http://api.kdniao.cc/api/Eorderservice defined('ReqURL') or define('ReqURL', 'http://testapi.kdniao.cc:8081/api/Eorderservice'); //调用获取物流轨迹 //------------------------------------------------------------- //构造电子面单
40、提交信息 $eorder = []; $eorder["ShipperCode"] = "HHTT"; $eorder["OrderCode"] = "PM201604062341"; $eorder["PayType"] = 1; $eorder["ExpType"] = 1; $sender = []; $sender["Name"] = "李先生"; $sender["Mobile"] = "18888888888"; $sender["ProvinceName"] = "李先生"; $sender["CityName"] = "深圳市"; $sender["E
41、xpAreaName"] = "福田区"; $sender["Address"] = "赛格广场5401AB"; $receiver = []; $receiver["Name"] = "李先生"; $receiver["Mobile"] = "18888888888"; $receiver["ProvinceName"] = "李先生"; $receiver["CityName"] = "深圳市"; $receiver["ExpAreaName"] = "福田区"; $receiver["Address"] = "赛格广场5401AB"; $commodityOne
42、 = []; $commodityOne["GoodsName"] = "其他"; $commodity = []; $commodity[] = $commodityOne; $eorder["Sender"] = $sender; $eorder["Receiver"] = $receiver; $eorder["Commodity"] = $commodity; //调用电子面单 $jsonParam = json_encode($eorder, JSON_UNESCAPED_UNICODE); //$jsonParam = JSON($eorder);
43、//兼容php5.2(含)以下
echo "电子面单接口提交内容:
".$jsonParam;
$jsonResult = submitEOrder($jsonParam);
echo "
电子面单提交结果:
".$jsonResult;
//解析电子面单返回结果
$result = json_decode($jsonResult, true);
echo "
返回码:".$result["ResultCode"];
if($result["ResultCode"] == "100") {
echo "
是否
44、成功:".$result["Success"];
}
else {
echo "
电子面单下单失败";
}
//-------------------------------------------------------------
/**
* Json方式 查询订单物流轨迹
*/
function submitEOrder($requestData){
$datas = array(
'EBusinessID' => EBusinessID,
'RequestType' => '1007',
45、'RequestData' => urlencode($requestData) , 'DataType' => '2', ); $datas['DataSign'] = encrypt($requestData, AppKey); $result=sendPost(ReqURL, $datas); //根据公司业务处理返回的信息...... return $result; } /** * post提交数据 * @param string $url 请求Url * @param array $da
46、tas 提交的数据 * @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']
47、'') { $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:" .
48、 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)) && ($hea
49、der == "\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))); } /************************************************************** * * 使用特定function对数组中所






