接口文档:http://api-docs.easemob.com/
第一步:注册环信账号,创建应用
此时,就会得到
- ORG_NAME
- CLIENT_ID
- CLIENT_SECRET
- APP_NAME
- URL_PREFIX = “http://a1.easemob.com/” + ORG_NAME + “/” + APP_NAME + “/”
第二步:封装成工具类
package com.youju.framework.utils;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.youju.framework.utils.shengwang.HuanxinToken;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.*;
import org.springframework.stereotype.Component;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestClientException;
import org.springframework.web.client.RestTemplate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/**
* 环信的即时通信工具类
*/
@Component
public class HuanxinUtils {
@Value("${huanxin.clientId}")
private String clientId;
@Value("${huanxin.clientSecret}")
private String clientSecret;
@Value("${huanxin.urlPrefix}")
private String urlPrefix;
private static RestTemplate restTemplate = new RestTemplate();
public String getClientId() {
return clientId;
}
public void setClientId(String clientId) {
this.clientId = clientId;
}
public String getClientSecret() {
return clientSecret;
}
public void setClientSecret(String clientSecret) {
this.clientSecret = clientSecret;
}
public String getUrlPrefix() {
return urlPrefix;
}
public void setUrlPrefix(String urlPrefix) {
this.urlPrefix = urlPrefix;
}
// private static final String URL_PREFIX = "http://a1.easemob.com/" + ORG_NAME + "/" + APP_NAME + "/"; // 链接前缀
public enum HXMessageType {
TXT, //文本
IMG, //图片
LOC, //位置
AUDIO, //音频
VIDEO, //视频
FILE //文件
}
/**
* 获取token
* 响应:"access_token": "token的字符",
*
* @return String str类型的token
*/
public HuanxinToken getToken() {
try {
JSONObject body = new JSONObject();
body.put("grant_type", "client_credentials");
body.put("client_id", clientId);
body.put("client_secret", clientSecret);
HttpEntity httpEntity = new HttpEntity(body.toString(), null);
ResponseEntity<HuanxinToken> tokenResponseEntity = restTemplate.postForEntity(urlPrefix + "token", httpEntity, HuanxinToken.class);
return tokenResponseEntity.getBody();
} catch (RestClientException e) {
e.printStackTrace();
return null;
}
}
/**
* 获取HttpHeaders
*
* @param contentType 客户端发送类型
* @param accept 响应类型
* @return HttpHeaders
*/
public HttpHeaders getHttpHeaders(MediaType contentType, MediaType... accept) {
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer " + getToken().getAccess_token());
headers.setContentType(contentType != null ? contentType : MediaType.APPLICATION_JSON);
headers.setAccept(Arrays.asList((accept != null && accept.length > 0) ? accept : new MediaType[]{MediaType.APPLICATION_JSON}));
return headers;
}
/**
* 添加用户(注册)
*
* @param username 用户名(手机号,非空唯一)
* @param password 密码
* @param nickname 昵称(先给个默认的桔友id,允许注册的时候修改)
* @return boolean 是否成功注册
*/
public boolean addUser(String username, String password, String nickname) {
try {
JSONArray body = new JSONArray();
JSONObject tempJson = new JSONObject();
tempJson.put("username", username);
tempJson.put("password", password);
tempJson.put("nickname", nickname);
body.add(tempJson);
HttpEntity entity = new HttpEntity(body.toString(), getHttpHeaders(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON));
ResponseEntity<Object> responseEntity = restTemplate.postForEntity(urlPrefix + "users", entity, null);
return responseEntity.getStatusCodeValue() == 200;
} catch (RestClientException e) {
e.printStackTrace();
return false;
}
}
/**
* 修改用户密码
*
* @param username 用户名
* @param newpassword 新密码
* @return boolean 是否成功
*/
public boolean updatePassword(String username, String newpassword) {
try {
JSONObject body = new JSONObject();
body.put("newPassword", newpassword);
HttpEntity entity = new HttpEntity(body.toString(), getHttpHeaders(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON));
restTemplate.put(urlPrefix + "users/{username}/password", entity, null, username);
return true;
} catch (RestClientException e) {
e.printStackTrace();
return false;
}
}
/**
* 删除用户(删除一个用户会删除以该用户为群主的所有群组和聊天室)
* DELETE /{org_name}/{app_name}/users/{username}
*
* @param username 用户名
* @return boolean 是否成功
*/
public boolean updatePassword(String username) {
try {
HttpEntity httpEntity = new HttpEntity(null, getHttpHeaders(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON));
restTemplate.delete(urlPrefix + "/users/{usernam}", httpEntity, null, username);
return true;
} catch (RestClientException e) {
e.printStackTrace();
return false;
}
}
/**
* 添加好友
* POST /{org_name}/{app_name}/users/{owner_username}/contacts/users/{friend_username}
*
* @param ownerUsername 自己账号
* @param friendName 需要添加好友的账号
* @return boolean 是否成功
*/
public boolean addFreind(String ownerUsername, String friendName) {
try {
HttpEntity httpEntity = new HttpEntity(null, getHttpHeaders(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON));
ResponseEntity<Object> responseEntity = restTemplate.postForEntity(urlPrefix + "/users/{owner_username}/contacts/users/{friend_username}"
, httpEntity, null, ownerUsername, friendName);
return responseEntity.getStatusCodeValue() == 200;
} catch (RestClientException e) {
e.printStackTrace();
return false;
}
}
/**
* 删除好友
* DELETE /{org_name}/{app_name}/users/{owner_username}/contacts/users/{friend_username}
*
* @param ownerUsername 自己账号
* @param friendName 需要添加好友的账号
* @return boolean 是否成功
*/
public boolean deleteFreind(String ownerUsername, String friendName) {
try {
HttpEntity httpEntity = new HttpEntity(null, getHttpHeaders(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON));
restTemplate.delete(urlPrefix + "/users/{owner_username}/contacts/users/{friend_username}"
, httpEntity, null, ownerUsername, friendName);
return true;
} catch (RestClientException e) {
e.printStackTrace();
return false;
}
}
/**
* 查看好友列表
* GET /{org_name}/{app_name}/users/{owner_username}/contacts/users
*
* @return String 集合的字符串
*/
public String findFreindList(String ownerUsername) {
try {
HttpEntity httpEntity = new HttpEntity(getHttpHeaders(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON));
ResponseEntity<String> exchange = restTemplate.exchange(urlPrefix + "/users/{owner_username}/contacts/users",
HttpMethod.GET, httpEntity, String.class, ownerUsername);
return exchange.getBody();
} catch (RestClientException e) {
e.printStackTrace();
return "你暂无好友";
}
}
/**
* 发送消息(给一个或多个的用户和群组)
* POST /{org_name}/{app_name}/messages
* target_type :users,
*
* @param sendUser 发送用户
* @param targetUserNames 接收用户
* @param msg 发送消息
* @return boolean 是否成功
*/
public boolean sendToUsers(String sendUser, List<String> targetUserNames, String targetType, String msg) {
try {
JSONObject body = new JSONObject();
if (StringUtils.isNotBlank(targetType)) {
body.put("target_type", targetType);
} else {
body.put("target_type", "users");
}
JSONArray targetArray = new JSONArray();
targetArray.add(targetUserNames);
body.put("target", targetUserNames); // 消息落脚点
JSONObject msgJson = new JSONObject();
msgJson.put("msg", msg);
msgJson.put("type", "txt");
body.put("msg", msgJson); // 消息类型和内容
body.put("from", sendUser); // 消息发送者
// body.put("ext", "String"); // 可以发送自己编辑的专属的消息结构
HttpEntity httpEntity = new HttpEntity(body, getHttpHeaders(MediaType.APPLICATION_JSON, MediaType.APPLICATION_JSON));
ResponseEntity<Object> responseEntity = restTemplate.postForEntity(urlPrefix + "messages", httpEntity, null);
return responseEntity.getStatusCodeValue() == 200;
} catch (RestClientException e) {
e.printStackTrace();
return false;
}
}
public boolean sendToUser(String sendUser, String targetUserName, String targetType, String msg) {
List<String> targetUserNames = new ArrayList<String>();
targetUserNames.add(targetUserName);
return sendToUsers(sendUser, targetUserNames, targetType, msg);
}
/**
* 设置用户属性
*
* @param username 用户名
* @param username proStr "proStr":"weight=90,height=176"
* @return boolean 是否成功修改
*/
public boolean updateProperties(String username, String proStr) {
LinkedMultiValueMap<String,String> map = new LinkedMultiValueMap<>();
String[] strs = proStr.split(",");
for(String s:strs){
String[] ms = s.split("=");
map.add(ms[0], ms[1]);
}
try {
HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Bearer " + getToken().getAccess_token());
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String, String>> requestEntity = new HttpEntity<>(map, headers);
ResponseEntity<String> response = restTemplate.exchange(urlPrefix + "metadata/user/{userName}", HttpMethod.PUT, requestEntity, String.class, username);
return response.getStatusCodeValue() == 200;
} catch (RestClientException e) {
e.printStackTrace();
return false;
}
}
}