# reformer-sdk **Repository Path**: howfree/reformer-sdk ## Basic Information - **Project Name**: reformer-sdk - **Description**: 立方停车-开放平台sdk - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2025-07-22 - **Last Updated**: 2025-07-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 开放平台API文档 [TOC] --- ### queryPark(停车场信息查询接口) #### 版本号 1.0 #### API应用场景说明 根据停车场编号查询开放平台中对应的停车场信息 #### 字符编码 HTTP请求统一采用UTF-8字符编码 #### 请求地址 环境 | HTTP请求地址 ---|--- 正式环境 | http://jd0571.leway.com.cn:9090/open-platform/gateway.do #### 请求参数 **公共请求参数** 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 ---|---|---|---|---|--- id | String | 是 | 11 | http客户端自定义请求编号,原样返回 | 1 ver | String | 是 | 3 | 调用接口的版本,固定为:1.0 | 1.0 cmd | String | 是 | 255 | 接口名称 | queryPark mchId | String | 是 | 10 | 商户id | 12000006 onceStr | String | 是 | 32 | 随机字符串 | NBT3LZ45BL14QXFVDFNCXZ122PX05DRV timestamp | String | 是 | 14 | 发起请求的时间,格式:yyyyMMddHHmmss | 20170410185441 sign | String | 是 | 32 | 商户请求参数的签名 | 详见安全规范-签名算法 **业务参数** 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 ---|---|---|---|---|--- parkinglotno | String | 是 | 20 | 开放平台停车场编号,批量查询时以逗号,隔开,如1703271547033416, 1703271547033400 | 1703271547033416 #### 响应参数 **公共响应参数** 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 ---|---|---|---|---|--- errno | String | 是 | 5 | 响应状态码 | 200,此字段是查询结果标识,详见响应码字典 errtext | String | 是 | 100 | 响应状态描述 | SUCCESS id | String | 是 | 10 | http客户端请求的编号,原样返回 | 1 ver | String | 是 | 3 | 调用接口的版本,固定为:1.0 | 1.0 cmd | String | 是 | 255 | 接口名称,原样返回 | queryPark 以下参数在errno为200时有返回 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 ---|---|---|---|---|--- onceStr | String | 是 | 32 | 随机字符串 | NBT3LZ45BL14QXFVDFNCXZ122PX05DRV mchId | String | 是 | 10 | 商户id | 12000006 sign | String | 是 | 32 | 开放平台返回的签名 | 详见示例 responseBody | String | 是 | 不限 | 响应核心数据 | 详见示例 responseBody中所含参数 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 ---|---|---|---|---|--- parkinglotno | String | 是 | 20 | 开放平台停车场编号 | 1703271547033416 parkName | String | 是 | 100 | 停车场名称 | 立方测试停车场 regionCode | String | 是 | 6 | 所在区域(区/县)行政区划代码。检索地址:http://www.stats.gov.cn/tjsj/tjbz/xzqhdm/ | 建德市:330182 address | String | 是 | 255 | 停车场地址 | 武阳门1号 lon | String | 是 | 20 | 经度 | 119.59779687499996 lat | String | 是 | 20 | 纬度 | 31.324736255644652 totalCount | String | 是 | 11 | 总车位数 | 50 freeCount | String | 是 | 11 | 空闲车位数 | 20 chargerule | String | 是 | 100 | 收费规则描述 | 每小时2元 #### 请求示例 JAVA版本 ```java ReformerClient client = new DefaultReformerClient("http://jd0571.leway.com.cn:9090/open-platform/gateway.do", "mchId", "your api key"); QueryParkRequest request = new QueryParkRequest(); request.putBizParam("parkinglotno", "777770"); QueyParkResponse response = client.execute(request); if(response.isSuccess()){ System.out.println(response.getResponseBody()); } ``` Python版本 ```python client = ReformerClient("http://jd0571.leway.com.cn:9090/open-platform/gateway.do", " mchId ", " your api key ") request = QueryParkRequest({"parkinglotno":"777770"}) response = client.execute(request) if response.isSuccess(): print(response.getDataBody()) ``` HTTP版本(curl工具) ```sh $ curl -H "Content-Type: application/json" -X POST --data '{"ver":"1.0","data":{"mchId":"12000013","sign":"403BE96B65321D2B663FEF7E67ECAA42","onceStr":"W52005JJM00L68WWUJ284","parkinglotno":"777770","timestamp":"20170411140958"},"id":"1","cmd":"queryPark"}' http://jd0571.leway.com.cn:9090/open-platform/gateway.do ``` #### 响应示例 ```json { "cmd": "queryPark", "data": { "mchId": 12000013, "responseBody": "[{\"regionCode\":\"110102\",\"address\":\"武阳门1号\",\"parkName\":\"立方测试停车场\",\"chargerule\":\"2元/小时\",\"lon\":\"116.3972\",\"parkinglotno\":\"777770\",\"totalCount\":\"120\",\"lat\":\"39.910187\",\"freeCount\":\"2\"}]", "sign": "FE7AC9AEDB703FD2E6AB481CEB45A2DC", "onceStr": "YUUUFNEYPLLJ8012GOOWB8U397KK9PKT" }, "errno": "200", "errtext": "SUCCESS", "id": "1", "ver": "1.0" } ``` > 为确保安全通信,需自行验证响应示例中的sign值是否为立方开放平台所提供。 异常示例 ```json { "cmd": "queryPark", "errno": "131", "errtext": "权限不足", "id": "1", "ver": "1.0" } ``` --- ### updateParkSpaceCount(停车场余位上传接口) #### 版本号 1.0 #### API应用场景说明 当停车场剩余车位发生改变时调用 #### 字符编码 HTTP请求统一采用UTF-8字符编码 #### 请求地址 环境| HTTP请求地址 ---|--- 正式环境| http://jd0571.leway.com.cn:9090/open-platform/gateway.do #### 请求参数 **公共请求参数** 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 ---|---|---|---|---|--- id | String | 是 | 11 | http客户端自定义请求编号,原样返回 | 1 ver | String | 是 | 3 | 调用接口的版本,固定为:1.0 | 1.0 cmd | String | 是 | 255 | 接口名称 | updateParkSpaceCount mchId | String | 是 | 10 | 商户id | 12000006 onceStr | String | 是 | 32 | 随机字符串 | NBT3LZ45BL14QXFVDFNCXZ122PX05DRV timestamp | String | 是 | 14 | 发起请求的时间,格式:yyyyMMddHHmmss | 20170410185441 sign | String | 是 | 32 | 商户请求参数的签名 | 详见安全规范-签名算法 **业务参数** 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 ---|---|---|---|---|--- parkinglotno | String | 是 | 20 | 开放平台停车场编号 | 1703271547033416 totalCount | String | 是 | 11 | 总车位数 | 50 freeCount | String | 是 | 11 | 空闲车位数 | 20 #### 响应参数 **公共响应参数** 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 ---|---|---|---|---|--- errno | String | 是 | 5 | 响应状态码 | 200,此字段是查询结果标识,详见响应码字典 errtext | String | 是 | 100 | 响应状态描述 | SUCCESS id | String | 是 | 10 | http客户端请求的编号,原样返回 | 1 ver | String | 是 | 3 | 调用接口的版本,固定为:1.0 | 1.0 cmd | String | 是 | 255 | 接口名称,原样返回 | updateParkSpaceCount 以下参数在errno为200时有返回 参数 | 类型 | 是否必填 | 最大长度 | 描述 | 示例值 ---|---|---|---|---|--- onceStr | String | 是 | 32 | 随机字符串 | NBT3LZ45BL14QXFVDFNCXZ122PX05DRV mchId | String | 是 | 10 | 商户id | 12000006 sign | String | 是 | 32 | 开放平台返回的签名 | 详见示例 #### 请求示例 JAVA版本 ```java ReformerClient client = new DefaultReformerClient("http://jd0571.leway.com.cn:9090/open-platform/gateway.do", "mchId", "your api key"); UpdateParkSpaceCountRequest request = new UpdateParkSpaceCountRequest(); request.putBizParam("parkinglotno", "1703271547033416"); request.putBizParam("freeCount", "5"); request.putBizParam("totalCount", "20"); UpdateParkSpaceCountResponse response = client.execute(request); if(response.isSuccess()){ System.out.println("上传成功"); } ``` Python版本 ```python client = ReformerClient("http://jd0571.leway.com.cn:9090/open-platform/gateway.do", "mchId ", " your api key ") data={"parkinglotno":"1703271547033416","freeCount": "7","totalCount": "20"} request=UpdateParkSpaceCountRequest(data) response = client.execute(request) if response.isSuccess(): print("上传成功") ``` HTTP版本(curl工具) ```shell $ curl -H "Content-Type: application/json" -X POST --data ' {"ver":"1.0","data":{"mchId":"12000006","sign":"A4AA6053AB84504184865E1A478B1D74","onceStr":"A280H2M00L688KUJ8Y","parkinglotno":"1703301902358831","totalCount":"20","freeCount":"4","timestamp":"20170412112337"},"id":"1","cmd":"updateParkSpaceCount"} ' http://jd0571.leway.com.cn:9090/open-platform/gateway.do ``` #### 响应示例 ```json { "cmd": "updateParkSpaceCount", "data": { "mchId": 12000006, "sign": "21EE5C215463AF85FF02DAC6A026B0D5", "onceStr": "M2E9HLSH6FOUT0RKS6C085GD22A4DKNC" }, "errno": "200", "errtext": "SUCCESS", "id": "1", "ver": "1.0" } ``` > 为确保安全通信,需自行验证响应示例中的sign值是否为立方开放平台所提供。 异常示例 ```json { "cmd": "updateParkSpaceCount", "errno": "116", "errtext": "parkinglotno不存在", "id": "1", "ver": "1.0" } ``` ### 响应码 响应状态码 | 响应状态描述 | 解决方案 ---|---|--- 101 | 缺少参数 | 请对照API文档检查参数个数 102 | 无效参数 | 检查参数,格式不对、非法值、越界等 103 | 缺少参数id | 请检查是否传入id参数 104 | 缺少参数cmd | 请检查是否传入cmd参数 105 | 无效的cmd | 请检查cmd参数 106 | 缺少参数data | 请检查是否传入data参数 107 | 缺少参数sign | 请检查是否传入sign参数 108 | 缺少参数onceStr | 请检查是否传入onceStr参数 109 | onceStr长度在32位之内 | onceStr长度越界 110 | 缺少参数timestamp | 请检查是否传入timestamp参数 111 | timestamp格式错误 | 格式为yyyyMMddHHmmss,如20170411140958 112 | 缺少参数ver | 请检查是否传入ver参数 113 | 缺少参数mchId | 请检查是否传入mchId参数 114 | mchId不存在 | 请登录开放平台检查商户id是否正确 115 | 缺少参数parkinglotno | 请检查是否传入parkinglotno参数 116 | parkinglotno不存在 | 请登录开放平台检查停车场编号 120 | 请使用post方法 | 请使用POST方法调用HTTP接口 121 | post数据为空 | 请按照文档传入对应的参数 122 | 编码格式错误 | 请按照API文档使用正确的字符编码 123 | 数据格式错误 | 请按照API文档检查参数格式 124 | 总车位数小于空闲车位数 | 参数逻辑错误 131 | 权限不足 | 请确保发起请求的数据已在开放平台中审核通过 132 | 权限过期 | 请在开放平台中续约 133 | 商户未认证 | 请确保商户资料认证通过后再次发起调用 134 | 开发者key被禁用 | 请在开放平台中启用开发者key 140 | 系统错误 | 服务暂不可用,请稍后重试 200 | SUCCESS | 701 | 签名错误 | 开发者key错误或者签名方式错误,请开发者检查key是否正确,签名算法是否正确 ### 安全规范 > 1.签名算法 签名生成的通用步骤如下: 第一步,设所有发送或者接收到的数据的data部分为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA。 特别注意以下重要规则: ◆ 参数名ASCII码从小到大排序(字典序); ◆ 如果参数的值为空不参与签名; ◆ 参数名区分大小写; ◆ 验证调用返回或立方主动通知签名时,传送的sign参数不参与签名,将生成的签名与该sign值作校验。 ◆ 立方开放平台接口可能增加字段,验证签名时必须支持增加的扩展字段 第二步,在stringA最后拼接上key得到stringSignTemp字符串,并对stringSignTemp进行MD5运算,再将得到的字符串所有字符转换为大写,得到sign值signValue。 举例: 假设传送的参数如下: { "ver": "1.0", "data": { "mchId": "12000013", "onceStr": "W52005JJM00L68WWUJ284", "parkinglotno": "1703271547033416", "timestamp": "20170412153507" }, "id": "1", "cmd": "queryPark" } 第一步:获取data部分的所有键值,按照key=value的格式,并按照参数名ASCII字典序排序如下: stringA= "mchId=12000013&onceStr=W52005JJM00L68WWUJ284&parkinglotno=1703271547033416×tamp=20170412153507" 第二步:拼接API密钥: stringSignTemp=stringA+"&key= 36226475511B45E39E0351E0B6532230" sign=MD5(stringSignTemp).toUpperCase()="F6CAFAACD5ABAE0FFB85DE11FFE95A4C" 将sign对应值放入data中,最终得到最终发送的数据: { "ver": "1.0", "data": { "mchId": "12000013", "sign": "F6CAFAACD5ABAE0FFB85DE11FFE95A4C", "onceStr": "W52005JJM00L68WWUJ284", "parkinglotno": "1703271547033416", "timestamp": "20170412153507" }, "id": "1", "cmd": "queryPark" } 2.生成随机数算法 微信支付API接口协议中包含字段nonceStr,主要保证签名不可预测。我们推荐生成随机数算法如下:调用随机数函数生成,将得到的值转换为字符串。