增加了音视频毁掉

This commit is contained in:
wucongxing 2024-02-02 13:32:37 +08:00
parent 10aae768cb
commit 893ec62df6
3 changed files with 186 additions and 103 deletions

View File

@ -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(

View File

@ -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);
}
}

View File

@ -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']);
});