2.3.4、获取管理员权限
环信提供的 REST API 需要权限才能访问,权限通过发送 HTTP 请求时携带 token 来体现,下面描述获取 token 的方式。说明:API 描述的时候使用到的 {APP 的 client_id} 之类的这种参数需要替换成具体的值。
重要提醒:获取 token 时服务器会返回 token 有效期,具体值参考接口返回的 expires_in 字段值。由于网络延迟等原因,系统不保证 token 在此值表示的有效期内绝对有效,如果发现 token 使用异常请重新获取新的 token,比如“http response code”返回 401。另外,请不要频繁向服务器发送获取 token 的请求,同一账号发送此请求超过一定频率会被服务器封号,切记,切记!!
client_id 和 client_secret 可以在环信管理后台的 APP 详情页面看到。
HTTP Request
post | /{org_name}/{app_name}/token |
Request Headers
参数 | 说明 |
Content-Type | application/json |
Request Body
Response Body
参数 | 说明 |
access_token | 有效的token字符串 |
expires_in | token 有效时间,以秒为单位,在有效期内不需要重复获取 |
application | 当前 App 的 UUID 值 |
3、抽取环信组件
抽取环信组件到tanhua-autoconfig
工程中
3.1、编写HuanXinTemplate
1. @Slf4j 2. public class HuanXinTemplate { 3. 4. private EMService service; 5. 6. public HuanXinTemplate(HuanXinProperties properties) { 7. EMProperties emProperties = EMProperties.builder() 8. .setAppkey(properties.getAppkey()) 9. .setClientId(properties.getClientId()) 10. .setClientSecret(properties.getClientSecret()) 11. .build(); 12. service = new EMService(emProperties); 13. } 14. 15. //创建环信用户 16. public Boolean createUser(String username,String password) { 17. try { 18. //创建环信用户 19. service.user().create(username.toLowerCase(), password) 20. .block(); 21. return true; 22. }catch (Exception e) { 23. e.printStackTrace(); 24. log.error("创建环信用户失败~"); 25. } 26. return false; 27. } 28. 29. //添加联系人 30. public Boolean addContact(String username1,String username2) { 31. try { 32. //创建环信用户 33. service.contact().add(username1,username2) 34. .block(); 35. return true; 36. }catch (Exception e) { 37. log.error("添加联系人失败~"); 38. } 39. return false; 40. } 41. 42. //删除联系人 43. public Boolean deleteContact(String username1,String username2) { 44. try { 45. //创建环信用户 46. service.contact().remove(username1,username2) 47. .block(); 48. return true; 49. }catch (Exception e) { 50. log.error("删除联系人失败~"); 51. } 52. return false; 53. } 54. 55. //发送消息 56. public Boolean sendMsg(String username,String content) { 57. try { 58. //接收人用户列表 59. Set<String> set = CollUtil.newHashSet(username); 60. //文本消息 61. EMTextMessage message = new EMTextMessage().text(content); 62. //发送消息 from:admin是管理员发送 63. service.message().send("admin","users", 64. set,message,null).block(); 65. return true; 66. }catch (Exception e) { 67. log.error("删除联系人失败~"); 68. } 69. return false; 70. } 71. }
3.2、编写Properties对象
1. @Configuration 2. @ConfigurationProperties(prefix = "tanhua.huanxin") 3. @Data 4. public class HuanXinProperties { 5. 6. private String appkey; 7. private String clientId; 8. private String clientSecret; 9. 10. }
3.3、配置
tanhua-app-server
工程的application.yml
文件加入配置如下
1. tanhua: 2. huanxin: 3. appkey: 1110201018107234#tanhua 4. clientId: YXA6nxJJ_pdEQ_eYUlqcRicS4w 5. clientSecret: YXA6GMUxVEZhAvxlMn4OvHSXbWuEUTE
3.4、测试
1. @RunWith(SpringRunner.class) 2. @SpringBootTest 3. public class HuanXinTest { 4. 5. @Autowired 6. private HuanXinTemplate template; 7. 8. @Test 9. public void testRegister() { 10. template.createUser("user01","123456"); 11. } 12. }
4、用户体系集成
将用户体系集成的逻辑写入到tanhua-server
系统中。
- 探花用户注册时需要将用户信息注册到环信系统中
- 对于老数据:编写单元测试方法批量的注册到环信
- 对于新用户:改造代码(用户注册的时候,自动注册到环信)
- APP从服务端获取当前用户的环信用户密码,自动登入环信系统
- 编写一个接口,获取当前用户在环信的用户名密码
- APP自动获取环信服务器发送的信息数据
4.1、注册环信用户
在用户登录逻辑中,当第一次注册时,将用户信息注册到环信
1. /** 2. * 验证登录 3. * @param phone 4. * @param code 5. */ 6. public Map loginVerification(String phone, String code) { 7. //1、从redis中获取下发的验证码 8. String redisCode = redisTemplate.opsForValue().get("CHECK_CODE_" + phone); 9. //2、对验证码进行校验(验证码是否存在,是否和输入的验证码一致) 10. if(StringUtils.isEmpty(redisCode) || !redisCode.equals(code)) { 11. //验证码无效 12. throw new BusinessException(ErrorResult.loginError()); 13. } 14. //3、删除redis中的验证码 15. redisTemplate.delete("CHECK_CODE_" + phone); 16. //4、通过手机号码查询用户 17. User user = userApi.findByMobile(phone); 18. boolean isNew = false; 19. //5、如果用户不存在,创建用户保存到数据库中 20. if(user == null) { 21. user = new User(); 22. user.setMobile(phone); 23. user.setPassword(DigestUtils.md5Hex("123456")); 24. Long userId = userApi.save(user); 25. user.setId(userId); 26. isNew = true; 27. 28. //注册环信用户 29. String hxUser = "hx"+user.getId(); 30. Boolean create = huanXinTemplate.createUser(hxUser, Constants.INIT_PASSWORD); 31. if(create) { 32. user.setHxUser(hxUser); 33. user.setHxPassword(Constants.INIT_PASSWORD); 34. userApi.update(user); 35. } 36. } 37. //6、通过JWT生成token(存入id和手机号码) 38. Map tokenMap = new HashMap(); 39. tokenMap.put("id",user.getId()); 40. tokenMap.put("mobile",phone); 41. String token = JwtUtils.getToken(tokenMap); 42. //7、构造返回值 43. Map retMap = new HashMap(); 44. retMap.put("token",token); 45. retMap.put("isNew",isNew); 46. 47. return retMap; 48. }
4.2、查询环信用户信息
在app中,用户登录后需要根据用户名密码登录环信,由于用户名密码保存在后台,所以需要提供接口进行返回。
4.2.1 API接口
api地址:http://192.168.136.160:3000/project/19/interface/api/85
4.2.2 vo对象
1. import lombok.AllArgsConstructor; 2. import lombok.Data; 3. import lombok.NoArgsConstructor; 4. 5. @Data 6. @NoArgsConstructor 7. @AllArgsConstructor 8. public class HuanXinUserVo { 9. private String username; 10. private String password; 11. }
4.2.3 代码实现
编写HuanXinController实现: