遼寧做網(wǎng)站的公司網(wǎng)站外包公司有哪些
在前面我們已經(jīng)對(duì)接好了騰訊多人音視頻房間相關(guān)內(nèi)容:Java對(duì)接騰訊多人音視頻房間示例
為了完善業(yè)務(wù)邏輯,我們還需要對(duì)接它的一些回調(diào)接口 官方文檔地址
主要就下面這些
這里因?yàn)楸容^簡(jiǎn)單直接上代碼
里面有些工具類(lèi)和上一章一樣這里就沒(méi)貼,需要的看下我上一章Java對(duì)接騰訊多人音視頻房間示例
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;/*** @Description: 騰訊會(huì)議回調(diào)* @Author: Sakura* @Date: 2023/12/18 14:43*/
@Log
@RestController
@RequestMapping("/txcloud/callback")
public class TxCallbackController {@Value("${tencent.roomctl.SDKAppId}")private Long SDKAppId;@AutowiredTxCallbackService txCallbackService;@AutowiredCallbackListenerStrategyContext callbackListenerStrategyContext;// // 實(shí)例參數(shù)
// {
// "address": "https://www.zscloud.work:29000/api/txcloud/callback/listener",
// "actions": ["createRoom", "destroyRoom", "updateRoomInfo", "enterRoom", "exitRoom", "updateUserRole", "takeSeat", "leaveSeat"]
// }/*** @Description: 配置回調(diào)地址* @Author: Sakura* @Date: 2023/12/18 14:52*/@PostMapping("/create")public Result createCallback(@RequestBody CreateCallbackRequest createCallbackRequest) {return txCallbackService.createCallback(createCallbackRequest);}/** * @Description: 修改回調(diào)地址配置* @Author: Sakura* @Date: 2023/12/19 15:55*/@PostMapping("/update")public Result updateCallback(@RequestBody CreateCallbackRequest createCallbackRequest) {return txCallbackService.updateCallback(createCallbackRequest);}/*** @Description: 回調(diào)監(jiān)聽(tīng)* @Author: Sakura* @Date: 2023/12/19 11:00*/@PostMapping("/listener")public CallbackResponse callbackListener(@RequestParam Long sdkappid, @RequestParam String command,@RequestParam String contenttype, @RequestParam String clientip,@RequestParam String optplatform,@RequestBody CallbackRoomInfoRequest callbackRoomInfoRequest) {log.info("回調(diào)監(jiān)聽(tīng):" + "sdkappid:" + sdkappid + " command:" + command + " " + callbackRoomInfoRequest.toString());// 目前只能校驗(yàn)SDKAppId是否一致if (!SDKAppId.equals(sdkappid)) {return CallbackResponse.ERROR();}return callbackListenerStrategyContext.callbackListener(command, callbackRoomInfoRequest);}}
/** * @Description: 多人視頻管理* @Author: Sakura* @Date: 2023/12/14 17:46
*/
public interface TxCallbackService {Result createCallback(CreateCallbackRequest createCallbackRequest);Result updateCallback(CreateCallbackRequest createCallbackRequest);}
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;/** * @Description: 回調(diào)管理* @Author: Sakura* @Date: 2023/12/18 14:52
*/
@Log
@Service
public class TxCallbackServiceImpl implements TxCallbackService {@AutowiredRoomctlUtil roomctlUtil;/*** @Description: 預(yù)約會(huì)議* @Author: Sakura* @Date: 2023/12/14 17:46*/@Override@Transactionalpublic Result createCallback(CreateCallbackRequest createCallbackRequest) {String result = roomctlUtil.createCallback(createCallbackRequest.getAddress(), createCallbackRequest.getActions());if (!"ok".equals(result)) {return Result.ERROR(result);}return Result.SUCCESS();}@Override@Transactionalpublic Result updateCallback(CreateCallbackRequest createCallbackRequest) {String result = roomctlUtil.updateCallback(createCallbackRequest.getAddress(), createCallbackRequest.getActions());if (!"ok".equals(result)) {return Result.ERROR(result);}return Result.SUCCESS();}}
下面是請(qǐng)求參數(shù)的封裝類(lèi)
import lombok.Data;
import lombok.EqualsAndHashCode;import java.util.List;/** * @Description: 創(chuàng)建回調(diào)參數(shù)* @Author: Sakura* @Date: 2023/12/18 14:50
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class CreateCallbackRequest extends PageRequest {private static final long serialVersionUID = 1L;// 回調(diào)的地址,需要以 http/https 開(kāi)頭,建議使用更為安全的 httpsprivate String address;// 需要觸發(fā)回調(diào)的情景,列表請(qǐng)參考 回調(diào)命令字private List<String> actions;}
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;/** * @Description: 回調(diào)房間詳細(xì)信息 * @Author: Sakura* @Date: 2023/12/19 13:43
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class CallbackRoomInfoRequest implements Serializable {private static final long serialVersionUID = 1L;// 操作的用戶(hù) ID@JsonProperty("UserId")private String UserId;// 角色類(lèi)型:0為房主,1為管理員,2為普通成員@JsonProperty("UserRole")private Integer UserRole;// 操作的房間 ID@JsonProperty("RoomId")private String RoomId;// 當(dāng)前房間成員數(shù)量@JsonProperty("MemberCount")private Integer MemberCount;// 用戶(hù)退出的原因@JsonProperty("ExitReason")private String ExitReason;// 當(dāng)前的麥位數(shù)量@JsonProperty("SeatCount")private Integer SeatCount;// 房間詳情@JsonProperty("RoomInfo")private RoomInfoRequest RoomInfo;// 事件觸發(fā)時(shí)間戳@JsonProperty("EventTime")private Long EventTime;
}
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;/*** @Description: 回調(diào)房間信息* @Author: Sakura* @Date: 2023/12/19 13:41*/
@Data
@EqualsAndHashCode(callSuper = false)
public class RoomInfoRequest implements Serializable {private static final long serialVersionUID = 1L;// 最大麥位數(shù)量,默認(rèn)為套餐包上限,(直播最大16個(gè) 默認(rèn)16)@JsonProperty("MaxSeatCount")private Integer MaxSeatCount;// 房間名稱(chēng)。默認(rèn)為房間 ID@JsonProperty("RoomName")private String RoomName;// 房間類(lèi)型:1為會(huì)議,2為直播\n 默認(rèn)為:會(huì)議1@JsonProperty("RoomType")private Integer RoomType;// 麥控模式:1為自由發(fā)言模式,2為舉手發(fā)言模式,3為就座后發(fā)言(搶麥位)\n默認(rèn)為:自由發(fā)言模式1@JsonProperty("SpeechMode")private Integer SpeechMode;// 全體禁畫(huà) 默認(rèn) false@JsonProperty("DisableVideo")private Boolean DisableVideo;// 全體靜音 默認(rèn) false@JsonProperty("DisableAudio")private Boolean DisableAudio;// 禁止所有成員發(fā)送文本消息 默認(rèn) false@JsonProperty("DisableMessage")private Boolean DisableMessage;}
再就是回調(diào)這塊,因?yàn)榛卣{(diào)的都是一個(gè)方法,通過(guò)command來(lái)區(qū)分,所以這里用策略模式來(lái)處理
import lombok.SneakyThrows;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
import java.util.function.Function;/*** @author Sakura* @date 2023/12/19 11:16*/
@Service
public class CallbackListenerStrategyContext {// 策略采用lambda的方法存儲(chǔ)Map<String, Function<CallbackRoomInfoRequest, CallbackResponse>> strategyContextMap = new HashMap<>();@ResourceCallbackListenerService callbackListenerService;@PostConstruct@SneakyThrowspublic void setStrategyMap() {// 配置回調(diào)方法strategyContextMap.put("createRoom",(callbackRoomInfoRequest)-> callbackListenerService.createRoom(callbackRoomInfoRequest));strategyContextMap.put("destroyRoom",(callbackRoomInfoRequest)-> callbackListenerService.destroyRoom(callbackRoomInfoRequest));strategyContextMap.put("updateRoomInfo",(callbackRoomInfoRequest)-> callbackListenerService.updateRoomInfo(callbackRoomInfoRequest));strategyContextMap.put("enterRoom",(callbackRoomInfoRequest)-> callbackListenerService.enterRoom(callbackRoomInfoRequest));strategyContextMap.put("exitRoom",(callbackRoomInfoRequest)-> callbackListenerService.exitRoom(callbackRoomInfoRequest));strategyContextMap.put("takeSeat",(callbackRoomInfoRequest)-> callbackListenerService.takeSeat(callbackRoomInfoRequest));strategyContextMap.put("leaveSeat",(callbackRoomInfoRequest)-> callbackListenerService.leaveSeat(callbackRoomInfoRequest));}public CallbackResponse callbackListener(String command, CallbackRoomInfoRequest callbackRoomInfoRequest){// 根據(jù)command獲取對(duì)應(yīng)的方法返回策略Function<CallbackRoomInfoRequest, CallbackResponse> callbackListenerFunc = strategyContextMap.get(command);return callbackListenerFunc.apply(callbackRoomInfoRequest);}
}
import lombok.extern.java.Log;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;/*** @author Sakura* @date 2023/12/19 11:42*/
@Service
@Log
public class CallbackListenerService {// 此處用來(lái)統(tǒng)一處理多人視頻房間回調(diào)++++++++++++++++++++++++++++++++++++++++++++// 創(chuàng)建房間回調(diào)public CallbackResponse createRoom(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("創(chuàng)建房間回調(diào)" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 銷(xiāo)毀房間回調(diào)public CallbackResponse destroyRoom(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("銷(xiāo)毀房間回調(diào)" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 更新房間回調(diào)public CallbackResponse updateRoomInfo(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("更新房間回調(diào)" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 用戶(hù)進(jìn)房回調(diào)public CallbackResponse enterRoom(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("用戶(hù)進(jìn)房回調(diào)" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 用戶(hù)退房回調(diào)public CallbackResponse exitRoom(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("用戶(hù)退房回調(diào)" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 用戶(hù)上麥回調(diào)public CallbackResponse takeSeat(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("用戶(hù)上麥回調(diào)" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}// 用戶(hù)下麥回調(diào)public CallbackResponse leaveSeat(CallbackRoomInfoRequest callbackRoomInfoRequest){log.info("用戶(hù)下麥回調(diào)" + callbackRoomInfoRequest.toString());return CallbackResponse.success();}
}
返回對(duì)象
import lombok.Data;
import lombok.EqualsAndHashCode;import java.io.Serializable;/** * @Description: 回調(diào)返回信息* @Author: Sakura* @Date: 2023/12/19 13:41
*/
@Data
@EqualsAndHashCode(callSuper = false)
public class CallbackResponse implements Serializable {private static final long serialVersionUID = 1L;// 當(dāng)前房間成員數(shù)量private Integer ErrorCode;// 操作的房間 IDprivate String ErrorMessage;public static CallbackResponse success() {CallbackResponse callbackResponse = new CallbackResponse();callbackResponse.setErrorCode(0);callbackResponse.setErrorMessage("Success");return callbackResponse;}public static CallbackResponse ERROR() {CallbackResponse callbackResponse = new CallbackResponse();callbackResponse.setErrorCode(1);callbackResponse.setErrorMessage("Fail");return callbackResponse;}}
我們需要先調(diào)用配置回調(diào)地址的接口把我們的接口配置上去
{"address": "https://www.sakura.com/txcloud/callback/listener","actions": ["createRoom", "destroyRoom", "updateRoomInfo", "enterRoom", "exitRoom", "updateUserRole", "takeSeat", "leaveSeat"]
}
注意address換成自己的域名,actions可以照著寫(xiě)
這樣就能收到回調(diào)信息了