UsersController.php 13.3 KB
<?php
/**
 * Created by PhpStorm.
 * User: ruidiudiu
 * Date: 2018/11/23
 * Time: 18:26
 */

namespace app\portal\controller;


use cmf\controller\HomeBaseController;
use EasyWeChat\Foundation\Application;
use think\Db;
use wxapp\pay\WeixinPay;

/**
 * @title 用户相关接口
 * @description 用户相关接口
 * @group 用户相关接口
 */
class UsersController extends HomeBaseController{
    protected $options;
    function _initialize()
    {
        parent::_initialize();
        $this->options = [
            'app_id'  => config('wechat_config.app_id'),
            'secret'  => config('wechat_config.secret'),
            'payment' => config('wechat_config.payment'),
        ];
    }
    /**
     * @title 状态验证
     * @description 开锁前判断是否有未支付订单与是否提交押金
     * @author 董瑞恩
     * @url /portal/users/lock_check
     * @method GET
     *
     * @param name:users_id type:String require:1 default:无 other: desc:用户id
     *
     * @return is_use:是否在使用设备
     * @return is_deposit:是否交付押金
     * @return is_order:是否有未支付订单
     */
    public function lock_check(){
        $users_id=$this->request->param('users_id');
        //获取提交押金的状态
        $users=Db::name('users')->where('id',$users_id)->find();
        $data=[
            'is_use'=>$users['is_use'],
            'is_deposit' => $users['is_deposit']
        ];
        $order=Db::name('order')->where(['users_id'=>$users_id,'state'=>2])->find();
        if (empty($order)){
            $data['is_order']=0;
        }else{
            $data['is_order']=1;
        }
        $this->apiResponse(200,'success',$data);
    }

//    /**
//     * @title 用户使用状态验证
//     * @description 判断用户当前是否在使用设备
//     * @author 董瑞恩
//     * @url /portal/users/isUse
//     * @method GET
//     *
//     * @param name:users_id type:String require:1 default:无 other: desc:用户id
//     *
//     *
//     */
    public function isUse(){
        $users_id=$this->request->param('users_id');
        $users=Db::name('users')->where('id',$users_id)->find();
        if ($users['is_use']==1){
            $this->apiResponse(200,'用户正在使用设备');
        }else{
            $this->apiResponse(301,'用户尚未使用设备');
        }
    }

    /**
     * @title 获取用户信息
     * @description 获取用户信息
     * @author 董瑞恩
     * @url /portal/users/getUsersInfo
     * @method GET
     *
     * @param name:users_id type:String require:1 default:无 other: desc:用户id
     *
     * @return users_id:用户id
     * @return phone:用户手机号
     * @return is_deposit:用户是否提交押金
     * @return deposit:用户提交押金金额(单位:元)
     */
    public function getUsersInfo(){
        $users_id=$this->request->param('users_id');
        $data=Db::name('users')->field('id as users_id,phone,is_deposit,deposit')->where('id',$users_id)->find();
        $this->apiResponse(200,'success',$data);
    }

    /**
     * @title 获取计费规则
     * @description 获取计费规则
     * @author 董瑞恩
     * @url /portal/users/bill_rules
     * @method GET
     *
     * @return bill_rules:计费规则
     */
    public function bill_rules(){
        $data=Db::name('set_up')->field('bill_rules')->where('id',1)->find();
        $data['bill_rules']=html_entity_decode($data['bill_rules']);
        $this->apiResponse(200,'success',$data);
    }

    /**
     * @title 获取使用须知
     * @description 获取使用须知
     * @author 董瑞恩
     * @url /portal/users/directions
     * @method GET

     * @return directions:使用须知
     */
    public function directions(){
        $data=Db::name('set_up')->field('directions')->where('id',1)->find();
        $data['directions']=html_entity_decode($data['directions']);
        $this->apiResponse(200,'success',$data);
    }

    /**
     * @title 获取客服电话
     * @description 获取客服电话
     * @author 董瑞恩
     * @url /portal/users/service_phone
     * @method GET

     * @return service_phone:客服电话
     */
    public function service_phone(){
        $data=Db::name('set_up')->field('service_phone')->where('id',1)->find();
        $this->apiResponse(200,'success',$data);
    }

