laravel物流地址查询

一、物流查询管理

我们使用快递鸟平台,相关文档及使用可以上它的官网查看。我们可以使用它的沙箱环境进行测试。
注册,登陆之后
在这里插入图片描述
在这里插入图片描述

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 测试效果

在这里插入图片描述

二、封装物流类

像这样物流的查询,我们写在订单里,如果在其他功能板块中也涉及到查询的话,那么又要写一遍,所以我们给它封装起来。
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);
    }

在这里插入图片描述

三、测试效果

在这里插入图片描述

在学习的php的路上,如果你觉得本文对你有所帮助的话,那就请关注点赞评论三连吧,谢谢,你的肯定是我写博的另一个支持。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

你华还是你华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值