ThinkPHP3.2 饿了么蜂鸟配送封装类

浏览:1577 发布日期:2018/05/24 分类:功能实现 关键字: php tp 饿了么 蜂鸟配送 thinkphp thinkphp3.2 封装类
ThinkPHP3.2 饿了么蜂鸟配送封装类(适合小白,本封装类只做参考,也欢迎大牛指点错误) ,调用的时候 先去config里配置好以下代码中的C()里的参数。


把以下封装类,直接丢入/ThinkPHP/Library/Think文件夹里。
在控制器里直接 use Think\Ele; 再 new Ele()调用<?php
/**
 * 饿了么蜂鸟快递封装类.
 * User: 17771800017@163.com
 * Date: 2018/5/24
 * Time: 9:17
 */

namespace Think;

define('APPID', C('FNPS.APPID'));       //蜂鸟配送APPID
define('SecretKey', C('FNPS.SecretKey'));  //蜂鸟配送SecretKey

class Ele
{
    private $salt = '';                     //随机数
    private $formalUrl = [];                //正式地址
    private $adjustingUrl = [];             //联调地址

    /**
     * 赋值各个地址
     * Ele constructor.
     */
    function __construct()
    {
        $this->formalUrl = C('FNPS.FORMAL_URL');
        $this->adjustingUrl = C('FNPS.ADJUSTING_URL');
        $this->salt = mt_rand(1000, 9999);
    }

    /**
     * 获取token
     * @return mixed
     * Date: 2018/5/24
     * Time: 10:25
     */
    public function getToken()
    {
        if(S('eleToken')&&!empty(S('eleToken'))){
            return S('eleToken');
        }else{
            $url = $this->requestUrl(true, 'GET_TOKEN') . '?app_id=' . APPID . '&salt=' . $this->salt . '&signature=' . $this->tokenSign();
            $postUrl = $this->requestHttp($url);
            if ($postUrl['code'] == 200 && isset($postUrl['data']['access_token'])) {
                S('eleToken',$postUrl['data']['access_token'],3600*23);
                return S('eleToken');
            }
            return $postUrl;  //错误会返回code
        }

    }

    /**
     * 请求地址
     * @param string $type (1为正式地址,0为联调地址)
     * @param string $urlType
     * @return mixed|string
     * Date: 2018/5/24
     * Time: 10:26
     */
    private function requestUrl($type = '', $urlType = '')
    {
        $url = '';
        switch ($type) {
            case false:
                $url = $this->adjustingUrl;
                break;
            case true:
                $url = $this->formalUrl;
                break;
        }
        return isset($url[$urlType]) ? $url[$urlType] : '';
    }

    /**
     * 获取token时的签名
     * @return string
     * Date: 2018/5/24
     * Time: 10:26
     */
    private function tokenSign()
    {
        $sign = 'app_id=' . APPID . '&salt=' . $this->salt . '&secret_key=' . SecretKey;
        return md5(urlencode($sign));
    }

    /**
     * 蜂鸟配送
     * @param $data
     * @return mixed
     * Date: 2018/5/24
     * Time: 11:19
     */
    public function eleDistribution($data)
    {
        $url = $this->requestUrl(true, 'ELE_DISTRIBUTION');
        $distributionData = $this->distributionData($data);
        return $this->requestReturn($url, $distributionData);
    }

    /**
     * 签名
     * @param $appId
     * @param $token
     * @param $urlencodeData
     * @param $salt
     * @return string
     * Date: 2018/5/24
     * Time: 11:18
     */
    private function sign($appId, $token, $urlencodeData, $salt)
    {
        $sign = 'app_id=' . $appId . '&access_token=' . $token
            . '&data=' . $urlencodeData . '&salt=' . $salt;
        return md5($sign);
    }

    /**
     * 配送数组
     * @param array $data
     * @return array
     * Date: 2018/5/24
     * Time: 11:06
     */
    private function distributionData($data = [])
    {
        $distributionData = [];
        //配送所需所有参数
        $allKey = [
            'partner_remark', 'partner_order_code', 'notify_url', 'order_type', 'chain_store_code', 'transport_info', 'order_add_time',
            'order_total_amount', 'order_actual_amount', 'order_weight', 'order_remark', 'is_invoiced', 'invoice', 'order_payment_status',
            'order_payment_method', 'is_agent_payment', 'require_payment_pay', 'goods_count', 'require_receive_time', 'serial_number',
            'receiver_info', 'items_json',
        ];
        //允许为空的参数
        $allowEmptykey = ['partner_remark', 'transport_id', 'transport_remark', 'order_add_time', 'order_weight', 'order_remark', 'invoice', 'require_payment_pay',
            'require_receive_time', 'receiver_second_phone', 'item_id', 'item_size', 'item_remark', 'agent_purchase_price', 'serial_number'];
        foreach ($allKey as $val) {
            if (in_array($val, $allowEmptykey) && isset($data[$val]) && $data[$val] !== '' || !in_array($val, $allowEmptykey)) {
                $distributionData[$val] = isset($data[$val]) ? $data[$val] : '';
            }
        }
        return $distributionData;
    }

