package cn.com.goldenwater.dcproj.service.impl; import cn.com.goldenwater.dcproj.dto.AgoraTokenDto; import cn.com.goldenwater.dcproj.model.AgoraToken; import cn.com.goldenwater.dcproj.model.BisInspAllRlationPers; import cn.com.goldenwater.dcproj.service.AgoraTokenService; import cn.com.goldenwater.dcproj.service.BisInspAllRlationPersService; import cn.com.goldenwater.dcproj.utils.RedisOperator; import io.agora.media.RtcTokenBuilder; import io.agora.rtm.RtmTokenBuilder; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import static cn.com.goldenwater.dcproj.util.CheckUtil.check; import static cn.com.goldenwater.dcproj.util.CheckUtil.notNull; /** * @author HAIHUA2 */ @Service public class AgoraTokenServiceImpl implements AgoraTokenService { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private BisInspAllRlationPersService bisInspAllRlationPersService; @Autowired private RedisOperator redisOperator; private static final String AGORA_TOKEN = "AgoraToken"; private static final String AGORA_USER_TOKEN = "AgoraUserToken"; private static final String AGORA_UID = "AgoraUid"; private static final int EXPIRATION_TIME_IN_SECONDS = 86400000; private static final String APP_ID = "6f592a3023ef4960a2d5342a6fc456e7"; private static final String APP_CERTIFICATE = "da61dedde61941af8ae051a03865443c"; @Override public AgoraTokenDto createToken(AgoraToken agoraToken) throws Exception { check(StringUtils.isNotBlank(agoraToken.getPersId()), "persId.no"); check(StringUtils.isNotBlank(agoraToken.getChannelName()), "channelName.no"); // 查询用户 BisInspAllRlationPers currentUser = bisInspAllRlationPersService.get(agoraToken.getPersId()); notNull(currentUser, "用户ID错误!"); String agoraTokenUid = AGORA_UID + ":" + agoraToken.getPersId() + "_" + agoraToken.getChannelName(); String agoraTokenRedisKey = AGORA_TOKEN + ":" + agoraToken.getPersId() + "_" + agoraToken.getChannelName(); String agoraUserTokenRedisKey = AGORA_USER_TOKEN + ":" + agoraToken.getPersId() + "_" + agoraToken.getChannelName(); Integer agoraTokenUidStr = redisOperator.get(agoraTokenUid) == null ? null : Integer.parseInt(redisOperator.get(agoraTokenUid)); String agoraTokenStr = redisOperator.get(agoraTokenRedisKey); String agoraUserTokenStr = redisOperator.get(agoraUserTokenRedisKey); if (StringUtils.isBlank(agoraTokenStr)) { if (null == agoraTokenUidStr) { agoraTokenUidStr = getUid(); } agoraToken.setAgoraUid(agoraTokenUidStr); agoraTokenStr = createChannelToken(agoraToken); agoraUserTokenStr = createUserToken(String.valueOf(agoraTokenUidStr)); logger.info("AgoraToken create:" + agoraTokenStr); redisOperator.set(agoraTokenUid, String.valueOf(agoraTokenUidStr), 86400); redisOperator.set(agoraTokenRedisKey, agoraTokenStr, 86400); redisOperator.set(agoraUserTokenRedisKey, agoraUserTokenStr, 86400); } AgoraTokenDto agoraTokenDto = new AgoraTokenDto(); BeanUtils.copyProperties(currentUser, agoraTokenDto); agoraTokenDto.setPersId(agoraToken.getPersId()); agoraTokenDto.setAgoraUid(agoraTokenUidStr); agoraTokenDto.setAgoraToken(agoraTokenStr); agoraTokenDto.setAgoraUserToken(agoraUserTokenStr); return agoraTokenDto; } /** * @param uid * @return * @throws Exception */ private String createUserToken(String uid) throws Exception { RtmTokenBuilder token = new RtmTokenBuilder(); return token.buildToken(APP_ID, APP_CERTIFICATE, uid, RtmTokenBuilder.Role.Rtm_User, 0); } /** * @param agoraToken * @return */ private String createChannelToken(AgoraToken agoraToken) { RtcTokenBuilder.Role role; if (StringUtils.isBlank(agoraToken.getRtcRole()) || "1".equals(agoraToken.getRtcRole())) { role = RtcTokenBuilder.Role.Role_Publisher; } else { role = RtcTokenBuilder.Role.Role_Subscriber; } RtcTokenBuilder token = new RtcTokenBuilder(); // 使用当前时间加上一个可用时间来保证它的唯一获取时间 int timestamp = (int) (System.currentTimeMillis() / 1000 + EXPIRATION_TIME_IN_SECONDS); return token.buildTokenWithUid(APP_ID, APP_CERTIFICATE, agoraToken.getChannelName(), agoraToken.getAgoraUid(), role, timestamp); } private Integer getUid() { Integer uid = redisOperator.get(AGORA_UID) == null ? null : Integer.parseInt(redisOperator.get(AGORA_UID)); if (uid == null) { uid = 10000; redisOperator.set(AGORA_UID, String.valueOf(uid), 864000); } else { ++uid; redisOperator.set(AGORA_UID, String.valueOf(uid)); } return uid; } }