    /**
     * @title 用户查询订单列表
     * @description 用户查询订单列表
     * @author 董瑞恩
     * @url /portal/users/getOrder
     * @method GET
     *
     * @param name:users_id type:String require:1 default:无 other: desc:用户id
     * @param name:page type:String require:1 default:无 other: desc:页码
     *
     * @return currentPage:当前页
     * @return allPage:总页数
     * @return allData:总数据量
     * @return data:当前页的数据(以下是数组字段)
     *
     * @return id:订单id
     * @return order_no:订单号
     * @return eq_name:设备名称
     * @return users_id:用户id
     * @return start_time:开始使用时间
     * @return end_time:结束使用时间
     * @return time:使用时长(小时)
     * @return price:金额(元)
     * @return state:订单状态(1:没完成 2:已完成 3:已支付)
     */
    public function getOrder(){
        $users_id=$this->request->param('users_id');
        $order=Db::name('order')->where(['users_id'=>$users_id])->paginate(8);
        $data_info=$order->items();
        foreach ($data_info as $k=>$v){
            $time_info=$this->getTimeInfo($v['start_time'],$v['end_time']);
            $data[$k]=array_merge($data_info[$k],$time_info);
        }
        $data=[
            'currentPage'=>$order->currentPage(),
            'allPage' => $order->lastPage(),
            'allData'=>$order->total(),
            'data'=>$data_info
        ];
        $this->apiResponse(200,'success',$data);
    }
    /**
     * @title 用户查询未完成订单信息
     * @description 用户查询在使用订单信息
     * @author 董瑞恩
     * @url /portal/users/getOrderById1
     * @method GET
     *
     * @param name:users_id type:String require:1 default:无 other: desc:用户id
     *
     * @return order_no:订单号
     * @return users_id:用户id
     * @return start_time:开始使用时间
     * @return end_time:结束使用时间
     * @return time:使用时长(小时)
     * @return hour:计时时长(小时)
     * @return min:计时时长(分钟)
     * @return price:金额(元)
     */

    public function getOrderById1(){
        $users_id=$this->request->param('users_id');
        $order= Db::name('order')->field('order_no,users_id,start_time')->where(['users_id'=>$users_id,'state'=>1])->find();
        if (empty($order)){
            $this->apiResponse(200,'没有未完成订单');
        }
        $order['end_time']=time();
        $order['time']=ceil(($order['end_time']-$order['start_time'])/3600);
        $price=new OrderController();
        $order['price']=$price->getPrice($users_id,$order['start_time'],$order['end_time']);
        $time_info=$this->getTimeInfo($order['start_time'],$order['end_time']);
        $order=array_merge($order,$time_info);
        $this->apiResponse(200,'success',$order);
    }

    /**
     * @title 用户查询未支付订单信息
     * @description 用户查询未支付订单信息
     * @author 董瑞恩
     * @url /portal/users/getOrderById2
     * @method GET
     *
     * @param name:users_id type:String require:1 default:无 other: desc:用户id
     *
     * @return id:订单id
     * @return order_no:订单号
     * @return eq_name:设备名称
     * @return users_id:用户id
     * @return start_time:开始使用时间
     * @return end_time:结束使用时间
     * @return time:使用时长(小时)
     * @return hour:计时时长(小时)
     * @return min:计时时长(分钟)
     * @return price:金额(元)
     * @return state:订单状态(1:没完成 2:已完成 3:已支付)
     */

    public function getOrderById2(){
        $users_id=$this->request->param('users_id');
        $order= Db::name('order')->where(['users_id'=>$users_id,'state'=>2])->find();

        if (empty($order)){
            $this->apiResponse(200,'没有未支付订单');
        }
        $time_info=$this->getTimeInfo($order['start_time'],$order['end_time']);
        $order=array_merge($order,$time_info);
        $this->apiResponse(200,'success',$order);
    }

