前言
在电商和物流日益紧密融合的今天,提供准确的物流信息查询功能已成为提升用户体验的关键。Laravel框架以其强大的扩展性和灵活性,为开发者提供了集成第三方物流查询服务(如快递鸟)的便捷途径。
本指南将首先引导您如何在Laravel项目中实现快递鸟物流查询功能。通过创建物流查询路由和控制器方法,您将能够轻松接入快递鸟的API,实现物流信息的实时查询。为了保持代码的整洁和可重用性,我们还将探讨如何封装物流查询逻辑到独立的类中,使其可以在多个地方被复用。
在每一步的实施过程中,我们都将强调测试的重要性,通过详细的测试效果验证,确保物流查询功能的准确性和稳定性。最终,您将掌握在Laravel项目中集成并使用快递鸟物流查询服务的关键技能,为您的应用增添更多价值。
1、物流查询管理
我们使用快递鸟平台,相关文档及使用可以上它的官网查看。我们可以使用它的沙箱环境进行测试。
注册,登陆之后
1.1 创建物流查询路由
// 物流查询
$api->get('orders/{order}/express', [OrderController::class, 'express']);
1.2 物流查询控制器方法
// 物流查询
public function express(Order $order) {
$EBusinessID = 'test1730089';
$Appkey = '581b0c9d-1a45-46a6-81e1-cd4ef3dd28cf';
// $ReqURL = 'https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx'; // 正式地址
$ReqURL = 'http://www.kdniao.com/UserCenter/v2/SandBox/SandboxHandler.ashx?action=CommonExcuteInterface'; // 沙箱测试地址
// 准备请求参数
$requestData = "{'OrderCode':'', 'ShipperCode': 'SF', 'LogisticCode':'1234561'}";
$datas = array(
'EBusinessID' => $EBusinessID,
'RequestType' => '1002',
'RequestData' => urlencode($requestData),
'DataType' => 2,
);
$datas['DataSign'] = $this->encrypt($requestData, $Appkey);
// 发送请求
$response = Http::asForm()->post($ReqURL, $datas);
// return json_decode($response);
$resData = json_decode(json_decode($response, true)['ResponseData'], true);
return $this->response->array($resData);
}
// sign签名生成
function encrypt($data, $appkey) {
return urlencode(base64_encode(md5($data.$appkey)));
}
1.3 测试效果
2、封装物流类
像这样物流的查询,我们写在订单里,如果在其他功能板块中也涉及到查询的话,那么又要写一遍,所以我们给它封装起来。
在config
下创建物流配置文件express.php
:
<?php
return [
// 商户id
'EBusinessID' => env('EXPRESS_EBUSINESS_ID'),
// APP KEY
'Appkey' => env('EXPRESS_APP_KEY'),
];
接着在.env
中写入:
# 快递查询配置
EXPRESS_EBUSINESS_ID=你的商户id
EXPRESS_APP_KEY=你的应用key
在app
文件夹下新建Facades
文件夹,再新建Express
文件夹,里面新建Express.php
快递类。在Express
文件夹下新建文件夹Facade
,里面创建Express.php
,我们就认为这个类是快递类的门面。
写入:
<?php
namespace App\Facades\Express\Facade;
use Illuminate\Support\Facades\Facade;
class Express extends Facade
{
/**
* Get the registered name of the component.
*
* @return string
*/
protected static function getFacadeAccessor()
{
return 'Express';
}
}
App\Facades\Express\Express.php
写入真实类:
<?php
namespace App\Facades\Express;
use Illuminate\Support\Facades\Http;
class Express
{
// 商户ID
protected $EBusinessID;
// api key
protected $AppKey;
// url模式
protected $mode;
public function __construct()
{
$config = config('express');
$this->EBusinessID = $config['EBusinessID'];
$this->AppKey = $config['AppKey'];
$this->mode = $config['mode'] ?? 'prod';
}
// 物流查询 ShipperCode=>物流公司, LogisticCode=>物流单号
public function track($ShipperCode, $LogisticCode)
{
// 准备请求参数
$requestData = "{'OrderCode':'', 'ShipperCode': '{$ShipperCode}', 'LogisticCode':'${LogisticCode}'}";
// 发送请求
$response = Http::asForm()->post(
$this->url('track'),
$this->formatReqData($requestData, '1002')
);
return $this->formatResData($response);
}
/**
* 返回API url
*/
protected function url($type)
{
$url = [
'track' => [
'dev' => 'http://www.kdniao.com/UserCenter/v2/SandBox/SandboxHandler.ashx?action=CommonExcuteInterface', // 开发环境url
'prod' => 'https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx' // 生产环境url
]
];
return $url[$type][$this->mode];
}
/**
* 格式化请求数据
*/
protected function formatReqData($requestData, $RequestType)
{
$datas = array(
'EBusinessID' => $this->EBusinessID,
'RequestType' => $RequestType,
'RequestData' => urlencode($requestData),
'DataType' => 2,
);
$datas['DataSign'] = $this->encrypt($requestData);
return $datas;
}
/**
* 格式化响应数据
*/
protected function formatResData($result)
{
$result = json_decode($result, true);
if ($result['Success'] == false) {
return $result['ResponseData'];
}
$result2 = json_decode($result['ResponseData'], true);
if ($result2['Success'] == false) {
return $result2['Reason'];
}
return $result2;
}
// sign签名生成
protected function encrypt($data)
{
return urlencode(base64_encode(md5($data . $this->AppKey)));
}
}
弄完门面后需要在app\Providers\AppServiceProvider.php
注册:
// 注册自定义门面
$this->app->singleton('Express', function () {
return new Express();
});
我们已经将查询快递封装成类,并且也自定义了门面,所以我们在订单那里进行快递查询时修改:
/**
* 物流查询
*/
public function express(Order $order) {
if ($order->status != 3 || $order->status != 4) {
return $this->response->errorBadRequest('订单暂无物流信息!');
}
// 未注册门面使用new
// $express = new Express();
// $result = $express->track('SF','1234561'); // 沙箱测试快递 以及快递单号,快递的简称可以在快递鸟上按照它给的格式传
// $result = $express->track($order->express_type,$order->express_no); // 正式发货的订单号里去拿
// 我们注册了自定义门面 可以不使用new了
$result = Express::track('SF','1234561'); // 沙箱测试快递 以及快递单号,快递的简称可以在快递鸟上按照它给的格式传
// Express::track($order->express_type,$order->express_no); // 正式发货的订单号里去拿
if (!is_array($result)) {
return $this->response->errorBadRequest($result);
}
return $this->response->array($result);
}
3、测试效果
在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。