OrderController.php 6.3 KB
<?php
/**
 * Created by PhpStorm.
 * User: ruidiudiu
 * Date: 2018/11/24
 * Time: 8:54
 */

namespace app\portal\controller;


use cmf\controller\HomeBaseController;
use think\Db;
use wxapp\pay\WeixinPay;

/**
 * @title 订单相关接口
 * @description 订单相关接口
 * @group 订单相关接口
 */
class OrderController extends HomeBaseController{

//    /**
//     * @title 生成订单
//     * @description 生成订单,加入开始时间和用户id
//     * @author 董瑞恩
//     * @url /portal/order/createOrder
//     * @method GET
//     *
//     * @param name:users_id type:String require:1 default:无 other: desc:用户id
//     * @param name:name type:String require:1 default:无 other: desc:设备名称
//     *
//     */
    public function createOrder($users_id,$name){
        $order=[
            'order_no' => cmf_get_order_sn(),
            'eq_name' => $name,
            'users_id' => $users_id,
            'start_time' => time(),
            'state' => 1
        ];
        try{
            Db::startTrans();
            Db::name('users')->where('id',$users_id)->update(['is_use'=>1,'order_no'=>$order['order_no']]);
            Db::name('order')->insert($order);
        }catch (\Exception $exception){
            Db::rollback();
            $data=[
                'state'=>false,
                'message'=>$exception->getMessage()
            ];
            return $data;
        }
        Db::commit();
        $data=[
            'state'=>true,
            'order_no' => $order['order_no']
        ];
        return $data;
    }

//    /**
//     * @title 完成订单
//     * @description 订单完成,加入结束时间和结算费用,并调用微信统一下单
//     * @author 董瑞恩
//     * @url /portal/order/order
//     * @method GET
//     *
//     * @param name:users_id type:String require:1 default:无 other: desc:用户id
//     *
//     * @return data:返回用于调用支付的参数
//     */
    public function order($users_id,$name){
        $order= Db::name('order')->where(['users_id'=>$users_id,'state'=>1])->find();
        $end_time=time();
        $price=$this->getPrice($order['start_time'],$end_time);
        $time=ceil(($end_time-$order['start_time'])/3600);
        $data=[
            'end_time'=>$end_time,
            'time' => $time,
            'price' => $price,
            'state' => 2
        ];
        try{
            Db::startTrans();
            Db::name('users')->where('id',$users_id)->update(['is_use'=>0,'order_no'=>null]);
            Db::name('equipment')->where('name',$name)->update(['use'=>0]);
            Db::name('order')->where('order_no',$order['order_no'])->update($data);
        }catch (\Exception $exception){
            Db::rollback();
            $data=[
                'state'=>false,
                'message'=>'数据库操作失败',
                'error' =>$exception->getMessage()
            ];
            $this->apiResponse(200,'success',$data);
        }
        Db::commit();
        //调起支付
        $this->pay($order['order_no']);

    }

    public function getPrice($start_time=1543298302,$end_time=1543303733){
        $cost=Db::name('cost')->where('id',1)->find();
        $interval = Db::name('interval')->where('id',1)->find();

        $stateTime=strtotime(date('H:i:s',$interval['start_time']));
        $endTime=strtotime(date('H:i:s',$interval['end_time']));

        //判断是否跨天
        if ($endTime < $stateTime){
            $stateTime-=86400;
        }
        dump(date('Y-m-d H:i:s',$start_time));
        dump(date('Y-m-d H:i:s',$end_time));

        //不跨天处理方法



        //判断是否在时间段内
        if ($end_time > $interval['start_time'] && $end_time < $interval['end_time']){
            //全部处于时间段中
            if ($start_time > $interval['start_time']){
                $time=ceil(($end_time-$start_time)/3600);
                $price=$time*$interval['price'];
            }else if ($start_time < $interval['start_time']){

            }
        }elseif ($start_time < $interval['end_time'] && $end_time > $interval['end_time']){

        }else{

        }

        $price=1;
        return $price;
    }

    /**
     * @title 统一下单
     * @description 微信统一下单
     * @author 董瑞恩
     * @url /portal/order/pay
     * @method GET
     *
     * @param name:order_no type:String require:1 default:无 other: desc:订单号
     *
     * @return data:返回用于调用支付的参数
     */
    public function pay($order_no){
        $order=Db::name('order')->where(['order_no'=>$order_no,'state'=>2])->find();
        $openId=Db::name('users')->where('id',$order['users_id'])->find()['open_id'];
        $body='支付';
        $price=$order['price']*100;//订单价格
        $notify_url=url('order/notify','','',true);//回调地址
        $wxPay=new WeixinPay($openId,$order_no,$body,$price,$notify_url);
        $pay=$wxPay->pay();
        if (isset($pay['package'])){
            $data=[
                'state'=>1,
                'pay'=>$pay
            ];
            $this->apiResponse(200,'success',$data);
        }else{
            $data=[
                'state'=>0,
                'message'=>'统一下单失败',
                'error' => $pay
            ];
            $this->apiResponse(200,'success',$data);
        }

    }

    //支付回调接口
    public function notify(){
        $param = $this->request->param();
        if ($param == null) {
            $param = file_get_contents("php://input");
            if ($param == null) {
                $param = $GLOBALS['HTTP_RAW_POST_DATA'];
            }
        }
        $wxPay=new WeixinPay();
        $data = $wxPay->xmlToArray($param);
        $Sign = $data['sign'];
        //支付成功回调后变更订单状态
        $mySign = $wxPay->getSign($data);
        $order_no = $data['out_trade_no'];
        if ($Sign===$mySign && $data['return_code'] == 'SUCCESS') {
            try{
                Db::name('order')->where(['order_no'=>$order_no])->update(['state'=>3]);
            }catch (\Exception $exception){
                $this->apiResponse(301,'error:'.$exception->getMessage());
            }
            return "<xml>
                      <return_code><![CDATA[SUCCESS]]></return_code>
                      <return_msg><![CDATA[OK]]></return_msg>
                    </xml>";

        }
    }

}