充电-停车场系统接入文档
2019.6.3
背景说明
适用对象
本文档描述了充电业务场景下,充电平台与停车场系统对接说明,适用于停车场系统的产品与技术。
业务场景如下图所示:

- 充电司机驾车通过闸机进入充电站;
- 司机使用充电设备启动充电;
- 司机充电结束,在充电 APP 点击结束充电,确认车牌;
- 充电 APP 向充电平台回传充电订单完成、车牌号等信息;
- 充电平台向停车场系统发送充电减免信息,包括车牌号、减免时长(或金额)等信息;
- 司机驾车准备离开充电站;
- 停车场系统停车场系统识别车牌,减免充电优惠时长(或金额),根据规则进行剩余时长的收费。
注意:
- 停车场系统与充电平台之间的交互仅有一个充电减免接口(即上述流程中第 5
步);
- 停车场系统必须提供一个固定的外网可访问的域名或公网 IP 地址;
- 如果停车系统有平台,充电平台优先与停车系统平台对接,这样便于接入停车场系统平台下的其他场站,同时便于访问停车系统平台的固定域名;
- 对接时,充电平台只能提供出口 IP 段,不提供单个固定 IP。
接入说明
充电停车减免接口说明
充电平台采用 HTTP POST 方式调用停车场系统,停车场系统根据以下报文格式 供对应的 HTTP 服务即可。
注意:
1. 该接口必须是一个外网可访问的接口,即该接口方必须提供一个固定的外网可访问的域名或公网 IP 地址
| HTTP Headers Key | HTTP Headers Value |
| Content-type | application/jason; charset=UTF-8 |
| User-agent | Apache-HttpClient/4.5.3 |
说明:报文体将采用 jason 格式。
- 请求参数
| 参数 | 类型 | 描述 |
| plateNo | string | 车牌号 |
| merchId | string | 停车场唯一标识(由停车场系统提供) |
| durType | int | 减免类型( 0: 金额,1: 时间) |
| duration | int | 减免时长(单位:分钟)或金额(单位:分) |
| sign | string |
签名(调用方按照签名规则生成,停车场系统通过眼前规则校
验签名是否正确;签名秘钥由充电平台颁发) |
参数示例:
{
“durType”: “1”,
“duration”: “40”, “plateNo”: ” 京 XJ1236″,
“sign”: “”,
“merchId”: “1”
}
响应参数
| 参数 | 类型 | 描述 |
| code | int |
10000:减免成功,其他 code 可自定义,例如{“code”:20033,
“msg”:”减免失败,车辆不在场内”, “data”: null} |
| msg | string | code 对应的描述 |
| data | int | 其他响应数据,留作扩展,没有使用时填 null |
参数示例:
{
“code”: 20002,
“msg”: “车辆不在场内”,
“data”: {}
}
签名规则
请求参数中 sign 值由签名规则 genSign(签名规则逻辑可查看以下代码样例)生成, signKey 由充电平台颁发。
以下是代码样例:
public void test(String plateNo, String merchId, String duration) {
// 先将获取的三个参数放入一个 map 集合
Map<String, String> paramMap = Maps.newHashMap(); paramMap.put(“plateNo”, plateNo); paramMap.put(“merchId”, merchId); paramMap.put(“duration”, duration);
// 调用 genSign 方法,将组装好的 map 集合和签名秘钥作为参数传入
genSign(paramMap, signKey);
}
public static String genSign(final Map<String, String> paramMap, String signKey) {
// 创建一个长度和 map.size()大小一致的字符串数组String[] keyArray = new String[paramMap.keySet().size()];
// 将 map 的 key 的 set 集合转化为数组
paramMap.keySet().toArray(keyArray);
// 将数组元素按字典序进行排序
Arrays.sort(keyArray);
StringBuffer sb = new StringBuffer();
// 遍历 key 数组
for (String key : keyArray) {
// 将键与值按照 key=value&进行拼接
if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(paramMap.get(key))) { sb.append(key).append(“=”).append(paramMap.get(key)).append(“&”);
}
}
// 拼接秘钥时先将秘钥做一次 md5 加密然后拼接sb.append(“key=”).append(DigestUtils.md5Hex(signKey)); logger.info(“param : {}”, sb.toString());
// 将拼接的字符串先进行 md5 加密,再转为大写
String sign = DigestUtils.md5Hex(sb.toString()).toUpperCase(); logger.info(“param: {} sign: {}”, sb.toString(), sign);
return sign;
}
整体逻辑:
- 将前三个参数的参数名按 ASCII 码从小到大(A~Z)排序(字典序)
- 按 参数名 1=参数值 1&参数名 2=参数值 2 进行拼接
- 最后拼接秘钥时,先将秘钥做一次 md5 加密再拼接
- 将拼接的字符串先进行 md5 加密,再转为大写
- 生成签名










暂无评论内容