request->post('user_id'); if (!$userId) { $this->result('参数错误', [], 200); } //权益列表 $list = Equity::select(); foreach ($list as &$v) { $v['desc'] = explode(' ', $v['desc']); } //头部卡片 $info = Cardtip::find(1); $info['avatar'] = UsersModel::where('user_id', $userId)->value('user_avatar'); $this->result('ok', ['card' => $info, 'equityList' => $list], 200); } /** * 开通VIP * * @ApiTitle (开通VIP) * @ApiSummary (开通VIP) * @ApiMethod (POST) * @ApiRoute (/api/member/buyVip) * @ApiParams (name="user_id", type="int", required=true, description="用户id") * @ApiReturnParams (name="code", type="int", required=true, sample="200") * @ApiReturnParams (name="msg", type="string", required=true, sample="ok") * @ApiReturnParams (name="data", type="array", description="数据返回") * @ApiReturn () */ public function buyVip() { $userId = $this->request->post('user_id'); $amount = 68; $notify_url = config('site.httpurl').'/api/member/notify_url'; if (!$userId) { $this->result('参数错误', [], 200); } $out_trade_no = createOutTradeNo(); $orderInfo = array( 'uid' => $userId, 'out_trade_no' => $out_trade_no, 'amount' => $amount, 'time' => date('Y-m-d H:i:s', time()) ); Db::startTrans(); try { $insert = BuyVipLogModel::insert($orderInfo); if ($insert) { Db::commit(); $payObj = new WxPay(); $getPrePayInfo = $payObj->getPrePayOrder('VIP会员购买', $out_trade_no, ($amount * 100), $notify_url); if ($getPrePayInfo) { $payInfo = $payObj->getOrder($getPrePayInfo['prepay_id']); if ($payInfo) { $this->result('支付订单发起成功', $payInfo, 200); } else { $this->result('支付订单发起失败,请稍后再试', [], 100); } } else { $this->result('支付订单发起失败,请稍后再试', [], 100); } } } catch (\Exception $exception) { Db::rollback(); $this->result('支付订单发起失败,请稍后再试('.$exception->getMessage().')', [], 100); } } /** * 排队 * * @ApiTitle (排队) * @ApiSummary (排队) * @ApiMethod (POST) * @ApiRoute (/api/member/queue) * @ApiParams (name="user_id", type="int", required=true, description="用户id") * @ApiParams (name="pay_type", type="int", required=true, description="支付方式:1-余额 2-微信 3-支付宝") * @ApiReturnParams (name="code", type="int", required=true, sample="200") * @ApiReturnParams (name="msg", type="string", required=true, sample="ok") * @ApiReturnParams (name="data", type="array", description="数据返回") * @ApiReturn () */ public function queue() { $userId = $this->request->post('user_id'); $payType = $this->request->post('pay_type'); // 1-余额 2-微信 3-支付宝 $amount = 1.2; $income = 2; if (!$userId || !$payType) { $this->result('参数错误', [], 100); } $user = UsersModel::get($userId); if ($user->user_level == 1) { $this->result('您还不是VIP用户,不能进行排队哦', [], 100); } // 剩余总排队次数是否足够 if ($user->user_line_num <= 0) { $this->result('您的排队次数不足,不能进行排队哦', [], 100); } // 每天可排队次数是否足够 if ($user->can_line_num_perday <= 0) { $this->result('您每天可排队次数不足哦', [], 100); } // 今天排队次数是否足够 if ($user->can_line_num_perday == $user->line_num_today) { $this->result('您今天的可排队次数已用完', [], 100); } $nowTime = time(); $startTime = strtotime(date('Y-m-d').' 09:00:00'); $endTime = strtotime(date('Y-m-d').' 22:00:00'); if ($startTime < $nowTime && $nowTime < $endTime) { $nowHour = date("Y-m-d H:00:00", time()); $nextHour = date("Y-m-d H:i:s", strtotime("+1 hour")); //是否在本时间段内排过队 $hasOnLine = QueueModel::where(['uid' => $userId, 'pay_status' => 1]) ->whereTime('time', 'between', [$nowHour, $nextHour]) ->find(); if (!empty($hasOnLine)) { $this->result('您当前已排过队', [], 100); } //当前时间段排队人数 $lineNum = QueueModel::whereTime('time', 'between', [$nowHour, $nextHour])->where('pay_status',1)->count(); $trade = createOutTradeNo(); $lineInfo = array( 'uid' => $userId, 'trade' => $trade, 'amount' => $amount, 'line_num' => $lineNum, 'income' => $income, 'time' => date('Y-m-d H:i:s', time()), 'pay_type' => $payType ); Db::startTrans(); $insert = QueueModel::insert($lineInfo); if ($insert) { Db::commit(); if ($payType == 1) { $this->result('订单创建成功', ['out_trade_no' => $trade, 'fee' => $amount], 200); } } else { Db::rollback(); $this->result('服务器繁忙', [], 100); } } else { $this->result('今日排队活动已经结束了哦', [], 100); } } /** * 排队余额支付 * * @ApiTitle (排队余额支付) * @ApiSummary (排队余额支付) * @ApiMethod (POST) * @ApiRoute (/api/member/balancePayQueue) * @ApiParams (name="user_id", type="int", required=true, description="用户id") * @ApiParams (name="fee", type="decimal", required=true, description="排队接口返回的支付金额fee字段的值") * @ApiParams (name="out_trade_no", type="string", required=true, description="排队接口返回的支付订单编号out_trade_no字段的值") * @ApiParams (name="pay_password", type="string", required=true, description="用户支付密码") * @ApiReturnParams (name="code", type="int", required=true, sample="200") * @ApiReturnParams (name="msg", type="string", required=true, sample="ok") * @ApiReturnParams (name="data", type="array", description="数据返回") * @ApiReturn () */ public function balancePayQueue() { $userId = $this->request->post('user_id'); $fee = $this->request->post('fee'); $trade = $this->request->post('out_trade_no'); $payPwd = $this->request->post('pay_password'); if (!$userId || !$fee || !$trade || !$payPwd) { $this->result('参数错误', [], 100); } $user = UsersModel::get($userId); // 用户是否存在 if (!$user) { $this->result('用户不存在', [], 100); } // 订单是否存在 $order = QueueModel::where('trade', $trade)->find(); if (!$order) { $this->result('订单不存在', [], 100); } if ($fee <= 0) { $this->result('请输入正确的支付金额', [], 100); } // 余额是否满足本次扣费金额 if ($user->user_money < $fee) { $this->result('账户余额不足', [], 100); } // 是否设置支付密码 if (empty($user->user_paypwd)) { $this->result('请先设置支付密码', [], 100); } // 支付密码是否正确 if ($user->user_paypwd != $payPwd) { $this->result('支付密码错误', [], 100); } Db::startTrans(); // 扣除账户余额 $dec = UsersModel::where('user_id', $userId)->setDec('user_money', $fee); // 增加排队收入 $amount = 2; $inc = UsersModel::where('user_id', $userId)->setInc('user_money', $amount); // 更新支付状态和支付时间 $updatePayStatus = QueueModel::where('trade', $trade) ->update(['pay_status' => 1, 'pay_time' => date('Y-m-d H:i:s', time())]); // 消耗一次今日可排队次数 $addPerDayQueueNum = UsersModel::where('user_id', $userId)->setInc('line_num_today', 1); // 消耗一次总排队次数 $decTotalQueueNum = UsersModel::where('user_id', $userId)->setDec('user_line_num', 1); if ($dec && $inc && $updatePayStatus && $addPerDayQueueNum && $decTotalQueueNum) { Db::commit(); $this->result('排队成功', [], 200); } else { Db::rollback(); $this->result('支付失败,稍后再试', [], 100); } } }