| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 | <?phpnamespace app\common\library;use app\common\model\Order;use app\common\model\ElectronicsOrder;use app\common\model\OrderElectronics;use fast\Http;/** * 电子面单 * @ DateTime 2021-06-11 * @  */class KdApiExpOrder{    protected static $reqUrl = '';    /**     * @ DateTime 2021-06-11     * @      * @electronics [type] $electronics     * @electronics [type] $sender     * @return void     */    public static function create($order_id, $electronics_id)    {        $order = Order::with(['OrderGoods'])            ->field('o.*,p.name province_name,c.name city_name,a.name area_name')            ->alias('o')            ->join('shop_address d', 'o.address_id=d.id', 'LEFT')            ->join('shop_area p', 'd.province_id=p.id', 'LEFT')            ->join('shop_area c', 'd.city_id=c.id', 'LEFT')            ->join('shop_area a', 'd.area_id=a.id', 'LEFT')            ->where('o.id', $order_id)            ->find();        if ($order->orderstate == 1) {            throw new \Exception('订单已取消,不支持生成电子面单');        }        if ($order->orderstate == 2) {            throw new \Exception('订单已失效,不支持生成电子面单');        }        if ($order->orderstate == 3) {            throw new \Exception('订单已完成,不支持生成电子面单');        }        if (!$order->paystate) {            throw new \Exception('订单未支付,不支持生成电子面单');        }        if ($order->shippingstate) {            throw new \Exception('订单已发货,不支持生成电子面单');        }        $electronics = ElectronicsOrder::with(['Shipper'])->where('id', $electronics_id)->find();        if (empty($order)) {            throw new \Exception('未找到订单');        }        if (empty($electronics)) {            throw new \Exception("电子面单模板不存在");        }        if (empty($electronics->shipper)) {            throw new \Exception("快递公司不存在");        }        if (empty($order->order_goods)) {            throw new \Exception("订单商品不存在");        }        $Commodity = [];        $quantity = 0;        $Weight = 0;        foreach ($order->order_goods as $item) {            $Commodity[] =  [                'GoodsName' => $item['title'],                'GoodsCode' => $item['goods_id'] . '_' . $item['goods_sku_id'],                'Goodsquantity' => $item['nums'],                'GoodsPrice' => $item['price'],                'GoodsWeight' => $item['weight'],                // 'GoodsVol' => 0,                'GoodsDesc' => $item['attrdata']            ];            $quantity = bcadd($quantity, $item['nums']);            $Weight = bcadd($Weight, $item['weight']);        }        // 组装应用级参数        $requestData = [            'MemberID'  => $order->user_id,            'OrderCode' => $order->order_sn,            'ShipperCode' => $electronics->shipper->shipper_code,            'LogisticCode'  => $electronics->logistic_code,            'CustomerName' => $electronics->customer_name,            'CustomerPwd' => $electronics->customer_pwd,            // 'ThrOrderCode' => '1234567890',            'SendSite'  => $electronics->send_site,            'PayType'  => $electronics->paytype,            'MonthCode'  => $electronics->month_code,            'IsReturnSignBill'  => $electronics->is_return_sign_bill,            'OperateRequire'  => $electronics->operate_require,            'ExpType'  => $electronics->exp_type,            'Cost'  => $order->shippingfee,            'OtherCost'  => 0,            'Sender'  => [                'Company' => $electronics->company,                'Name' => $electronics->name,                'Tel' => $electronics->tel,                'Mobile' => $electronics->mobile,                'PostCode' => $electronics->post_code,                'ProvinceName' => $electronics->province_name,                'CityName' => $electronics->city_name,                'ExpAreaName' => $electronics->exp_area_name,                'Address' => $electronics->address            ],            'Receiver' => [                'Company' => '',                'Name' => $order->receiver,                'Tel' => '',                'Mobile' => $order->mobile,                'PostCode' => $order->zipcode,                'ProvinceName' => $order->province_name,                'CityName' => $order->city_name,                'ExpAreaName' => $order->area_name,                'Address' => $order->address            ],            'Commodity' => $Commodity,            'IsNotice' => $electronics->is_notice,            'StartDate' => '',            'EndDate' => '',            'AddService' => [],            'Weight' => $Weight,            'Quantity' => $quantity,            // 'Volume' => 0,            'IsReturnPrintTemplate' => $electronics->is_return_temp,            'Remark' => $electronics->remark        ];        self::setReqUrl();        $res = self::sendPost($requestData, 1007);        //生成电子面单后,替换快递单号        if (isset($res['Success']) && $res['Success']) {            $order->expressno = $res['Order']['LogisticCode'];            $order->expressname = $electronics['shipper']['name'];            $order->save();        }        //入库        OrderElectronics::push($res, $order->order_sn, $electronics->customer_name, $electronics->customer_pwd);        return $res;    }    /**     * @ DateTime 2021-06-11     * @ 电子面单取消     * @return void     */    public static function cancel($param)    {        // 组装应用级参数        $requestData = [            'ShipperCode' => $param['shipper_code'],            'OrderCode' => $param['order_sn'],            'ExpNo' => $param['logistic_code'],            'CustomerName' => $param['customer_name'],            'CustomerPwd' => $param['customer_pwd']        ];        self::setReqUrl();        return self::sendPost($requestData, 1147);    }    /**     * @ DateTime 2021-06-11     * @ 单号余量查询     * @return void     */    public static function getOrderTraces($param)    {        $requestData = [            'ShipperCode' => $param['shipper_code'],            'StationCode' => '',            'StationName' => '',            'CustomerName' => $param['customer_name'],            'CustomerPwd' => $param['customer_pwd']        ];        self::setReqUrl();        return self::sendPost($requestData, 1127);    }    /**     * @ 物流查询     * @param [type] $param     * @return void     */    public static function getLogisticsQuery($param)    {        $requestData = [            'OrderCode' => $param['order_sn'],            'ShipperCode' => $param['shipper_code'],            'LogisticCode' => $param['logistic_code'],        ];        self::setReqUrl(1);        return self::sendPost($requestData, 1002);    }    //设置url    protected static function setReqUrl($type = 0)    {        $config = get_addon_config('shop');        if ($config['api_mode'] == 'sandbox') {            self::$reqUrl = 'http://sandboxapi.kdniao.com:8080/kdniaosandbox/gateway/exterfaceInvoke.json';        } else {            switch ($type) {                case 1: //即时物流                    self::$reqUrl = 'https://api.kdniao.com/Ebusiness/EbusinessOrderHandle.aspx';                    break;                default: //电子面单                    self::$reqUrl = 'https://api.kdniao.com/api/EOrderService';            }        }    }    /**     * @ DateTime 2021-06-11     * @ 请求     * @return void     */    protected static function sendPost($requestData, $requestType)    {        $requestData = json_encode($requestData, JSON_UNESCAPED_UNICODE);        $config = get_addon_config('shop');        // 组装系统级参数        $data = array(            'EBusinessID' => $config['EBusinessID'],            'RequestType' => $requestType,            'RequestData' => urlencode($requestData),            'DataType' => '2',        );        $data['DataSign'] = self::encrypt($requestData, $config['kdNiaoApiKey']);        //以form表单形式提交post请求,post请求体中包含了应用级参数和系统级参数        $result = Http::post(self::$reqUrl, $data);        return (array)json_decode($result, true);    }    /**     * Sign签名生成     * @electronics data 内容        * @electronics ApiKey ApiKey     * @return DataSign签名     */    protected static function encrypt($data, $apiKey)    {        return urlencode(base64_encode(md5($data . $apiKey)));    }}
 |