快财学堂WebApi接口文档
live-cloud
协议
1,使用HTTP协议进行信息交互,字符编码为UTF-8
3,暂时只支持POST请求
4,Content-Type: application/json;charset=UTF-8 ,返回json格式
请求频率
接口鉴权
1,除了sign之外,所有body请求参数都需要进行URL编码加密
2,系统参数以及签名规则
<1>body公共参数说明
参数 |
名称 |
必填 |
说明 |
account |
商户号 |
Y |
合作方编号 |
signature |
签名 |
Y |
参数经过加密转码之后的HMAC签名,签名规则见#<3> |
timestamp |
时间戳 |
Y |
unix时间戳 |
<2>接口返回格式
参数 |
名称 |
说明 |
code |
状态码 |
为0表示请求正常,>0表示异常参见状态码 |
message |
提示信息 |
|
exception |
异常提示信息 |
请求失败的提示信息 |
data |
请求返回数据 |
格式具体见接口 |
<3>签名规则
签名生成规则如下:
1,将请求body中的所有请求参数,加上请求的时间戳(timestamp),加商户号(account),按照key升序排序
2,将key和它对应的value拼接成一个字符串。按步骤1中顺序,把所有键值对字符串拼接成一个字符串。
如: body ->
{"a":"a","b":"b","c":"c","d":"是哒是哒省点钱我的亲戚到青岛去@!#sad","account":"1000","timestamp":1598352333703}
排序拼接后为:
parm ->
aaaccount1000bbccd是哒是哒省点钱我的亲戚到青岛去@!#sadtimestamp1598352333703
3,将拼接后的字符串URLEncode编码 :
parm ->
aaaccount1000bbccd%E6%98%AF%E5%93%92%E6%98%AF%E5%93%92%E7%9C%81%E7%82%B9%E9%92%B1%E6%88%91%E7%9A%84%E4%BA%B2%E6%88%9A%E5%88%B0%E9%9D%92%E5%B2%9B%E5%8E%BB%40%EF%BC%81%23sadtimestamp1598352333703
4, 使用我们给的商户密钥(secretKey) 进行HmacMd5加密,再将二进制转化为大写的十六进制字符串,并大写
对应JAVA demo:
public class HmacMd5Encypter {
/**
* 将请求参数按照HmacMd5加密
* @param params
* @param secretKey
* @return 大写的MD5加密字符串
* @throws IOException
*/
public static String encryptRequest(Map<String,Object> params, String secretKey ) throws IOException {
/**1,检查参数是否已经排序*/
String[] keys = params.keySet().toArray(new String[0]);
Arrays.sort(keys);
/**2,把所有参数名和参数值串在一起*/
StringBuilder query = new StringBuilder();
for (String key : keys) {
Object value = params.get(key);
if (!StrUtil.isEmpty(key) && !ObjectUtil.isEmpty(value)) {
query.append(key).append(value);
}
}
Console.log(query.toString());
/**3,URL encode*/
String encode = URLEncoder.encode(query.toString(), "UTF-8");
/**3,HMAC加密*/
byte[] bytes = encryptHMac(encode, secretKey);
// 第四步:把二进制转化为大写的十六进制
return byte2hex(bytes);
}
private static byte[] encryptHMac(String data, String secret) throws IOException {
byte[] bytes;
try {
SecretKey secretKey = new SecretKeySpec(secret.getBytes(StandardCharsets.UTF_8), "HmacMD5");
Mac mac = Mac.getInstance(secretKey.getAlgorithm());
mac.init(secretKey);
bytes = mac.doFinal(data.getBytes(StandardCharsets.UTF_8));
} catch (GeneralSecurityException gse) {
throw new IOException(gse.toString());
}
return bytes;
}
private static String byte2hex(byte[] bytes) {
StringBuilder sign = new StringBuilder();
for (byte aByte : bytes) {
String hex = Integer.toHexString(aByte & 0xFF);
if (hex.length() == 1) {
sign.append("0");
}
sign.append(hex.toUpperCase());
}
return sign.toString();
}
public static void main(String[] args) throws IOException {
String key = "1df44eda149109cce861f061766b1684b26917d7";
JSONObject mao = JSONObject.parseObject("{\n" +
"\t\"a\": \"a\",\n" +
"\t\"account\": \"1000\",\n" +
"\t\"b\": \"b\",\n" +
"\t\"c\": \"c\",\n" +
"\t\"d\": \"是哒是哒省点钱我的亲戚到青岛去@!#sad\",\n" +
"\t\"signature\": \"115A4124C385A4E2C14B76D06FED30D3\",\n" +
"\t\"timestamp\": 1598352333703\n" +
"}");
mao.remove("signature");
Console.log(mao);
Console.log(JSON.toJSONString(mao));
String encryptRequest = encryptRequest(mao, key);
Console.log(encryptRequest);
}
4>生成的签名(signature)放入接口的请求body中,最终接口的请求body参数如下
{
"account": "1000",
"timestamp": 1598352333703,
"signature":"115A4124C385A4E2C14B76D06FED30D3",
"xx":"xxx"...
}
课程管理
获取课程信息
批量获取信息(ids)
获取指定时间段的课程信息
广播
发送事件
用户管理
用户授权
[post] /openApi/vistor/partnerCustomerLogin
body :
聊天信息
获取课程聊天记录(分页)
访客信息
获取课程访客记录(分页)
回调(一个回调接口,不同的key)
创建课程的推送
统计数据
查询在线人数