接入指导

## 接入指导 ### 一、本接口接入遵循以下约定 - - 网关地址:https://ioe.car900.com - 接口地址: 网关地址+接口路径(详见每个接口) - 请求方式: POST/GET - 数据格式: - 请求:Content-Type:application/x-www-form-urlencoded - 返回:Content-Type:application/json - 编码方式:UTF-8 - 公共参数: - appId: 应用 ID,由云想印提供 - token: 签名 token(算法见下方) - timestamp: 请求时间戳(毫秒),格式:1632745900575 - requestId: 请求标识,用于唯一标识当前请求 - userCode: 用户账户名称(同appId) - 公共响应 - Code: 错误码,详见[错误码](doc:jWCERdCP) - Msg: 错误信息,详见[错误码](doc:jWCERdCP) - Data: 返回结果集 - Total: 返回结果集数量 ### 二、签名算法 第一步:将公共请求参数,除token外,按照Ascii由小到大排序,参数1+参数1的值+参数2+参数2的值+…+参数n+参数n的值,拼接成 **stringA** 参数值为空不参考签名 第二步:将 stringA最后面拼接上appSecret,得到 **stringSignTemp** 字符串,并对 stingSignTemp 进行 MD5 运算,再将得到的字符串**转为大写**,就是签名 **token** 签名算法 JAVA 代码示范 ```java /** * 获取token * * @param objectMap 接口请求参数appId,timestamp,requestId,userCode * @param appSecret 密钥 * @return */ public static String getToken(Map<String, Object> objectMap, String appSecret) { StringBuffer content = new StringBuffer(); List keys = new ArrayList(); for (String key : objectMap.keySet()) { switch (key) { case "appId": keys.add(key); break; case "timestamp": keys.add(key); break; case "requestId": keys.add(key); break; case "userCode": keys.add(key); break; } } Collections.sort(keys); for (int i = 0; i < keys.size(); i++) { String key = keys.get(i); String value = objectMap.get(key).toString(); if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(value)) { content.append(key).append(value); } else { return "key:" + key + "的值非法"; } } System.out.println("加密字符串:" + content); return HashUtil.MD5(content.append(appSecret)).toUpperCase(); } ``` 官方开放平台文档:[https://bsj2.yuque.com/docs/share/f500d056-6a9d-4847-a5c5-c6a163742eb8?#](https://bsj2.yuque.com/docs/share/f500d056-6a9d-4847-a5c5-c6a163742eb8?#)