☞ 背景
- 最近进行网站后台开发,需要实现物流的即时查询,
为了方便以后的业务需求,经过比较,最后选择使用 第三方物流 ——【快递鸟】 - 同时,在此进行整理,希望能帮到有需求的道友们,谢谢 …
官方文档: 快递鸟 —— 即时查询 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;
}
④. 效果展示截图
☞ [重要提示]:
代码逻辑梳理,以及整体业务设计构化
- 通过上面核心源码的展示,你应该会注意到
调用其方法,必须要传入 快递公司编码 和 物流单号 这两个参数
- 好在,官方提供了 快递公司编码, 所以,鄙人的设计思路如下:
1. 根据官方提供的快递公司编码 Excel 表
取出其中的 "快递公司"和"编码"两列数据存储到本地数据表
如果使用的快递数量较集中,可以自己建表输入
如果是通用性的快递使用,建议直接对 excel 表转化为 mysql (或其他数据表)存储
如果需要进行
excel
表的导入操作,可直接参考对应文章: ThinkPHP5.1 excel 表的导入导出操作 (PHPExcel)
2. 在后台操作人员输入快递单号时
同时要求选择快递公司,获得 "编码"
从而保证,在数据表中,存储的快递单号唯一匹配到一个编码,继而方便后面进行快递信息查询时,可同时获得所需的两个参数.
- 参考文章 —— PHP实现物流查询(通过快递网API实现)
☞ >>> 源码上传 >>>
☞ 附录
①. 为什么我选择使用 快递鸟API
首先,我拥有一个,测试物流单号:
640041334612 (中通快递)
,然后使用多个快递查询服务,效果如下:
注意,毕竟是几年前的对比,此时或许有了优化!!
通過比較发现:
1. "快递100" 没有查到结果;
"爱查快递" 得出的结果并不是真实的物流信息
2. "快递网" 能查到快递信息,但是询问服务人员时知晓:
要么网站上添加对方链接(我的管理后台以及小程序、app是不能这样玩的);
要么需要进行套餐定制,最低的大概一年1000
—— (前期网站是不需要那么大的 查询业务的,感觉浪费),而且,我不喜欢官网的设计风格(任性了)
3. "快递鸟",最让我动心的是那个 "限500次/天(即时查询)" 是免费的
对于业务量前期不大的网站足够使用,即便后期有需要,也可以直接进行套餐升级
【但是,如今免费版本,仅支持三个物流的查询!!!】
②.快递 100 参考方式
(2021-02-23)
-
最近对之前项目的物流查询进行续费操作时
发现用不了太多的查询次数
但是,快递鸟没有按次数计费的业务
于是,发现快递100
对于业务量不大的网站,提供多项选择业务 -
在此,提供一下,简单的实现方式
快递100实时快递查询接口
-
参考代码如下:
/** * 快递100 物流信息获取 API * 测试代码已完成,后期可使用 * @param string $strCom 物流代码 * @param string $strNum 物流单号 * @param string $strPhone 收、寄件人的电话号码(手机和固定电话均可,只能填写一个,顺丰单号必填,其他快递公司选填。如座机号码有分机号,分机号无需上传。) * @return array */
public function getOrderTracesByKd100Json(
$strCom = 'shunfeng', $strNum = 'SF1306899205932', $strPhone = 'phone')
{
//参数设置
$key = 'CTjhulIU7xxxx'; //客户授权key
$customer = 'B714D3D08F29CFxxxxxxxxxxxxxxxxxxxx'; //查询公司编号
$param = array(
'com' => $strCom, //快递公司编码
'num' => $strNum, //快递单号
'phone' => $strPhone, //手机号
'from' => '', //出发地城市
'to' => '', //目的地城市
'resultv2' => '1' //开启行政区域解析
);
//请求参数
$post_data = array();
$post_data["customer"] = $customer;
$post_data["param"] = json_encode($param);
$sign = md5($post_data["param"] . $key . $post_data["customer"]);
$post_data["sign"] = strtoupper($sign);
$url = 'http://poll.kuaidi100.com/poll/query.do'; //实时查询请求地址
$params = "";
foreach ($post_data as $k => $v) {
$params .= "$k=" . urlencode($v) . "&"; //默认UTF-8编码格式
}
$post_data = substr($params, 0, -1);
//发送post请求
$ch = curl_init();
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_POSTFIELDS, $post_data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$result = curl_exec($ch);
$data = str_replace("\"", '"', $result);
//TODO 物流信息都在 $data 中,根据自己的需求进行提取
$data = json_decode($data, true);
if ($data['status'] == '200') {
$xxxData = $data['data'];
foreach ($xxxData as $key => $val) {
$xxxData[$key]['AcceptTime'] = $val['time'];
$xxxData[$key]['AcceptStation'] = $val['context'];
}
$opResult['Traces'] = $xxxData;
} else {
$opResult['Traces'] = null;
}
//var_dump($opResult);
return $opResult;
}
优化建议
-
首先,通过多第三方物流服务的比较会发现
基本都满足同一个订单号,一天内查询多次都记为一次
但是,第二天再次查询就会计数加一 -
为了减少对第三方接口的频繁调用
可以将当天第一次查询的物流单号及其物流信息缓存
如果一来,当天就不会再访问物流接口
假设场景
当下有恶意攻击用户,想浪费我们网站对物流接口的次数调用
不断对各种物流单号做查询请求
此时,我们要考虑的就是对恶意请求的拦截处理
比如只有在商品订单中记录的物流单号,才可进行接口调用
如果条件允许,也可设置为每天最多对同一个订单号查三次,多余的查询直接访问缓存
其次,注意对已经收货的订单号
限制其对物流接口的调用,以避免资源浪费
可以设计为数据库标记位变动 “已收货”,不再执行查询接口操作 ...
具体业务需求,可根据自己的实际情况做优化
今天的文章快递查询系统源码_丹鸟快递属于哪家快递[通俗易懂]分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/59019.html