背景
最近进行网站后台开发,需要实现物流的即时查询,发现之前集成的 快递100物流查询 API ——【PHP 快递查询源码资源】 已经不能正常使用了; 为了方便以后的业务需求,经过比较,最后选择使用 第三方物流 ——【快递鸟】
同时,在此进行整理,希望能帮到有需求的道友们,谢谢 …
官方文档: 快递鸟 —— 即时查询API
开发框架:ThinkPHP5.1.2
【提示】(2020-02-09)
当前,免费版只可以支持三通物流信息的查询,如果想查询其他物流信息,需购买其他产品服务;同时升级购买后根据技术对接,尚需要进行必要参数的修整,针对京东、顺丰物流注意CustomerName参数的补充
☞ 开发步骤
①. 前期准备
首先要进行快递鸟账号的注册
并根据对方的要求,完善用户申请。
然后,根据自己的需求,开通所需服务(如果只是进行物流信息的查询,以当前业务查询次数较少为例):
②. 集成类的使用
首先需要登录 快递鸟
获取账号的 用户ID 和 API key
对所提供源码中的 集成类 BirdExpress.php ,进行配置项的替换操作
然后
将集成类整合到你的项目框架,根据框架规则进行必要修改(框架不同规则自然多数不同,本人为 ThinkPHP5.1.2)
下图为简单的调用测试:
注意【2019.06.10 补充】:
测试发现,线上的 Linux 系统下无法识别命名空间大小写情况,在此建议 namespace app\api\Controller,都改成小写字母
③. 核心处理方法源码
首先,官方的代码 demo获得的物流信息是正序展示的
为了方便物流信息的倒序展示,我进行了对数组Traces 的反转操作
/**
* 核心方法
* Json方式 查询订单物流轨迹
* @param string $ShipperCode 快递公司编码
* @param string $LogisticCode 物流单号
* @param int $arrayFlag 是否进行数组转化标志 默认0:否 1:转化
* 参考规则举例:
* $requestData = "{'OrderCode':'','ShipperCode':'ZTO','LogisticCode':'640041334612'}";
* @return result 包含即时物流信息的 Json数据
*/
public function getOrderTracesByJson($ShipperCode = "",$LogisticCode = "",$arrayFlag = 0)
{
$requestData = "{
'OrderCode':'',
'ShipperCode':'$ShipperCode',
'LogisticCode':'$LogisticCode'
}";
$postData = array(
'EBusinessID' => $this->EBusinessID,
'RequestType' => '1002',//接口指令1002
'RequestData' => urlencode($requestData),
'DataType' => '2',
);
$postData['DataSign'] = $this->encrypt($requestData, $this->AppKey);
$result = $this->sendPost($this->ReqURL, $postData);
//根据公司业务处理返回的信息......
if ($arrayFlag){
$result = json_decode($result,true);
//TODO 方便物流信息的倒序展示,进行数组反转
$result['Traces'] = array_reverse($result['Traces']);
}
return $result;
}
<?php
class Ship
{
private $EBusinessID; //商户id
private $AppKey; //商户key
private $ReqURL; //请求地址
public function __construct()
{
$this->EBusinessID = '自己申请的用户id';
$this->AppKey = '自己申请的key';
$this->ReqURL = 'http://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx';
// $this->ReqURL = 'http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json';
}
public function lookLogistics(){
$ShipperCode = 'YTO';
$LogisticCode = "YT4727018370468";
return $e=$this->getOrderTracesByJson($ShipperCode,$LogisticCode,1);
}
public function getOrderTracesByJson($ShipperCode = "",$LogisticCode = "",$arrayFlag = 0){
$requestData = "{
'OrderCode':'',
'ShipperCode':'$ShipperCode',
'LogisticCode':'$LogisticCode'
}";
$datas = array(
'EBusinessID' => $this->EBusinessID,//商户ID
'RequestType' => '1002',
'RequestData' => urlencode($requestData),
'DataType' => '2',
);
$datas['DataSign'] = $this->encrypt($requestData, $this->AppKey);//这里填写商户的key
$result=$this->sendPost($this->ReqURL, $datas);
//根据公司业务处理返回的信息......
// if ($arrayFlag){
// $result = json_decode($result,true);
// //TODO 方便物流信息的倒序展示,进行数组反转
// $result['Traces'] = array_reverse($result['Traces']);
// }
// p($json);die;
return $result;
}
/**
* post提交数据
* @param string $url 请求Url
* @param array $datas 提交的数据
* @return url响应返回的html
*/
protected 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 (empty($url_info['port'])) {
$url_info['port'] = 80;
}
$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签名
*/
public function encrypt($data, $appkey) {
return urlencode(base64_encode(md5($data.$appkey)));
}
}
查询Api接口定义
系统级输入参数
参数名称 | 类型 | 必须要求 | 说明 |
---|---|---|---|
RequestData | String | R | 请求内容,JSON或XML格式,须和DataType一致 |
EBusinessID | String | R | 用户ID |
RequestType | String | R | 请求指令类型:1002 |
DataSign | String | R | 数据内容签名 |
DataType | String | O | 请求、返回数据类型:1-xml,2-json;默认为xml格式 |
应用级输入参数
参数名称 | 类型 | 必须要求 | 说明 |
---|---|---|---|
OrderCode | varchar(50) | O | 订单编号 |
ShipperCode | varchar(10) | R | 快递公司编码 |
LogisticCode | varchar(50) | R | 物流单号 |
返回结果参数
参数名称 | 类型 | 必须要求 | 说明 |
---|---|---|---|
EBusinessID | Int | R | 电商用户ID |
OrderCode | Varchar(50) | O | 订单编号 |
ShipperCode | varchar(10) | R | 快递公司编码 |
LogisticCode | Varchar(50) | R | 物流运单号 |
Success | Bool | R | 成功与否 |
Reason | Varchar(50) | O | 失败原因 |
State | Int | R | 物流状态1:已取件2:在途中3:签收 |
Traces | Varchar(Max) | R | 物流轨迹详情 |
物流轨迹详情
参数名称 | 类型 | 必须要求 | 说明 |
---|---|---|---|
AcceptTime | DateTime | R | 时间 |
AcceptStation | Varchar(50) | R | 描述 |
Remark | Varchar(150) | O | 备注 |