【探花交友】day06—即时通信(二)

简介: 【探花交友】day06—即时通信(二)

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

参数 说明
grant_type client_credentials
client_id App的client_id,可在app详情页找到
client_secret App的client_secret,可在app详情页找到

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实现:

相关文章
|
JSON JavaScript 前端开发
学习 同源策略,jsonp,跨域 随记
学习 同源策略,jsonp,跨域 随记
125 0
|
缓存 监控 算法
JVM简介—2.垃圾回收器和内存分配策略
本文介绍了Java垃圾回收机制的多个方面,包括垃圾回收概述、对象存活判断、引用类型介绍、垃圾收集算法、垃圾收集器设计、具体垃圾回收器详情、Stop The World现象、内存分配与回收策略、新生代配置演示、内存泄漏和溢出问题以及JDK提供的相关工具。
JVM简介—2.垃圾回收器和内存分配策略
|
缓存 开发工具 数据安全/隐私保护
通过一篇文章带你玩转git和GitHub
在现代软件开发中,版本控制系统是不可或缺的工具。Git和Github是其中最受欢迎的组合。Git是一个开源的分布式版本控制系统,用于追踪代码的改动,而Github则是一个基于Git的代码托管平台,提供了代码托管、协作开发等功能。
415 2
通过一篇文章带你玩转git和GitHub
|
消息中间件 Java 中间件
MQ四兄弟:如何保证消息可靠性
本文介绍了RabbitMQ、RocketMQ、Kafka和Pulsar四种消息中间件的可靠性机制。这些中间件通过以下几种方式确保消息的可靠传输:1. 消息持久化,确保消息在重启后不会丢失;2. 确认机制,保证消息从生产者到消费者都被成功处理;3. 重试机制,处理失败后的重试;4. 死信队列,处理无法消费的消息。每种中间件的具体实现略有不同,但核心思想相似,都是从生产者、中间件本身和消费者三个角度来保障消息的可靠性。
795 0
|
运维 架构师 微服务
谷粒商城:如何通过笔记复盘实现事半功倍?
该博客文章讨论了如何通过笔记复盘来提高学习和工作效率。
谷粒商城:如何通过笔记复盘实现事半功倍?
|
存储 缓存 Java
谷粒商城笔记+踩坑汇总篇
环境的搭建、商品服务-三级分类、品牌服务、阿里云云存储+JSR303数字校验+统一异常处理、spu+sku、分页拦截器、商品服务、仓库服务、Nginx反向代理,thymeleaf+动态展示三级分类、缓存与分布式锁,Redisson+缓存数据一致性、ElasticSearch检索服务、异步和线程池、商品详情搭建+异步编排、认证服务、阿里云短信+验证码防刷+BCrypt加密、用户名密码登录+微博社交登录+SpringSession+xxl-sso单点登录、购物车、订单服务、幂等性、库存自动解锁。MQ延迟队列
谷粒商城笔记+踩坑汇总篇
|
安全 数据安全/隐私保护 Windows
2024一带一路暨金砖国家技能发展与技术创新大赛第二届企业信息系统安全赛项选拔赛(北部赛区)
本文介绍了如何通过分析Kerberos网络流量来查找受感染Windows计算机的信息,包括主机名、IP地址和MAC地址。通过过滤特定的网络流量,可以提取出这些关键信息,帮助识别和定位受感染的设备。文中还提供了相关练习网站,供读者进一步学习和实践。
194 2
|
监控 负载均衡 Dubbo
【探花交友】day00—探花交友前置Dubbo(一)
【探花交友】day00—探花交友前置Dubbo
189 0
|
负载均衡 Java 应用服务中间件
【Nginx】第一章 Nginx简介
【Nginx】第一章 Nginx简介
241 0
|
JSON 前端开发 Java
【Elasticsearch】黑马旅游案例
【Elasticsearch】黑马旅游案例
376 0