LinkDataController.java 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185
  1. package com.zsElectric.boot.charging.controller;
  2. import com.fasterxml.jackson.databind.MapperFeature;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import com.zsElectric.boot.charging.service.ChargingReceptionService;
  6. import com.zsElectric.boot.common.annotation.ApiRateLimit;
  7. import com.zsElectric.boot.common.annotation.Log;
  8. import com.zsElectric.boot.common.constant.ConnectivityConstants;
  9. import com.zsElectric.boot.common.enums.LogModuleEnum;
  10. import com.zsElectric.boot.common.util.AESCryptoUtils;
  11. import com.zsElectric.boot.common.util.HmacMD5Util;
  12. import com.zsElectric.boot.common.util.electric.QueryTokenResponseData;
  13. import com.zsElectric.boot.common.util.electric.RequestParmsEntity;
  14. import com.zsElectric.boot.common.util.electric.ResponseParmsEntity;
  15. import com.zsElectric.boot.common.util.electric.queryToken.JwtTokenUtil;
  16. import com.zsElectric.boot.common.util.electric.queryToken.QueryTokenRequestParms;
  17. import io.swagger.v3.oas.annotations.Operation;
  18. import io.swagger.v3.oas.annotations.tags.Tag;
  19. import lombok.RequiredArgsConstructor;
  20. import lombok.extern.slf4j.Slf4j;
  21. import org.springframework.web.bind.annotation.*;
  22. @Slf4j
  23. @RestController
  24. @RequiredArgsConstructor
  25. @Tag(name = "充电业务相关接口_第三方")
  26. @RequestMapping("/charge-business/v1/linkData")
  27. public class LinkDataController {
  28. private final ChargingReceptionService chargingReceptionService;
  29. private final JwtTokenUtil jwtTokenUtil;
  30. // @ApiRateLimit(
  31. // prefix = "third_party:query_token", // Redis key前缀
  32. // limitType = ApiRateLimit.LimitType.IP, // 限流类型:IP/GLOBAL/USER
  33. // count = 200, // 时间窗口内允许的最大请求次数
  34. // time = 60, // 时间窗口大小(秒)
  35. // message = "获取Token请求过于频繁,请稍后再试" // 限流提示信息
  36. // )
  37. /**
  38. * 获取Token
  39. * Token作为全局唯一凭证,调用各接口时均需要使用,该接口作为双方获取Token的接口,双方均需要实现。
  40. * @author wzq
  41. * @param request,参数为类则包含{@link RequestParmsEntity}
  42. * @return ResponseParmsEntity{@link ResponseParmsEntity}
  43. */
  44. @Operation(summary = "获取token")
  45. @PostMapping("/query_token")
  46. @Log(value = "获取token", module = LogModuleEnum.PARKING, params = true, result = true)
  47. @ApiRateLimit(prefix = "third_party:query_token", limitType = ApiRateLimit.LimitType.IP, count = 200, time = 60, message = "获取Token请求过于频繁,请稍后再试")
  48. public ResponseParmsEntity getToken(@RequestBody RequestParmsEntity request) throws Exception {
  49. ResponseParmsEntity responseParmsEntity = new ResponseParmsEntity();
  50. try {
  51. //验证签名
  52. if (!HmacMD5Util.verify(request.getOperatorID() + request.getData() + request.getTimeStamp() + request.getSeq(),
  53. ConnectivityConstants.SIG_SECRET, request.getSig())) {
  54. responseParmsEntity.setRet(4001);
  55. responseParmsEntity.setMsg("签名验证失败");
  56. responseParmsEntity.setData("");
  57. responseParmsEntity.setSig(HmacMD5Util.genSign(responseParmsEntity.getRet(), responseParmsEntity.getMsg(), responseParmsEntity.getData(),
  58. ConnectivityConstants.SIG_SECRET));
  59. return responseParmsEntity;
  60. }
  61. String data = request.getData();
  62. String string = AESCryptoUtils.decrypt(data, ConnectivityConstants.DATA_SECRET, ConnectivityConstants.DATA_SECRET_IV);
  63. ObjectMapper objectMapper = new ObjectMapper();
  64. QueryTokenRequestParms queryTokenRequestParms = objectMapper.readValue(string, QueryTokenRequestParms.class);
  65. if (queryTokenRequestParms == null || queryTokenRequestParms.getOperatorID() == null || queryTokenRequestParms.getOperatorSecret() == null) {
  66. responseParmsEntity.setRet(4003);
  67. responseParmsEntity.setMsg("参数错误");
  68. responseParmsEntity.setData("");
  69. responseParmsEntity.setSig(HmacMD5Util.genSign(responseParmsEntity.getRet(), responseParmsEntity.getMsg(), responseParmsEntity.getData(),
  70. ConnectivityConstants.SIG_SECRET));
  71. return responseParmsEntity;
  72. }
  73. //判断运营商ID与密钥是否正确
  74. if (!queryTokenRequestParms.getOperatorID().equals(ConnectivityConstants.PLATFORM_OPERATOR_ID) && !queryTokenRequestParms.getOperatorSecret().equals(ConnectivityConstants.PLATFORM_OPERATOR_SECRET)) {
  75. responseParmsEntity .setRet(4004);
  76. responseParmsEntity.setMsg("OperatorID或OperatorSecret错误!");
  77. responseParmsEntity .setData("");
  78. responseParmsEntity.setSig(HmacMD5Util.genSign(responseParmsEntity.getRet(), responseParmsEntity.getMsg(), responseParmsEntity.getData(),
  79. ConnectivityConstants.SIG_SECRET));
  80. }
  81. //redis获取token,不存在则创建
  82. String accessToken = jwtTokenUtil.generateToken(queryTokenRequestParms.getOperatorID());
  83. Integer remainingTTL = jwtTokenUtil.getRemainingTTL(accessToken).intValue();
  84. //构建Data(token信息)
  85. QueryTokenResponseData queryTokenResponseData = new QueryTokenResponseData();
  86. queryTokenResponseData.setOperatorID(queryTokenRequestParms.getOperatorID());
  87. queryTokenResponseData.setAccessToken(accessToken);
  88. queryTokenResponseData.setTokenAvailableTime(remainingTTL);
  89. queryTokenResponseData.setSuccStat(0);
  90. queryTokenResponseData.setFailReason(0);
  91. log.info("生成token信息:{}", objectMapper.writeValueAsString(queryTokenResponseData));
  92. String encodeData = AESCryptoUtils.encrypt(objectMapper.writeValueAsString(queryTokenResponseData), ConnectivityConstants.DATA_SECRET,
  93. ConnectivityConstants.DATA_SECRET_IV);
  94. responseParmsEntity.setRet(0);
  95. responseParmsEntity.setMsg("成功");
  96. responseParmsEntity .setData(encodeData);
  97. responseParmsEntity.setSig(HmacMD5Util.genSign(responseParmsEntity.getRet(), responseParmsEntity.getMsg(), responseParmsEntity.getData(),
  98. ConnectivityConstants.SIG_SECRET));
  99. return responseParmsEntity;
  100. } catch (Exception e) {
  101. log.error("系统错误:{}", e.getMessage());
  102. responseParmsEntity .setRet(500);
  103. responseParmsEntity.setMsg("系统错误");
  104. responseParmsEntity.setData("");
  105. responseParmsEntity.setSig(HmacMD5Util.genSign(responseParmsEntity.getRet(), responseParmsEntity.getMsg(), responseParmsEntity.getData(),
  106. ConnectivityConstants.SIG_SECRET));
  107. return responseParmsEntity;
  108. }
  109. }
  110. /**
  111. * <p>2.4 推送启动充电结果</p>
  112. * @author SheepHy
  113. * @param requestDTO,参数为类则包含{@link RequestParmsEntity}
  114. * @return 推送启动充电结果VO
  115. */
  116. @Operation(summary = "推送启动充电结果")
  117. @PostMapping("/notification_start_charge_result")
  118. @Log(value = "推送启动充电结果", module = LogModuleEnum.PARKING, params = true, result = true)
  119. @ApiRateLimit(prefix = "third_party:start_charge", limitType = ApiRateLimit.LimitType.IP, count = 300, time = 60, message = "启动充电请求过于频繁,请稍后再试")
  120. public ResponseParmsEntity chargeResponse(@RequestBody RequestParmsEntity requestDTO){
  121. return chargingReceptionService.chargeResponse(requestDTO);
  122. }
  123. /**
  124. * 2.6 推送充电状态
  125. * */
  126. @Operation(summary = "推送充电状态")
  127. @PostMapping("/notification_equip_charge_status")
  128. @Log(value = "推送充电状态", module = LogModuleEnum.PARKING, params = true, result = true)
  129. @ApiRateLimit(prefix = "third_party:charge_status", limitType = ApiRateLimit.LimitType.IP, count = 500, time = 60, message = "充电状态推送过于频繁,请稍后再试")
  130. public ResponseParmsEntity chargeStatusResponse(@RequestBody RequestParmsEntity requestDTO){
  131. return chargingReceptionService.chargeStatusResponse(requestDTO);
  132. }
  133. /**
  134. * 2.8 推送停止充电结果
  135. * */
  136. @Operation(summary = "推送停止充电结果")
  137. @PostMapping("/notification_stop_charge_result")
  138. @Log(value = "推送停止充电结果", module = LogModuleEnum.PARKING, params = true, result = true)
  139. @ApiRateLimit(prefix = "third_party:stop_charge", limitType = ApiRateLimit.LimitType.IP, count = 300, time = 60, message = "停止充电请求过于频繁,请稍后再试")
  140. public ResponseParmsEntity stopChargeResponse(@RequestBody RequestParmsEntity requestDTO){
  141. return chargingReceptionService.stopChargeResponse(requestDTO);
  142. }
  143. /**
  144. * 2.9 推送充电订单信息
  145. * */
  146. @Operation(summary = "推送充电订单信息")
  147. @PostMapping("/notification_charge_order_info")
  148. @Log(value = "推送充电订单信息", module = LogModuleEnum.PARKING, params = true, result = true)
  149. @ApiRateLimit(prefix = "third_party:charge_order", limitType = ApiRateLimit.LimitType.IP, count = 200, time = 60, message = "订单信息推送过于频繁,请稍后再试")
  150. public ResponseParmsEntity chargeOrderResponse(@RequestBody RequestParmsEntity requestDTO) throws Exception {
  151. return chargingReceptionService.chargeOrderResponse(requestDTO);
  152. }
  153. /**
  154. * 3.2 设备状态变化推送
  155. * @param requestDTO
  156. * @return
  157. */
  158. @Operation(summary = "设备状态变化推送")
  159. @PostMapping("/notification_stationStatus")
  160. @Log(value = "设备状态变化推送", module = LogModuleEnum.PARKING, params = true, result = true)
  161. @ApiRateLimit(prefix = "third_party:station_status", limitType = ApiRateLimit.LimitType.IP, count = 500, time = 60, message = "设备状态推送过于频繁,请稍后再试")
  162. public ResponseParmsEntity stationStatus(@RequestBody RequestParmsEntity requestDTO){
  163. return chargingReceptionService.stationStatus(requestDTO);
  164. }
  165. }