e20ff2f5f547d38470fec9a5ab1340b529aabfb2.svn-base 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. package cn.com.goldenwater.dcproj.service.impl;
  2. import cn.com.goldenwater.dcproj.dto.AgoraTokenDto;
  3. import cn.com.goldenwater.dcproj.model.AgoraToken;
  4. import cn.com.goldenwater.dcproj.model.BisInspAllRlationPers;
  5. import cn.com.goldenwater.dcproj.service.AgoraTokenService;
  6. import cn.com.goldenwater.dcproj.service.BisInspAllRlationPersService;
  7. import cn.com.goldenwater.dcproj.utils.RedisOperator;
  8. import io.agora.media.RtcTokenBuilder;
  9. import io.agora.rtm.RtmTokenBuilder;
  10. import org.apache.commons.lang3.StringUtils;
  11. import org.slf4j.Logger;
  12. import org.slf4j.LoggerFactory;
  13. import org.springframework.beans.BeanUtils;
  14. import org.springframework.beans.factory.annotation.Autowired;
  15. import org.springframework.stereotype.Service;
  16. import static cn.com.goldenwater.dcproj.util.CheckUtil.check;
  17. import static cn.com.goldenwater.dcproj.util.CheckUtil.notNull;
  18. /**
  19. * @author HAIHUA2
  20. */
  21. @Service
  22. public class AgoraTokenServiceImpl implements AgoraTokenService {
  23. private Logger logger = LoggerFactory.getLogger(getClass());
  24. @Autowired
  25. private BisInspAllRlationPersService bisInspAllRlationPersService;
  26. @Autowired
  27. private RedisOperator redisOperator;
  28. private static final String AGORA_TOKEN = "AgoraToken";
  29. private static final String AGORA_USER_TOKEN = "AgoraUserToken";
  30. private static final String AGORA_UID = "AgoraUid";
  31. private static final int EXPIRATION_TIME_IN_SECONDS = 86400000;
  32. private static final String APP_ID = "6f592a3023ef4960a2d5342a6fc456e7";
  33. private static final String APP_CERTIFICATE = "da61dedde61941af8ae051a03865443c";
  34. @Override
  35. public AgoraTokenDto createToken(AgoraToken agoraToken) throws Exception {
  36. check(StringUtils.isNotBlank(agoraToken.getPersId()), "persId.no");
  37. check(StringUtils.isNotBlank(agoraToken.getChannelName()), "channelName.no");
  38. // 查询用户
  39. BisInspAllRlationPers currentUser = bisInspAllRlationPersService.get(agoraToken.getPersId());
  40. notNull(currentUser, "用户ID错误!");
  41. String agoraTokenUid = AGORA_UID + ":" + agoraToken.getPersId() + "_" + agoraToken.getChannelName();
  42. String agoraTokenRedisKey = AGORA_TOKEN + ":" + agoraToken.getPersId() + "_" + agoraToken.getChannelName();
  43. String agoraUserTokenRedisKey = AGORA_USER_TOKEN + ":" + agoraToken.getPersId() + "_" + agoraToken.getChannelName();
  44. Integer agoraTokenUidStr = redisOperator.get(agoraTokenUid) == null ? null : Integer.parseInt(redisOperator.get(agoraTokenUid));
  45. String agoraTokenStr = redisOperator.get(agoraTokenRedisKey);
  46. String agoraUserTokenStr = redisOperator.get(agoraUserTokenRedisKey);
  47. if (StringUtils.isBlank(agoraTokenStr)) {
  48. if (null == agoraTokenUidStr) {
  49. agoraTokenUidStr = getUid();
  50. }
  51. agoraToken.setAgoraUid(agoraTokenUidStr);
  52. agoraTokenStr = createChannelToken(agoraToken);
  53. agoraUserTokenStr = createUserToken(String.valueOf(agoraTokenUidStr));
  54. logger.info("AgoraToken create:" + agoraTokenStr);
  55. redisOperator.set(agoraTokenUid, String.valueOf(agoraTokenUidStr), 86400);
  56. redisOperator.set(agoraTokenRedisKey, agoraTokenStr, 86400);
  57. redisOperator.set(agoraUserTokenRedisKey, agoraUserTokenStr, 86400);
  58. }
  59. AgoraTokenDto agoraTokenDto = new AgoraTokenDto();
  60. BeanUtils.copyProperties(currentUser, agoraTokenDto);
  61. agoraTokenDto.setPersId(agoraToken.getPersId());
  62. agoraTokenDto.setAgoraUid(agoraTokenUidStr);
  63. agoraTokenDto.setAgoraToken(agoraTokenStr);
  64. agoraTokenDto.setAgoraUserToken(agoraUserTokenStr);
  65. return agoraTokenDto;
  66. }
  67. /**
  68. * @param uid
  69. * @return
  70. * @throws Exception
  71. */
  72. private String createUserToken(String uid) throws Exception {
  73. RtmTokenBuilder token = new RtmTokenBuilder();
  74. return token.buildToken(APP_ID, APP_CERTIFICATE, uid, RtmTokenBuilder.Role.Rtm_User, 0);
  75. }
  76. /**
  77. * @param agoraToken
  78. * @return
  79. */
  80. private String createChannelToken(AgoraToken agoraToken) {
  81. RtcTokenBuilder.Role role;
  82. if (StringUtils.isBlank(agoraToken.getRtcRole()) || "1".equals(agoraToken.getRtcRole())) {
  83. role = RtcTokenBuilder.Role.Role_Publisher;
  84. } else {
  85. role = RtcTokenBuilder.Role.Role_Subscriber;
  86. }
  87. RtcTokenBuilder token = new RtcTokenBuilder();
  88. // 使用当前时间加上一个可用时间来保证它的唯一获取时间
  89. int timestamp = (int) (System.currentTimeMillis() / 1000 + EXPIRATION_TIME_IN_SECONDS);
  90. return token.buildTokenWithUid(APP_ID, APP_CERTIFICATE,
  91. agoraToken.getChannelName(),
  92. agoraToken.getAgoraUid(), role, timestamp);
  93. }
  94. private Integer getUid() {
  95. Integer uid = redisOperator.get(AGORA_UID) == null ? null : Integer.parseInt(redisOperator.get(AGORA_UID));
  96. if (uid == null) {
  97. uid = 10000;
  98. redisOperator.set(AGORA_UID, String.valueOf(uid), 864000);
  99. } else {
  100. ++uid;
  101. redisOperator.set(AGORA_UID, String.valueOf(uid));
  102. }
  103. return uid;
  104. }
  105. }