文章摘要
充电平台与停车场系统如何实现无缝对接?本文揭秘广汽新能源充电减免接口的核心技术逻辑,从车牌识别到优惠时长自动扣减的全流程解析,以及关键签名规则的安全实现方案,助您快速掌握充电停车一体化的系统对接要点。
— 此摘要由停车技术员AI分析文章内容生成

充电-停车场系统接入文档

2019.6.3

背景说明

适用对象

本文档描述了充电业务场景下,充电平台与停车场系统对接说明,适用于停车场系统的产品与技术。

    1. 业务场景

业务场景如下图所示:

广汽新能源充电平台接口

  1. 充电司机驾车通过闸机进入充电站;
  2. 司机使用充电设备启动充电;
  3. 司机充电结束,在充电 APP 点击结束充电,确认车牌;
  4. 充电 APP 向充电平台回传充电订单完成、车牌号等信息;
  5. 充电平台向停车场系统发送充电减免信息,包括车牌号、减免时长(或金额)等信息;
  6. 司机驾车准备离开充电站;
  7. 停车场系统停车场系统识别车牌,减免充电优惠时长(或金额),根据规则进行剩余时长的收费。

注意:

  1. 停车场系统与充电平台之间的交互仅有一个充电减免接口(即上述流程中第 5

步);

  1. 停车场系统必须提供一个固定的外网可访问的域名或公网 IP 地址
  2. 如果停车系统有平台,充电平台优先与停车系统平台对接,这样便于接入停车场系统平台下的其他场站,同时便于访问停车系统平台的固定域名;
  3. 对接时,充电平台只能提供出口 IP 段,不提供单个固定 IP。

接入说明

充电停车减免接口说明

充电平台采用 HTTP POST 方式调用停车场系统,停车场系统根据以下报文格式 供对应的 HTTP 服务即可。

注意:

1. 该接口必须是一个外网可访问的接口,即该接口方必须提供一个固定的外网可访问的域名或公网 IP 地址

      1. HTTP 报文头
HTTP Headers Key HTTP Headers Value
Content-type application/jason; charset=UTF-8
User-agent Apache-HttpClient/4.5.3

说明:报文体将采用 jason 格式。

      1. HTTP 报文体
  1. 请求参数
参数 类型 描述
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;

}

整体逻辑:

  1. 将前三个参数的参数名按 ASCII 码从小到大(A~Z)排序(字典序)
  2. 按 参数名 1=参数值 1&参数名 2=参数值 2 进行拼接
  3. 最后拼接秘钥时,先将秘钥做一次 md5 加密再拼接
  4. 将拼接的字符串先进行 md5 加密,再转为大写
  5. 生成签名

特别声明: 有些内容设置了积分或者小金额收费,参与下方【限时活动】即可免费获取,目的在于增加网站互动性和站点推广,望参与!
版权声明
资源使用声明:本站资源仅供内部学习研究(含软件设计思想与原理学习),严禁用于商业及其他非法用途。学习研究后请自觉删除,请勿传播,未及时删除造成的一切后果由使用者自行承担。
建议您支持正版软件及原创作者,如需商业使用请购买正版授权。
侵权与反馈:厂商技术资源以及网友投稿等内容本站仅提供信息存储空间,不拥有所有权,不承担相关法律责任。若您认为「停车技术员」发布的内容侵犯您的合法权益,或发现云盘链接失效,请及时联系我们,我们将第一时间处理。


分享是美德,转发时请务必附带本文原始链接,感谢您的理解与支持!
评论 抢沙发

请登录后发表评论

    暂无评论内容