PHP快递智能查单功能实现对接方法.docx
《PHP快递智能查单功能实现对接方法.docx》由会员分享,可在线阅读,更多相关《PHP快递智能查单功能实现对接方法.docx(17页珍藏版)》请在冰豆网上搜索。
PHP快递智能查单功能实现对接方法
PHP快递智能查单功能实现对接方法
一.接口说明
PC端、移动端应用或网站应用集成运单物流信息查询功能时,只需要录入单号即可完成查询,无需用户输入快递公司。
电商网站要在快递鸟查询或者订阅运单时,可通过单号识别先行判断物流公司后,再订阅到快递鸟。
二.对接描述
1.该接口仅对运单号做出识别,识别可能属于的一家或多家快递公司。
2.接口并不返回物流轨迹,用户可结合即时查询接口和订阅查询接口完成轨迹查询、订阅的动作。
3.接口识别会返回一家或者多家快递公司,返回的数据根据快递鸟大数据分析结果排序,排名靠前的命中率更高。
4.若识别失败,快递鸟返回的匹配结果为空。
5.接口支持的消息接收方式为HTTPPOST,请求方法的编码格式(utf-8):
"application/x-www-form-urlencoded;charset=utf-8"。
三.参数列表
1.请求系统级参数说明
参数名称
类型
说明
必须要求
RequestData
String
请求内容需进行URL(utf-8)编码。
请求内容JSON格式,须和DataType一致。
R
EBusinessID
String
商户ID,请在我的服务页面查看。
R
RequestType
String
请求指令类型:
2002
R
DataSign
String
数据内容签名:
把(请求内容(未编码)+AppKey)进行MD5加密,然后Base64编码,最后进行URL(utf-8)编码。
详细过程请查看Demo。
R
DataType
String
请求、返回数据类型:
只支持JSON格式
R
备注:
R-必填(Required),O-可选(Optional),C-报文中该参数在一定条件下可选(Conditional)。
2.接口地址
API测试地址:
http:
//testapi.kdniao.cc:
8081/Ebusiness/EbusinessOrderHandle.aspx
API正式地址:
http:
//api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx
3.请求内容字段定义
参数名称
类型
说明
是否必须
LogisticCode
String
物流单号
R
4.返回参数定义
参数名称
类型
说明
必须要求
EBusinessID
String
电商用户ID
R
LogisticCode
String
物流单号
R
Success
Bool
成功与否
R
Code
Int
失败原因
O
Shipper
ShipperCode
String
快递公司编码
O
ShipperName
String
快递公司名称
O
四.对接案例
1.JSON请求
{
"LogisticCode":
"3967950525457"
}
2.JSON返回
{
"EBusinessID":
"1257021",
"Success":
true,
"LogisticCode":
"3967950525457",
"Shippers":
[
{
"ShipperCode":
"YD",
"ShipperName":
"韵达快递"
}
]
}
3.PHP对接demo
php
//电商ID
defined('EBusinessID')ordefine('EBusinessID','请到快递鸟官网申请
//电商加密私钥,快递鸟提供,注意保管,不要泄漏
defined('AppKey')ordefine('AppKey','请到快递鸟官网申请
//请求url
//测试地址
defined('ReqURL')ordefine('ReqURL','http:
//testapi.kdniao.cc:
8081/Ebusiness/EbusinessOrderHandle.aspx');
//正式地址
//defined('ReqURL')ordefine('ReqURL','http:
//api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx');
//调用获取物流轨迹
//-------------------------------------------------------------
$logisticResult=getOrderTracesByJson();
echo$logisticResult;
//-------------------------------------------------------------
/**
*Json方式单号识别
*/
functiongetOrderTracesByJson(){
$requestData="{'LogisticCode':
'589707398027'}";
$datas=array(
'EBusinessID'=>EBusinessID,
'RequestType'=>'2002',
'RequestData'=>urlencode($requestData),
'DataType'=>'2',
);
$datas['DataSign']=encrypt($requestData,AppKey);
$result=sendPost(ReqURL,$datas);
//根据公司业务处理返回的信息......
return$result;
}
/**
*post提交数据
*@paramstring$url请求Url
*@paramarray$datas提交的数据
*@returnurl响应返回的html
*/
functionsendPost($url,$datas){
$temps=array();
foreach($datasas$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签名生成
*@paramdata内容
*@paramappkeyAppkey
*@returnDataSign签名
*/
functionencrypt($data,$appkey){
returnurlencode(base64_encode(md5($data.$appkey)));
}
?
>
附:
快递查询接口demo
importjava.io.BufferedReader;
importjava.io.IOException;
importjava.io.InputStreamReader;
importjava.io.OutputStreamWriter;
importjava.io.UnsupportedEncodingException;
import.HttpURLConnection;
import.URL;
import.URLEncoder;
importjava.security.MessageDigest;
importjava.util.HashMap;
importjava.util.Map;
publicclassKdniaoTrackQueryAPI{
//DEMO
publicstaticvoidmain(String[]args){
KdniaoTrackQueryAPIapi=newKdniaoTrackQueryAPI();
try{
Stringresult=api.getOrderTracesByJson("ANE","210001633605");
System.out.print(result);
}catch(Exceptione){
e.printStackTrace();
}
}
//电商ID
privateStringEBusinessID="请到快递鸟官网申请
//电商加密私钥,快递鸟提供,注意保管,不要泄漏
privateStringAppKey="请到快递鸟官网申请
//请求url
privateStringReqURL="http:
//api.kdniao.cc/Ebusiness/EbusinessOrderHandle.aspx";
/**
*Json方式查询订单物流轨迹
*@throwsException
*/
publicStringgetOrderTracesByJson(StringexpCode,StringexpNo)throwsException{
StringrequestData="{'OrderCode':
'','ShipperCode':
'"+expCode+"','LogisticCode':
'"+expNo+"'}";
Mapparams=newHashMap();
params.put("RequestData",urlEncoder(requestData,"UTF-8"));
params.put("EBusinessID",EBusinessID);
params.put("RequestType","1002");
StringdataSign=encrypt(requestData,AppKey,"UTF-8");
params.put("DataSign",urlEncoder(dataSign,"UTF-8"));
params.put("DataType","2");
Stringresult=sendPost(ReqURL,params);
//根据公司业务处理返回的信息......
returnresult;
}
/**
*XML方式查询订单物流轨迹
*@throwsException
*/
publicStringgetOrderTracesByXml()throwsException{
StringrequestData="
xmlversion=\"1.0\"encoding=\"utf-8\"?
>"+
""+
""+
"SF"+
"589707398027"+
"";
Mapparams=newHashMap();
params.put("RequestData",urlEncoder(requestData,"UTF-8"));
params.put("EBusinessID",EBusinessID);
params.put("RequestType","1002");
StringdataSign=encrypt(requestData,AppKey,"UTF-8");
params.put("DataSign",urlEncoder(dataSign,"UTF-8"));
params.put("DataType","1");
Stringresult=sendPost(ReqURL,params);
//根据公司业务处理返回的信息......
returnresult;
}
/**
*MD5加密
*@paramstr内容
*@paramcharset编码方式
*@throwsException
*/
@SuppressWarnings("unused")
privateStringMD5(Stringstr,Stringcharset)throwsException{
MessageDigestmd=MessageDigest.getInstance("MD5");
md.update(str.getBytes(charset));
byte[]result=md.digest();
StringBuffersb=newStringBuffer(32);
for(inti=0;iintval=result[i]&0xff;
if(val<=0xf){
sb.append("0");
}
sb.append(Integer.toHexString(val));
}
returnsb.toString().toLowerCase();
}
/**
*base64编码
*@paramstr内容
*@paramcharset编码方式
*@throwsUnsupportedEncodingException
*/
privateStringbase64(Stringstr,Stringcharset)throwsUnsupportedEncodingException{
Stringencoded=base64Encode(str.getBytes(charset));
returnencoded;
}
@SuppressWarnings("unused")
privateStringurlEncoder(Stringstr,Stringcharset)throwsUnsupportedEncodingException{
Stringresult=URLEncoder.encode(str,charset);
returnresult;
}
/**
*电商Sign签名生成
*@paramcontent内容
*@paramkeyValueAppkey
*@paramcharset编码方式
*@throwsUnsupportedEncodingException,Exception
*@returnDataSign签名
*/
@SuppressWarnings("unused")
privateStringencrypt(Stringcontent,StringkeyValue,Stringcharset)throwsUnsupportedEncodingException,Exception
{
if(keyValue!
=null)
{
returnbase64(MD5(content+keyValue,charset),charset);
}
returnbase64(MD5(content,charset),charset);
}
/**
*向指定URL发送POST方法的请求
*@paramurl发送请求的URL
*@paramparams请求的参数集合
*@return远程资源的响应结果
*/
@SuppressWarnings("unused")
privateStringsendPost(Stringurl,Mapparams){
OutputStreamWriterout=null;
BufferedReaderin=null;
StringBuilderresult=newStringBuilder();
try{
URLrealUrl=newURL(url);
HttpURLConnectionconn=(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;MSIE6.0;WindowsNT5.1;SV1)");
conn.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
conn.connect();
//获取URLConnection对象对应的输出流
out=newOutputStreamWriter(conn.getOutputStream(),"UTF-8");
//发送请求参数
if(params!
=null){
StringBuilderparam=newStringBuilder();
for(Map.Entryentry:
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=newBufferedReader(
newInputStreamReader(conn.getInputStream(),"UTF-8"));
Stringline;
while((line=in.readLine())!
=null){
result.append(line);
}
}catch(Exceptione){
e.printStackTrace();
}
//使用finally块来关闭输出流、输入流
finally{
try{
if(out!
=null){
out.close();
}
if(in!
=null){
in.close();
}
}
catch(IOExceptionex){
ex.printStackTrace();
}
}
returnresult.toString();
}
privatestaticchar[]base64EncodeChars=newchar[]{
'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',