From 893ec62df64c279d61a5daabc1daf18243d90968 Mon Sep 17 00:00:00 2001 From: wucongxing <815046773@qq.com> Date: Fri, 2 Feb 2024 13:32:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E9=9F=B3=E8=A7=86?= =?UTF-8?q?=E9=A2=91=E6=AF=81=E6=8E=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/Controller/CallBackController.php | 273 ++++++++++++++++---------- app/Model/VideoRecord.php | 11 ++ config/routes.php | 5 +- 3 files changed, 186 insertions(+), 103 deletions(-) diff --git a/app/Controller/CallBackController.php b/app/Controller/CallBackController.php index d8a14c1..95fe147 100644 --- a/app/Controller/CallBackController.php +++ b/app/Controller/CallBackController.php @@ -37,6 +37,7 @@ use App\Model\UserCoupon; use App\Model\UserDoctor; use App\Model\UserPatient; use App\Model\UserSystem; +use App\Model\VideoRecord; use App\Model\VideoReservation; use App\Services\BaseService; use App\Services\ImService; @@ -1705,12 +1706,10 @@ class CallBackController extends AbstractController } /** - * 音视频回调-房间 + * 音视频回调 * @return ResponseInterface - * @throws ContainerExceptionInterface - * @throws NotFoundExceptionInterface */ - public function trtcRoomCallBack(): ResponseInterface + public function trtcCallBack(): ResponseInterface { $request_params = $this->request->getBody()->getContents(); $SdkAppId = $this->request->header("SdkAppId"); @@ -1718,7 +1717,7 @@ class CallBackController extends AbstractController $Sign = stripslashes($Sign); try { - Log::getInstance("CallBackController-trtcRoomCallBack")->info(json_encode($request_params, JSON_UNESCAPED_UNICODE)); + Log::getInstance("CallBackController-trtcCallBack")->info(json_encode($request_params, JSON_UNESCAPED_UNICODE)); if (empty($SdkAppId)) { return $this->TrtcErrorReturn("缺少SdkAppId字段"); @@ -1759,7 +1758,7 @@ class CallBackController extends AbstractController return $this->TrtcErrorReturn("回调地址推送错误"); } - if (!in_array($request_params['EventType'],[101,102,103])){ + if (!in_array($request_params['EventType'],[102,103,201,203])){ return $this->TrtcErrorReturn("事件类型错误"); } } catch (\Throwable $e) { @@ -1769,113 +1768,189 @@ class CallBackController extends AbstractController // 处理业务逻辑 try { - // 检测缓存-只允许同时处理同一房间的一个请求,防止数据库冲突 - $redis = $this->container->get(Redis::class); - $redis_key = "trtcCallBack_" . $request_params['EventInfo']['RoomId']; - $redis_value = $redis->get($redis_key); - if (!empty($redis_value)){ - return $this->TrtcErrorReturn("存在正在处理的回调"); - } - - $redis->set($redis_key, 1, 10); - - // 获取房间id + // 获取视频预约记录 $params = array(); $params['room_id'] = $request_params['EventInfo']['RoomId']; $video_reservation = VideoReservation::getLastOne($params); if (empty($video_reservation)){ - return $this->TrtcErrorReturn("存在正在处理的回调"); + return $this->TrtcErrorReturn("未查询到该房间号,此条数据不接收"); } - // 处理创建房间 - // 处理解散房间 - // 处理进入房间 + // 获取视频记录 + $params = array(); + $params['room_id'] = $request_params['EventInfo']['RoomId']; + $params['order_inquiry_id'] = $video_reservation['order_inquiry_id']; + $video_record = VideoRecord::getLastOne($params); + if (empty($video_record)){ + return $this->TrtcErrorReturn("缺少视频开启记录"); + } + // 检测缓存-只允许同时处理同一房间的一个请求,防止数据库冲突 + $redis = $this->container->get(Redis::class); + $redis_key = "trtcCallBack_" . $request_params['EventInfo']['RoomId']; + $redis_value = $redis->get($redis_key); + // 加入缓存 + $redis->set($redis_key, $request_params['EventType'], 20); + if (!empty($redis_value)){ + if ($redis_value == $request_params['EventType']){ + return $this->TrtcErrorReturn("存在正在执行的相同事件,此次事件不处理"); + } + // 解散房间 + if ($redis_value == 102){ + return $this->TrtcErrorReturn("正在处理结束通话事件,此次事件不处理"); + } + + // 视频推流 + if ($redis_value == 201){ + if ($request_params['EventType'] == 103){ + return $this->TrtcErrorReturn("正在处理视频推流事件,此进入房间事件不处理"); + } + + if ($request_params['EventType'] == 203){ + return $this->TrtcErrorReturn("正在处理视频推流事件,此音频推流事件不处理"); + } + } + + // 音频推流 + if ($redis_value == 203){ + if ($request_params['EventType'] == 103){ + return $this->TrtcErrorReturn("正在处理视频推流事件,此进入房间事件不处理"); + } + + if ($request_params['EventType'] == 201){ + return $this->TrtcErrorReturn("正在处理视频推流事件,此视频推流事件不处理"); + } + } + } + + // 处理业务逻辑 + switch ($request_params['EventType']) { + case '103': // 进入房间 + if (empty($request_params['EventInfo']['UserId'])){ + return $this->TrtcErrorReturn("缺少用户id"); + } + + // 获取用户数据 + $params = array(); + $params['user_id'] = $request_params['EventInfo']['UserId']; + $user = User::getOne($params); + if (empty($user)){ + return $this->TrtcErrorReturn("非法用户"); + } + + if ($user['user_type'] != 1){ + return $this->TrtcErrorReturn("非患者"); + } + + // 检测视频状态 + if ($video_record['video_status'] == 3 || $video_record['video_status'] == 4){ + return $this->TrtcErrorReturn("已开始/结束通话,此进入房间动作不做处理"); + } + + // 修改视频状态 + $params = array(); + $params['records_id'] = $video_record['records_id']; + + $data = array(); + $data['video_status'] = 2; + $res = VideoRecord::edit($params,$data); + if (!$res){ + return $this->TrtcErrorReturn("修改视频状态失败"); + } + + break; + case '102': // 解散房间 + // 检测视频状态 + if ($video_record['video_status'] == 4){ + return $this->TrtcErrorReturn("已结束通话,此解散房间动作不做处理"); + } + + if ($request_params['EventInfo']['EventMsTs']){ + return $this->TrtcErrorReturn("缺少时间戳"); + } + + // 修改视频状态 + $params = array(); + $params['records_id'] = $video_record['records_id']; + + $data = array(); + $data['video_status'] = 4; + $data['stop_video_time'] = date('Y-m-d H:i:s',$request_params['EventInfo']['EventMsTs']); + $res = VideoRecord::edit($params,$data); + if (!$res){ + return $this->TrtcErrorReturn("修改视频状态失败"); + } + + break; + case '201': // 视频推流 + // 检测视频状态 + if ($video_record['video_status'] == 4){ + return $this->TrtcErrorReturn("已结束通话,此视频推流动作不做处理"); + } + + if ($video_record['video_status'] == 3){ + return $this->TrtcErrorReturn("已开始通话,此视频推流动作不做处理"); + } + + if ($request_params['EventInfo']['EventMsTs']){ + return $this->TrtcErrorReturn("缺少时间戳"); + } + + // 修改视频状态 + $params = array(); + $params['records_id'] = $video_record['records_id']; + + $data = array(); + $data['video_status'] = 3; + $data['stop_video_time'] = date('Y-m-d H:i:s',$request_params['EventInfo']['EventMsTs']); + $res = VideoRecord::edit($params,$data); + if (!$res){ + return $this->TrtcErrorReturn("修改视频状态失败"); + } + + break; + case '203': // 音频推流 + // 检测视频状态 + if ($video_record['video_status'] == 4){ + return $this->TrtcErrorReturn("已结束通话,此音频推流动作不做处理"); + } + + if ($video_record['video_status'] == 3){ + return $this->TrtcErrorReturn("已开始通话,此音频推流动作不做处理"); + } + + if ($request_params['EventInfo']['EventMsTs']){ + return $this->TrtcErrorReturn("缺少时间戳"); + } + + // 修改视频状态 + $params = array(); + $params['records_id'] = $video_record['records_id']; + + $data = array(); + $data['video_status'] = 3; + $data['stop_video_time'] = date('Y-m-d H:i:s',$request_params['EventInfo']['EventMsTs']); + $res = VideoRecord::edit($params,$data); + if (!$res){ + return $this->TrtcErrorReturn("修改视频状态失败"); + } + + break; + + default: + return $this->TrtcErrorReturn("未知事件"); + } // 删除缓存 - + $redis->del($redis_key); }catch (\Throwable $e){ - // 验证失败 return $this->TrtcErrorReturn($e->getMessage()); } - Log::getInstance("CallBackController-trtcRoomCallBack")->info("音视频回调-房间数据处理成功"); - return $this->ImSuccessReturn(); - } - - /** - * 音视频回调-媒体 - * @return ResponseInterface - * @throws ContainerExceptionInterface - * @throws NotFoundExceptionInterface - */ - public function trtcMediaCallBack(): ResponseInterface - { - $request_params = $this->request->getBody()->getContents(); - $SdkAppId = $this->request->header("SdkAppId"); - $Sign = $this->request->header("Sign"); - - try { - Log::getInstance("CallBackController-trtcMediaCallBack")->info(json_encode($request_params, JSON_UNESCAPED_UNICODE)); - - if (empty($SdkAppId)) { - return $this->TrtcErrorReturn("缺少SdkAppId字段"); - } - - if (empty($Sign)) { - return $this->TrtcErrorReturn("缺少签名字段"); - } - - // 鉴定回调签名 - $VideoSafe = new VideoSafe(); - $result = $VideoSafe->validateSign($request_params,$Sign); - dump($result); -// if (!$result) { -// return $this->TrtcErrorReturn("回调签名不匹配"); -// } - - $request_params = json_decode($request_params,true); - - die; - - // 鉴定回调签名 - $VideoSafe = new VideoSafe(); - $result = $VideoSafe->validateSign($request_params,$Sign); - if (!$result) { - return $this->TrtcErrorReturn("回调签名不匹配"); - } - die; - - if (empty($request_params['CallbackCommand'])){ - return $this->ImErrorReturn("回调事件为空"); - } - - $userService = new UserService(); - - if ($request_params['CallbackCommand'] == "State.StateChange"){ - // 用户状态变更 - $result = $userService->userImLoginStatus($request_params); - if ($result['code'] == 0){ - return $this->ImErrorReturn($result['message']); - } - }elseif ($request_params['CallbackCommand'] == "C2C.CallbackAfterSendMsg"){ - // 用户im消息发送后回调 - $result = $userService->userImAfterSendMsg($request_params); - if ($result['code'] == 0){ - return $this->ImErrorReturn($result['message']); - } - }else{ - return $this->ImErrorReturn("非法事件"); - } - } catch (\Exception $e) { - // 验证失败 - return $this->ImErrorReturn($e->getMessage()); - } - - Log::getInstance()->info("Im回调数据处理成功"); - return $this->ImSuccessReturn(); + Log::getInstance("CallBackController-trtcCallBack")->info("音视频回调-房间数据处理成功"); + return $this->TrtcSuccessReturn(); } /** @@ -1885,7 +1960,7 @@ class CallBackController extends AbstractController */ protected function TrtcErrorReturn(string $message): ResponseInterface { - Log::getInstance("CallBackController-trtcRoomCallBack")->error($message); + Log::getInstance("CallBackController-trtcCallBack")->error($message); return $this->response ->withStatus(200) ->withBody( diff --git a/app/Model/VideoRecord.php b/app/Model/VideoRecord.php index d37fb34..63f172b 100644 --- a/app/Model/VideoRecord.php +++ b/app/Model/VideoRecord.php @@ -70,4 +70,15 @@ class VideoRecord extends Model { return self::where($params)->update($data); } + + /** + * 获取信息-最后一条 + * @param array $params + * @param array $fields + * @return object|null + */ + public static function getLastOne(array $params, array $fields = ['*']): object|null + { + return self::where($params)->latest()->first($fields); + } } diff --git a/config/routes.php b/config/routes.php index f1dab07..e1b9665 100644 --- a/config/routes.php +++ b/config/routes.php @@ -739,10 +739,7 @@ Router::addGroup('/callback', function () { // 音视频回调 Router::addGroup('/trtc', function () { // 房间 - Router::post('/room', [CallBackController::class, 'trtcRoomCallBack']); - - // 媒体 - Router::post('/media', [CallBackController::class, 'trtcMediaCallBack']); + Router::post('', [CallBackController::class, 'trtcCallBack']); });