    /**
     * 同步取消订单
     * @param array $data
     * @return mixed
     * Date: 2018/5/24
     * Time: 11:38
     */
    public function cancelOrder($data = [])
    {
        $url = $this->requestUrl(true, 'CANCEL_ORDER');
        $cancelData = ['partner_order_code' => $data['partner_order_code'],
            'order_cancel_reason_code' => $data['order_cancel_reason_code'],
            'order_cancel_code' => $data['order_cancel_code'],
            'order_cancel_time' => $data['order_cancel_time'],];
        if (isset($data['order_cancel_description']) && !empty($data['order_cancel_description'])) {
            $cancelData['order_cancel_description'] = $data['order_cancel_description'];
        }
        return $this->requestReturn($url, $cancelData);
    }

    /**
     * 查询订单
     * @param array $data
     * @return mixed
     * Date: 2018/5/24
     * Time: 11:38
     */
    public function getOrder($data = [])
    {
        $url = $this->requestUrl(true, 'FIND_ORDER');
        $orderData = ['partner_order_code' => $data['partner_order_code']];
        return $this->requestReturn($url, $orderData);
    }

    /**
     * 投诉订单
     * @param array $data
     * @return mixed
     * Date: 2018/5/24
     * Time: 12:02
     */
    public function complaintOrder($data = [])
    {
        $url = $this->requestUrl(true, 'COMPLAINT_ORDER');
        $complaintData = ['partner_order_code' => $data['partner_order_code'],
            'order_complaint_code' => $data['order_complaint_code'],
            'order_complaint_time' => $data['order_complaint_time'],];
        if (isset($data['order_complaint_desc']) && !empty($data['order_complaint_desc'])) {
            $cancelData['order_complaint_desc'] = $data['order_complaint_desc'];
        }
        return $this->requestReturn($url, $complaintData);
    }

    /**
     * 查询骑手位置
     * @param array $data
     * @return mixed
     * Date: 2018/5/24
     * Time: 11:38
     */
    public function getRider($data = [])
    {
        $url = $this->requestUrl(true, 'FIND_RIDER');
        $orderData = ['partner_order_code' => $data['partner_order_code']];
        return $this->requestReturn($url, $orderData);

    }

    /**
     * 请求返回
     * @param string $url
     * @param array $data
     * @return mixed
     * Date: 2018/5/24
     * Time: 11:51
     */
    private function requestReturn($url = '', $data = [])
    {
        $data = urlencode(json_encode($data, JSON_UNESCAPED_UNICODE));
        $salt = $this->salt;
        $sign = $this->sign(APPID, $this->getToken(), $data, $salt);
        $requestData = ['app_id' => APPID,
            'data' => $data,
            'salt' => $salt,
            'signature' => $sign];
        return $this->requestPost($url, json_encode($requestData,JSON_UNESCAPED_UNICODE));

    }

    /**
     * post请求
     * @param $url
     * @param $param
     * @param string $method
     * @return bool|mixed
     * Date: 2018/5/28
     * Time: 11:12
     */
    public  function requestPost($url, $param, $method = "POST")
    {
        if (empty($url) or empty($param)) {
            throw new InvalidArgumentException('Params is not of the expected type');
        }
        if (!empty($param) and is_array($param)) {
            $param = urldecode(json_encode($param));
        } else {
            $param = strval($param);
        }

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($ch, CURLOPT_HEADER, false);
        curl_setopt($ch, CURLOPT_TIMEOUT, 30);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);     //  不进行ssl 认证
        if (strcmp($method, "POST") == 0) {  // POST 操作
            curl_setopt($ch, CURLOPT_POST, true);
        } else if (strcmp($method, "DELETE") == 0) { // DELETE操作
            curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
        } else {
            throw new InvalidArgumentException('Please input correct http method, such as POST or DELETE');
        }

        curl_setopt($ch, CURLOPT_POSTFIELDS, $param);
        curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-type: Application/json'));
        $result = curl_exec($ch);
        $code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
        curl_close($ch);
        if (!empty($result) and $code == '200') {
            return json_decode($result,true);
        }
        return false;
    }
    /**
     * GET请求
     * @param $url
     * @param null $data
     * @return mixed
     * Date: 2018/5/24
     * Time: 9:53
     */
    private function requestHttp($url, $data = null)
    {
        $ch = curl_init();
        if (class_exists('/CURLFile')) {
            curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
        } else {
            if (defined('CURLOPT_SAFE_UPLOAD')) {
                curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false);
            }
        }

        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        if (stripos($url, "https://") !== false) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
        }
        if ($data != null) {
            curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
            curl_setopt($ch, CURLOPT_POST, true);
            curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
        }
        $res = curl_exec($ch);

        if (curl_errno($ch) != 0) {
            var_dump('错误号:' . curl_errno($ch) . '错误信息' . curl_error($ch));
        }
        curl_close($ch);
        return json_decode($res, true); //返回一个数组
    }


}
评论( 相关
后面还有条评论,点击查看>>