Skip to content

总体规范

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参数说明

参数名称参数类型是否必须是否参与签名长度参数含义说明
appidStringYY32分配的appid从开发者控制台获取
bundleIdStringNY32app的唯一标识
md5StringYY32消息参数的MD5值直接对body的json字符串进行计算,json不包含空格和换行,32位小写
msgSeqStringNY32消息序列号000000000001小于32位 没有消息号时不参与签名
timestampStringYY16时间戳单位毫秒
tokenStringNY32鉴权令牌鉴权令牌 不需要鉴权时不参与签名
versionStringYY16客户端版本号如:1.0.0
signatureStringYN256签名参数的签名值签名按照上面的顺序组成字符串签名

示例:

appid: fddd156152DCMM
timestamp: 1540255799000
msgSeq: 0000000016
token: 8909876088df4faf843e0460b96513b1
md5: 123456789019a6bbc590eea7df62cb32
Version:2.3.2
signature: aVhwAFO80zOUDjdiuandi/UPqy9d3ANti3pltIhijy2GnJKOYebVXRujSqKlDCTvh5MAy+98py9OfyOSEaIcEzWkSw+9gyJj4AqVfJIXX/vOxNTmQNvlxS52NATWP5yNYqqAI2s67p1Zx9VXFBXCrUra4D7g6CMuEcdwAn+w=
  • body参数说明
参数名称参数类型是否必须参数含义说明
userIdStringY用户id示例,非必有字段

TIP

如果无参数,仍然需要{}空的json字符串

示例:

{
    "userId":17
}

2 响应报文

  • 参数说明
参数名称参数类型是否加密参数含义说明
resultCodeStringY响应码参考响应码定义
resultMsgStringY响应描述
totalIntegerN记录数分页查询时使用
pageIntegerN当前页分页查询时使用
pageSizeIntegerN每页大小分页查询时使用,最大为100
dataObject/ListN版本号响应数据,支持普通业务数据以及列表两种方式
  • 不带分页
{
    "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非法访问
11501key不存在
11502签名无效
11503token无效
11504token过期
12054url编码异常

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){}