移動端用戶註冊 VS 環信IM用戶體系集成
由於業務我們涉及到即時通訊(IM)的原因,在多個第三方的選擇後,選擇了環信。業務的改變導致了接口的重構。下面我就簡述一下環信IM的用戶體系集成的流程以及規則:
名詞解釋
當您申請了 AppKey 後,會得到一個
xxxx#xxxx 格式的字符串,這個就是您的 AppKey,下文中用到的:
- org_name 對應#前面部分
- app_name 對應#後面部分
- client_id 和 client_secret 可以在環信管理後臺的 APP 詳情頁面看到,在獲取token時候要用到。
環信 ID 規則
在註冊環信賬戶的時候,需要注意環信 ID 的規則:
- 使用英文字母和(或)數字的組合
- 不能使用中文
- 不能使用 email 地址
- 不能使用 UUID
- 用戶ID的長度在255字節以內
- 中間不能有空格或者井號(#)等特殊字符
- 允許的用戶名正則 “[a-zA-Z0-9_-.]*”(a~z大小寫字母/數字/下劃線/橫線/英文句號),其他都不允許
如果是大寫字母會自動轉成小寫
- 不區分大小寫。系統忽略大小寫,認爲 AA、Aa、aa、aA 都是一樣的。如果系統已經存在了環信 ID 爲 AA 的用戶,再試圖使用 aa 作爲環信 ID 註冊新用戶,系統返回用戶名重複,以此類推。但是請注意:環信 ID 在數據上的表現形式還是用戶最初註冊的形式,註冊時候使用的大寫就保存大寫,是小寫就保存小寫。即:使用 AA 註冊,環信保存的 ID 就是 AA;使用 Aa 註冊,環信保存的 ID 就是 Aa,以此類推。
數據結構
廢話不多說了,上車。
package com.xunxin.controller.app.huanxin;
import java.util.ArrayList;
import java.util.List;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.xunxin.controller.system.BaseController;
import com.xunxin.dao.sys.PlatformMutualityManagentDao;
import com.xunxin.util.HttpUtils;
import com.xunxin.util.HttpUtils.UHeader;
import com.xunxin.vo.sys.PageData;
import com.xunxin.vo.sys.PlatformMutualityManagent;
import com.xunxin.web.api.bean.Response;
import com.xunxin.web.api.bean.Router;
/**
* Copyright © 2017 noseparte(Libra) © Like the wind, like rain
* @Author Noseparte
* @Compile 2017年10月24日 -- 下午5:31:38
* @Version 1.0
* @Description 獲取環信SDK的返回信息
*/
@Controller
@RequestMapping(value=Router.PATH+Router.Easemob.PATH)
public class EasemobController extends BaseController{
private static final Logger log = Logger.getLogger(EasemobController.class);
private static final String LINKED_URL = "http://www.easemob.com/";
@Autowired
private PlatformMutualityManagentDao platformMutualityManagentDao;
@RequestMapping(value=Router.Easemob.GET_TOKEN,method=RequestMethod.POST)
@ResponseBody
public Response getToken(PageData pd) {
log.info("info-: get huanxin token begin");
Response res = this.getReponse();
try {
PlatformMutualityManagent pm = platformMutualityManagentDao.findOne(pd);
String app_key = pm.getApp_key();
String org_name = app_key.split("#")[0]; //組織名稱
String app_name = app_key.split("#")[1]; //APP名稱
String client_id = app_key.split("#")[1]; //客戶端id
String client_secret = app_key.split("#")[1]; //客戶端密鑰
//post請求路徑
String url = LINKED_URL + org_name + "/" + app_name + "/" + "token";
//post請求參數 json
StringBuffer sb = new StringBuffer();
sb.append("grant_type:").append("client_credentials");
sb.append("client_id:").append(client_id);
sb.append("client_secret:").append(client_secret);
String argJson = sb.toString();
//請求頭信息
List headerList = new ArrayList();
headerList.add(new UHeader("Content-Type", "application/json"));
//獲取環信token
String resp = HttpUtils.getPostResponse(url, argJson, headerList);
JSONObject obj = JSON.parseObject(resp);
//TODO 判斷response 狀態碼
String access_token = obj.getString("access_token"); //token 值
String expires_in = obj.getString("expires_in"); //token 有效時間,以秒爲單位,在有效期內不需要重複獲取
String application = obj.getString("application"); //token 有效時間,以秒爲單位,在有效期內不需要重複獲取
//獲得返回值 並解析
PageData tokenPd = new PageData<>();
tokenPd.put("access_token", access_token);
tokenPd.put("expires_in", expires_in);
tokenPd.put("application", application);
log.info("infoMsg:- get token success, ok");
return res.success(tokenPd);
} catch (Exception e) {
log.error("errorMsg:- An error occurred when get token!");
return res.failure(e.getMessage());
}
}
}