    /**
     * @title 用户交纳押金
     * @description 交纳押金
     * @author 董瑞恩
     * @url /portal/users/payDeposit
     * @method GET
     *
     * @param name:users_id type:String require:1 default:无 other: desc:用户id
     *
     * @return data:下单返回值
     */
    public function payDeposit(){
        $users_id=$this->request->param('users_id');
        $users=Db::name('users')->where('id',$users_id)->find();
        $openId=$users['open_id'];
        $order_no = cmf_get_order_sn();
        $body="押金-支付";
        $price=1;//数据库查询
        $notify_url=url('users/notify','','',true);//回调地址
        $wxPay=new WeixinPay($openId,$order_no,$body,$price,$notify_url);
        $data=$wxPay->pay();
        if (isset($data['package'])){
            try{
                Db::name('users')->where(['id'=>$users_id])->update(['deposit_order_no'=>$order_no]);
            }catch (\Exception $exception){

            }
            $this->apiResponse(200,'下单成功',$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') {
            $data=[
                'is_deposit' => 1,
                'deposit' => $data['total_fee'],
            ];
            try{
                Db::name('users')->where(['deposit_order_no'=>$order_no])->update($data);
            }catch (\Exception $exception){
                $this->apiResponse(301,'error:'.$exception->getMessage());
            }
            return "<xml>
                      <return_code><![CDATA[SUCCESS]]></return_code>
                      <return_msg><![CDATA[OK]]></return_msg>
                    </xml>";
        }
    }

    /**
     * @title 用户退回押金
     * @description 用户退回押金
     * @author 董瑞恩
     * @url /portal/users/refundDeposit
     * @method GET
     *
     * @param name:users_id type:String require:1 default:无 other: desc:用户id
     *
     */
    public function refundDeposit(){
        $users_id=$this->request->param('users_id');
        $users=Db::name('users')->where('id',$users_id)->find();
        if ($users['is_deposit']==0){
            $this->apiResponse(302,'用户未缴纳押金');
        }
        $order=Db::name('order')->where(['users_id'=>$users_id,'state'=>['in',[1,2]]])->find();
        if (!empty($order)){
            $this->apiResponse(303,'用户还有未支付订单');
        }
        $orderNo=$users['deposit_order_no'];//需要退款的订单
        $price=$users['deposit'];
        Db::startTrans();
        try{
            Db::name('users')->where('id',$users_id)->update(['is_deposit'=>0,'deposit'=>null,'deposit_order_no'=>null]);
        }catch (\Exception $exception){
             $this->apiResponse(301,'数据库修改失败');
        }
        $app= new Application($this->options);
        $payment = $app->payment;
        //使用商户订单号退款  PS.其他形式参考文档
        $refundNo =cmf_get_order_sn();//退款单号
        $result = $payment->refund($orderNo, $refundNo, $price); // 总金额 100, 退款 80,refundFee可选(为空时全额退款)
        if ($result['return_code']==='SUCCESS' && $result['result_code']==='SUCCESS'){
            Db::commit();
        }else{
            Db::rollback();
            $this->apiResponse(302,'error:'.$result);
        }
        $this->apiResponse(200,'success');
    }

    /**
     * 退款结果回调
     */
    public function refundNotify() {
        $app = new Application($this->options);
        $response = $app->payment->handleRefundNotify(function ($message, $reqInfo) {
            cache('message',$message);
            cache('reqInfo',$reqInfo);
            // 其中 $message['req_info'] 获取到的是加密信息
            // $reqInfo 为 message['req_info'] 解密后的信息
            // 你的业务逻辑...
            return true; // 返回 true 告诉微信“我已处理完成”
            // 或返回错误原因 $fail('参数格式校验错误');
        });
        $response->send();
    }


    //每天重置免费试用权限
    public function resetFree(){
        Db::name('users')->where('is_free',1)->update(['is_free'=>0]);
    }


    public function getTimeInfo($start,$end){
        if(empty($end)){
            $end=time();
        }
        $time=$end-$start;
        $return['hour']=floor($time/3600);
        $return['min']=floor(($time-$return['hour']*3600)/60);
        return $return;
    }
}