增加了音视频毁掉
This commit is contained in:
parent
10aae768cb
commit
893ec62df6
@ -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(
|
||||
|
||||
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@ -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']);
|
||||
});
|
||||
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user