• 停车系统对接第三方在线支付平台(二)


    上源代码

    package com.czcb.park.controller;
    
    import com.czcb.park.bean.ChargeEventRequest;
    import com.czcb.park.bean.ChargeEventResponse;
    import com.czcb.park.bean.ComeRecord;
    import com.czcb.park.repo.ComeRecordRepository;
    import io.micrometer.core.instrument.util.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.core.env.Environment;
    import org.springframework.http.MediaType;
    import org.springframework.util.DigestUtils;
    import org.springframework.web.bind.annotation.*;
    
    import java.nio.charset.Charset;
    import java.sql.Timestamp;
    import java.time.LocalDateTime;
    import java.time.format.DateTimeFormatter;
    import java.util.*;
    
    //import org.springframework.util.DigestUtils;
    
    @RestController
    @RequestMapping(path = "/")
    public class TestController {
        public static final String SIGNKEY = "app.sign-key";
        public static final String SPARE_TIME = "app.spare-time";
        private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
    
        private final static Logger logger = LoggerFactory.getLogger(TestController.class);
        Environment environment;
        ComeRecordRepository comeRecordRepository;
    
    
        @Autowired
        public void setComeRecordRepository(ComeRecordRepository comeRecordRepository) {
            this.comeRecordRepository = comeRecordRepository;
        }
    
        @Autowired
        public void setEnvironment(Environment environment) {
            this.environment = environment;
        }
    
        /**
         * 获取车辆入场信息
         *
         * @param cph 车处于号
         * @return
         */
        @RequestMapping(path = "/get")
        public @ResponseBody
        Iterable<ComeRecord> get(@RequestParam String cph) {
            return comeRecordRepository.findByCph(cph);
        }
    
        /**
         * 车辆入场
         *
         * @param cph 车牌号
         * @return
         */
        @RequestMapping(path = "/in")
        public @ResponseBody
        ComeRecord in(@RequestParam String cph) {
            ComeRecord comeRecord = new ComeRecord();
            comeRecord.setCph(cph);
            comeRecord.setCardNo("123123");
            comeRecord.setInTime(new Timestamp(System.currentTimeMillis()));
            comeRecordRepository.save(comeRecord);
            return comeRecord;
        }
    
        /**
         * 车辆出场
         *
         * @param cph 车牌号
         * @return
         */
        @RequestMapping(path = "/out")
        public @ResponseBody
        ComeRecord out(@RequestParam String cph) {
            List<ComeRecord> comeRecords = comeRecordRepository.findByCph(cph);
            if (comeRecords.size() > 0) {
                comeRecordRepository.delete(comeRecords.get(0));
                return comeRecords.get(0);
            } else {
                return null;
            }
    
        }
    
        /**
         * 充电减免优惠
         *
         * @param chargeEventRequest
         * @return
         */
        @RequestMapping(
                path = "/chargeEvent",
                method = RequestMethod.POST,
                consumes = MediaType.APPLICATION_JSON_VALUE)
        public @ResponseBody
        ChargeEventResponse chargeEvent(@RequestBody ChargeEventRequest chargeEventRequest) {
            ChargeEventResponse response = new ChargeEventResponse();
    
            try {
                logger.info(String.format("收到充电优惠事件,merchId=【%s】,plateNo=【%s】,duration=【%s分钟】",
                        chargeEventRequest.getMerchId(),
                        chargeEventRequest.getPlateNo(),
                        chargeEventRequest.getDuration()));
    
                String sign = genSign(chargeEventRequest);
                if (!Objects.equals(chargeEventRequest.getSign(), sign)) {
                    logger.info(String.format("签名校验失败,%s but %s expected", chargeEventRequest.getSign(), sign));
                    response.setCode("20001");
                    response.setData(new HashMap());
                    response.setMsg("签名校验失败");
                    return ChargeEventResponse.buildResponse(ChargeEventResponse.RespType.ERROR_SIGN_DISMATCH);
                } else {
                    logger.info("签名校验通过");
                    String cph = chargeEventRequest.getPlateNo(); // 车牌号
                    List<ComeRecord> comeRecords = comeRecordRepository.findByCph(cph);
                    if (comeRecords.size() == 0) {
                        logger.error(String.format("未找到车辆【%s】的入场记录", cph));
                        return ChargeEventResponse.buildResponse(ChargeEventResponse.RespType.ERROR_CAR_NOT_FOUND);
                    } else if (comeRecords.size() > 1) {
                        return ChargeEventResponse.buildResponse(ChargeEventResponse.RespType.ERROR_CAR_REENTRANCE);
                    } else {
    
                        ComeRecord comeRecord = comeRecords.get(0);
                        logger.info(String.format(
                                "找到车辆【%s】的入场记录,入场时间【%s】,减免时长【%d分钟】",
                                cph,
                                comeRecord.getInTime().toLocalDateTime(),
                                chargeEventRequest.getDuration()
                        ));
    
                        // 可提供的出场时间, 从配置项读取,默认为0
                        int spareTime = 0;
                        try {
                            spareTime = Integer.parseInt(environment.getProperty(SPARE_TIME));
                        } catch (Exception e) {
    
                        }
    
                        // 多次减免以最后一次计,需要把原始入场时间或前一次减免时间记录下来,以重新计算
                        String originInTime = comeRecord.getOriginInTime();
                        // 先备份原始入场时间字段,只备份一次
                        if (Objects.isNull(originInTime) || originInTime == "") {
                            originInTime = comeRecord.getInTime().toLocalDateTime().format(formatter);
                            logger.info(String.format("备份车辆【%s】原始入场时间:%s", cph, originInTime));
                            comeRecord.setOriginInTime(originInTime);
                        }
                        int duration = chargeEventRequest.getDuration();
    
                        Timestamp inTime = Timestamp.valueOf(
                                LocalDateTime.parse(comeRecord.getOriginInTime(), formatter));
    
                        // 减免时长,当前时间加上额外出场时间,最多2小时
                        //inTime.setTime(
                        //        Math.min(inTime.getTime() + duration * 60 * 1000L,
                        //                System.currentTimeMillis() + spareTime * 60 * 1000L));
    
                        // 2019年5月30日修改:无论何种情况,入场时间增加2小时+spare_time
                        inTime.setTime(inTime.getTime() + duration * 60 * 1000L + spareTime * 60 * 1000L);
    
                        logger.info(String.format("修改车辆【%s】的入场时间为【%s】", cph, inTime.toLocalDateTime()));
                        comeRecord.setInTime(inTime);
                        comeRecord.setSfGate("滴滴收费减免");
                        comeRecordRepository.save(comeRecord);
                        logger.info(String.format("更新车辆【%s】的入场记录成功", cph));
                        return ChargeEventResponse.buildResponse(ChargeEventResponse.RespType.SUCCESS);
                    }
                }
            } catch (Exception e) {
                logger.error("服务器异常", e);
                return ChargeEventResponse.buildResponse(ChargeEventResponse.RespType.ERROR_INTERNAL_EXCEPTION, e.getMessage());
            }
        }
    
        /**
         * 充电减免优惠-生成签名测试
         *
         * @param chargeEventRequest
         * @return
         */
        @RequestMapping(
                path = "/chargeEventKey",
                method = RequestMethod.POST,
                consumes = MediaType.APPLICATION_JSON_VALUE)
        public @ResponseBody
        ChargeEventRequest chargeEventKey(@RequestBody ChargeEventRequest chargeEventRequest) {
            ChargeEventRequest request = chargeEventRequest;
            request.setSign(genSign(chargeEventRequest));
            return request;
        }
    
        /**
         * 生成签名
         *
         * @param chargeEventRequest
         * @return
         */
        public String genSign(ChargeEventRequest chargeEventRequest) {
    
            Map<String, String> paramMap = new HashMap<>();
            paramMap.put("merchId", chargeEventRequest.getMerchId());
            paramMap.put("plateNo", chargeEventRequest.getPlateNo());
            paramMap.put("duration", chargeEventRequest.getDuration() + "");
            String signKey = environment.getProperty(SIGNKEY);
            String[] keyArray = new String[paramMap.keySet().size()];
            paramMap.keySet().toArray(keyArray);
            Arrays.sort(keyArray);
            StringBuffer sb = new StringBuffer();
            for (String key : keyArray) {
                if (StringUtils.isNotBlank(key) && StringUtils.isNotBlank(paramMap.get(key))) {
                    sb.append(key).append("=").append(paramMap.get(key)).append("&");
                }
            }
            sb.append("key=").append(DigestUtils.md5DigestAsHex(signKey.getBytes(Charset.forName("utf-8"))));
            String sign = DigestUtils.md5DigestAsHex(sb.toString().getBytes(Charset.forName("utf-8"))).toUpperCase();
    //        logger.info("param : {}", sb.toString());
    //        logger.info("param: {} sign: {}", sb.toString(), sign);
            return sign;
        }
    }
  • 相关阅读:
    简单系统音乐播放与视频播放
    项目前准备1
    runtime
    多控制器
    maven的依赖冲突时的原则
    maven 依赖的传递性
    MAVN(自动创建maven项目骨架) 项目架构的生成
    MAVEN 构建包的引用
    MAVEN的结构认识篇
    LINUX 中 VSFTPD安裝
  • 原文地址:https://www.cnblogs.com/zhouein/p/10952526.html
Copyright © 2020-2023  润新知