Appearance
总体规范
1 消息头规范
请求方式:POST
Content-Type: application/json
签名方式:
- header中定义需要参与签名或者公共的与具体业务无关的属性
- 将header中需要参与签名的参数按照字母ascii排列组成字符串如:"{"appid":"8c58593ad151","md5":"cb88af352e8871802ec4ce60162df99d","timestamp":"231545134555","token":"eyJhbGciJ9.eyJzdWIiOiJ24i.LVJnaW9uIiwiZXp8","version":"3.1.2"}",并对字符串按照RSA安全哈希算法签名方法进行签名
- appid: 请在开发者控制台获取
- RSA密钥:请在开发者控制台获取
- md5:将body中的json字符串进行MD5计算,32位小写字符串
- 空字段不参与签名
header参数说明
参数名称 | 参数类型 | 是否必须 | 是否参与签名 | 长度 | 参数含义 | 说明 |
---|---|---|---|---|---|---|
appid | String | Y | Y | 32 | 分配的appid | 从开发者控制台获取 |
bundleId | String | N | Y | 32 | app的唯一标识 | |
md5 | String | Y | Y | 32 | 消息参数的MD5值 | 直接对body的json字符串进行计算,json不包含空格和换行,32位小写 |
msgSeq | String | N | Y | 32 | 消息序列号 | 000000000001小于32位 没有消息号时不参与签名 |
timestamp | String | Y | Y | 16 | 时间戳 | 单位毫秒 |
token | String | N | Y | 32 | 鉴权令牌 | 鉴权令牌 不需要鉴权时不参与签名 |
version | String | Y | Y | 16 | 客户端版本号 | 如:1.0.0 |
signature | String | Y | N | 256 | 签名参数的签名值 | 签名按照上面的顺序组成字符串签名 |
示例:
appid: fddd156152DCMM
timestamp: 1540255799000
msgSeq: 0000000016
token: 8909876088df4faf843e0460b96513b1
md5: 123456789019a6bbc590eea7df62cb32
Version:2.3.2
signature: aVhwAFO80zOUDjdiuandi/UPqy9d3ANti3pltIhijy2GnJKOYebVXRujSqKlDCTvh5MAy+98py9OfyOSEaIcEzWkSw+9gyJj4AqVfJIXX/vOxNTmQNvlxS52NATWP5yNYqqAI2s67p1Zx9VXFBXCrUra4D7g6CMuEcdwAn+w=
- body参数说明
参数名称 | 参数类型 | 是否必须 | 参数含义 | 说明 |
---|---|---|---|---|
userId | String | Y | 用户id | 示例,非必有字段 |
TIP
如果无参数,仍然需要{}空的json字符串
示例:
{
"userId":17
}
2 响应报文
- 参数说明
参数名称 | 参数类型 | 是否加密 | 参数含义 | 说明 |
---|---|---|---|---|
resultCode | String | Y | 响应码 | 参考响应码定义 |
resultMsg | String | Y | 响应描述 | |
total | Integer | N | 记录数 | 分页查询时使用 |
page | Integer | N | 当前页 | 分页查询时使用 |
pageSize | Integer | N | 每页大小 | 分页查询时使用,最大为100 |
data | Object/List | N | 版本号 | 响应数据,支持普通业务数据以及列表两种方式 |
- 不带分页
{
"resultCode":"000000",
"resultMsg": "成功",
"data": {
"userName":"demo",
"userNickName": "示例"
}
}
- 带分页
{
"resultCode":"000000",
"resultMsg": "成功",
"total": 100,
"page": 1,
"pageSize": 2,
"data": [{
"userName":"demo1",
"userNickName": "示例1"
},{
"userName":"demo1",
"userNickName": "示例1"
}]
}
3 响应码
响应码 | 描述 |
---|---|
000000 | 成功 |
000001 | 服务器内部错误 |
000002 | 请求内容格式不合法 |
000003 | 请求参数不合法 |
000004 | 签名验证失败 |
000005 | 非法访问 |
11501 | key不存在 |
11502 | 签名无效 |
11503 | token无效 |
11504 | token过期 |
12054 | url编码异常 |
4 header签名方法
try{
/*
Base64:java.util
PKCS8EncodedKeySpec:java.security
KeyFactory:java.security
Signature:java.security
*/
//需要签名字符串
String jsonString= "{\"appid\":\"58c8793ad66511e89e060050569d3255\",\"md5\":\"cb88af352e8871802ec4ce60162df99d\",\"timestamp\":\"231545134555\",\"token\":\"eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJjZXNoaS0wMDMiLCJyZWdpb24iOiJjZXNoaXlzLVJnaW9uIiwiZXhwIjoxNTQyNzYwNzI1LCJpYXQiOjE1NDIxNTU5MjUsImp0aSI6IjE1NDIxNTU5MjU0MzUifQ.ovydm2u5Bc0UP08RttNWrSttyde86gcUK9GxNPDDQp8\",\"version\":\"3.1.2\"}";
//RSA密钥
String privateKey = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAM1BEzOAMVv5aTgM7khzKdcuqM7GjCPQtAoiizWLb924KIAJuGPvJhRMZowa83+4tsYmsdPt+zhOFr6OdsIhfaSHcYAo/N/ehHaot1pO54fWYbIRpuwegj54w+qMdZLxMhzRHy5ZA53j47SVwblSebRGTGpbCRf41xArxdUs+xV3AgMBAAECgYBYn3Vz8jDdvoXw3pxwCdGSCKJ4jX/q4u0pxxqGZwtJF3/dMNU9yP+PGiHY8rYaep3oVsLHd+TVvdnSM18RmTZO8hta51iBcs+zWy7PqY0GiGXNvBC3y3OBOKb49FvXawERzsY7adTmWyHNyS2RGBF7ZGbUPJVPSJiAR5vknOfogQJBAPvnUM+JDZhUzjQRkOyx5KWYT88H1LWXDS5zTTsdqhzBAJc2gjEVVCRL5aWtQS/3q/X++Oo2+wbmp0lTKXKgZjcCQQDQl45hdtqczxAUcP/aCdmIDMqCQNL1oaTtIU/WTrX4N8gjAHR/uBPPfvmxkA5zx7B8ywthAslclfpigVMkfyrBAkEAnY16D7Pq2uH/7rUl7cT9+0yebiC5u7H0Pp9DKLxPD5jvY6RmHYj3jZQi2FLauMOxvDRzPxqQOyq8arIm9Fi6VQJAPbsMbPWintN8m8ARR7KwiN3YNJIAnKbYy0CXgwHKQoonlYw17fJJEpguRwkt7b/EEDp6xJvxgY/1CJ/jPiLQQQJBAO5e2zjoZgM7glOWoz/ks9Kcu9uW8WDevs8JYyRDnxQVKDcNUlfzH3tTgLhuWco3zr2XyDMzrbUvrvOF40LaGzc=";
Base64.Encoder encoder = Base64.getEncoder();
Base64.Decoder decoder = Base64.getDecoder();
PKCS8EncodedKeySpec priPKCS8 = new PKCS8EncodedKeySpec(decoder.decode(privateKey.getBytes()));
PrivateKey priKey = KeyFactory.getInstance("RSA").generatePrivate(priPKCS8);
Signature signature = Signature.getInstance("SHA1WithRSA");
signature.initSign(priKey);
signature.update(jsonString.getBytes("utf-8"));
String signarureString = encoder.encodeToString(signature.sign());
}catch (Exception e){}