本文档中,所有调用IM服务接口的请求都需要按此规则校验,并且遵循如下规则:
以下参数需要放在`Http Request Header`中,如下表:
参数 | 说明 |
---|---|
appid | 开发者平台分配的appid |
nonce | 随机数(最大长度128个字符) |
timestamp | 当前UTC时间戳,从1970年1月1日0点0分0秒开始到现在的描述 |
checksum | SHA1(appsecret + nonce + timestamp),三个参数拼接的字符串,进行SHA1哈希计算,转化成16进制字符(String,小写) |
checksum
校验和,出于安全性考虑,每个checksum
的有效期为5分钟,以timestamp
为准,建议每次请求都生成新的checksum
,同时请确认发起的服务器是与标准时间NTP同步的。
计算checksum
的Java代码举例如下:
import java.security.MessageDigest;
public class CheckSumBuilder {
// 计算并获取CheckSum
public static String getCheckSum(String appSecret, String nonce, String timestamp) {
return encode("sha1", appSecret + nonce + timestamp);
}
// 计算并获取md5值
public static String getMD5(String requestBody) {
return encode("md5", requestBody);
}
private static String encode(String algorithm, String value) {
if (value == null) {
return null;
}
try {
MessageDigest messageDigest
= MessageDigest.getInstance(algorithm);
messageDigest.update(value.getBytes());
return getFormattedText(messageDigest.digest());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static String getFormattedText(byte[] bytes) {
int len = bytes.length;
StringBuilder buf = new StringBuilder(len * 2);
for (int j = 0; j < len; j++) {
buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);
buf.append(HEX_DIGITS[bytes[j] & 0x0f]);
}
return buf.toString();
}
private static final char[] HEX_DIGITS = { '0', '1', '2', '3', '4', '5',
'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' };
}
接口规范说明
appUserId
的长度以及考虑管理appUserSecret
。参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
appId | String | 是 | appId号 |
appUserId | String | 是 | IM账号,最大长度32个字符,必须保证一个App内唯一(只允许字母、数字、下划线组成),不区分大小写,会统一作小写处理 |
avatarUrl | String | 否 | IM账号头像URL,最大长度1024 |
appUserSecret | String | 否 | IM账号指定im appUserSecret值,最大长度128字符,若未指定,会自动生成appUserSecret,并在创建成功后返回 |
nickName | String | 否 | 昵称 |
sex | int | 否 | 0:表示女,1:表示男 |
birthday | String | 否 | 生日,如:2001-01-02 12:30:00 |
level | String | 否 | 等级 |
country | String | 否 | 国家,如:中国 |
workingPlace | String | 否 | 工作地点 |
birthPlace | String | 否 | 出生地 |
personalData | String | 否 | 个人数据 |
hobby | String | 否 | 兴趣 |
ext1 | String | 否 | 用户名片扩展字段,最大长度1024字符,用户可自行扩展,建议封装成JSON字符串 |
ext2 | String | 否 | 用户名片扩展字段,最大长度1024字符,用户可自行扩展,建议封装成JSON字符串 |
ext3 | String | 否 | 用户名片扩展字段,最大长度1024字符,用户可自行扩展,建议封装成JSON字符串 |
ext4 | String | 否 | 用户名片扩展字段,最大长度1024字符,用户可自行扩展,建议封装成JSON字符串 |
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
public class Test {
public static void main(String[] args) throws Exception{
DefaultHttpClient httpClient = new DefaultHttpClient();
String url = "https://console-sdk.253.com/qfdevelop/im/user/create.action";
HttpPost httpPost = new HttpPost(url);
String appId = "94kid09c9ig9k1loimjg012345123456";
String appSecret = "123456789012";
String nonce = "12345";
String curTime = String.valueOf((new Date()).getTime() / 1000L);
String checkSum = CheckSumBuilder.getCheckSum(appSecret, nonce ,curTime);//参考 计算CheckSum的java代码
// 设置请求的header
httpPost.addHeader("appId", appId);
httpPost.addHeader("nonce", nonce);
httpPost.addHeader("timestamp", curTime);
httpPost.addHeader("checkSum", checkSum);
httpPost.addHeader("Content-Type", "application/x-www-form-urlencoded;charset=utf-8");
// 设置请求的参数
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("appId", appId));
nvps.add(new BasicNameValuePair("appUserId", "A-1332467987075"));
httpPost.setEntity(new UrlEncodedFormEntity(nvps, "utf-8"));
// 执行请求
HttpResponse response = httpClient.execute(httpPost);
// 打印执行结果
System.out.println(EntityUtils.toString(response.getEntity(), "utf-8"));
}
}
“Content-Type”: “application/json; charset=utf-8”
{
"code":"0",
"desc":"success",
"log_id":"L832939405-29212",
"result": {
"appUserId":"C198234AIUDF",
"appUserSecret":"xxxxxxx",
"name":"xx"
}
}
接口规范说明
参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
appId | String | 是 | 应用的appId号 |
appUserId | String | 是 | IM账号,最大长度32个字符,必须保证一个APP内唯一 |
appUserSecret | String | 是 | IM账号可以指定登录appUserSecret值,最大长度128个字符 |
返回说明:
“Content-Type”: “application/json; charset=utf-8”
返回示例:
{
"code":"0",
"desc":"success",
"log_id":"L832939405-29212",
"result": {
"appUserId":"C198234AIUDF",
"appUserSecret":"xxxxxxx",
"name":"xx"
}
}
规范说明
appUserId
将不能再登录,若封禁,该appUserId
处于登录状态,则当前登录不影响,仍然可以收发消息,封禁效果会在下次登录生效,因此建议将needKick
设置为true
,让改账号同时被踢出登录。处于安全目的,账号创建后只能封禁,不能删除,风景后账号仍然计入应用内账号总数。参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
appId | String | 是 | 应用的appId号 |
appUserId | String | 是 | IM账号,最大长度32个字符,必须保证一个APP内唯一 |
needKick | String | 否 | 是否踢掉被禁用户,true或false,默认false |
ext1 | String | 否 | 踢人时的扩展字段 |
返回说明:
“Content-Type”: “application/json; charset=utf-8”
返回示例:
{
"code":"0",
"desc":"success",
"log_id":"L832939405-29212",
"result": {
}
}
接口规范说明
参数说明:
参数 | 类型 | 必须 | 说明 |
---|---|---|---|
appId | String | 是 | 应用的appId号 |
appUserId | String | 是 | IM账号,最大长度32字符,必须保证一个APP内唯一 |
返回说明:
“Content-Type”: “application/json; charset=utf-8”
返回示例:
{
"code":"0",
"desc":"success",
"log_id":"L832939405-29212",
"result": {
}
}