Procházet zdrojové kódy

优化代码+二维码支付

lianshufeng před 1 rokem
rodič
revize
6020302085
19 změnil soubory, kde provedl 666 přidání a 221 odebrání
  1. 2 2
      paydemo/pom.xml
  2. 19 19
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/config/WebConfig.java
  3. 0 145
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/controller/hxz/PayV1Controller.java
  4. 54 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/controller/hxz/v1/CountsController.java
  5. 77 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/controller/hxz/v1/PayV1Controller.java
  6. 77 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/controller/hxz/v1/QRCodeController.java
  7. 45 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/controller/hxz/v1/ServerTimerController.java
  8. 21 22
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/interceptors/RequestLoggingInterceptor.java
  9. 3 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/ConsumTransactionsModel.java
  10. 61 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/ConsumTransactionsResult.java
  11. 26 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/CountsResult.java
  12. 41 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/QRCodeTransactionModel.java
  13. 2 2
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/ServerTimeModel.java
  14. 16 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/TransactionInquiryModel.java
  15. 28 28
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/util/BytesUtil.java
  16. 10 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/util/CardUtil.java
  17. 96 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/util/IPUtil.java
  18. 85 0
      paydemo/src/main/java/com/zswl/paymentterminal/demo/core/util/JsonUtil.java
  19. 3 3
      paydemo/src/main/resources/application.yml

+ 2 - 2
paydemo/pom.xml

@@ -68,8 +68,8 @@
                 <artifactId>maven-compiler-plugin</artifactId>
                 <version>3.8.1</version>
                 <configuration>
-                    <source>1.8</source>
-                    <target>1.8</target>
+                    <source>17</source>
+                    <target>17</target>
                     <!-- 设置编译源文件的编码 -->
                     <encoding>GBK</encoding>
                 </configuration>

+ 19 - 19
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/config/WebConfig.java

@@ -1,19 +1,19 @@
-//package com.zswl.paymentterminal.demo.core.config;
-//
-//import com.zswl.paymentterminal.demo.core.interceptors.RequestLoggingInterceptor;
-//import org.springframework.beans.factory.annotation.Autowired;
-//import org.springframework.context.annotation.Configuration;
-//import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
-//import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
-//
-//@Configuration
-//public class WebConfig implements WebMvcConfigurer {
-//
-//    @Autowired
-//    private RequestLoggingInterceptor requestLoggingInterceptor;
-//
-//    @Override
-//    public void addInterceptors(InterceptorRegistry registry) {
-//        registry.addInterceptor(requestLoggingInterceptor);
-//    }
-//}
+package com.zswl.paymentterminal.demo.core.config;
+
+import com.zswl.paymentterminal.demo.core.interceptors.RequestLoggingInterceptor;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+
+    @Autowired
+    private RequestLoggingInterceptor requestLoggingInterceptor;
+
+    @Override
+    public void addInterceptors(InterceptorRegistry registry) {
+        registry.addInterceptor(requestLoggingInterceptor);
+    }
+}

+ 0 - 145
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/controller/hxz/PayV1Controller.java

@@ -1,145 +0,0 @@
-package com.zswl.paymentterminal.demo.core.controller.hxz;
-
-import ch.qos.logback.core.testUtil.RandomUtil;
-import com.zswl.paymentterminal.demo.core.model.ConsumTransactionsModel;
-import com.zswl.paymentterminal.demo.core.model.OrderQuery;
-import com.zswl.paymentterminal.demo.core.model.ServerTimeModel;
-import com.zswl.paymentterminal.demo.core.util.BytesUtil;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.MediaType;
-import org.springframework.web.bind.annotation.PostMapping;
-import org.springframework.web.bind.annotation.RequestBody;
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import java.text.SimpleDateFormat;
-import java.time.DayOfWeek;
-import java.time.LocalDate;
-import java.util.Date;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Random;
-
-@Slf4j
-@RestController
-@RequestMapping("hxz/v1")
-public class PayV1Controller {
-
-
-    /**
-     * 同步时间服务
-     */
-    @PostMapping(value = "ServerTime", consumes = MediaType.APPLICATION_JSON_VALUE)
-    public Object serverTime(@RequestBody ServerTimeModel serverTimeModel) {
-        var nowTime = new Date(System.currentTimeMillis());
-        LocalDate date = LocalDate.now();
-        int week = Map.of(DayOfWeek.MONDAY, 1, DayOfWeek.TUESDAY, 2, DayOfWeek.WEDNESDAY, 3, DayOfWeek.THURSDAY, 4, DayOfWeek.FRIDAY, 5, DayOfWeek.SATURDAY, 6, DayOfWeek.SUNDAY, 0).get(date.getDayOfWeek());
-        var ret = new LinkedHashMap() {{
-            put("Status", 1);
-            put("Msg", "");
-            put("Time", new SimpleDateFormat("yyyyMMddHHmmss").format(nowTime) + "" + week);
-            put("WLUptate", 0);
-            put("WLPage", 0);
-        }};
-        log.info("ServerTime : {} - {}", serverTimeModel, ret);
-        return ret;
-    }
-
-    /**
-     * 用户刷卡综合接口
-     */
-    @PostMapping(value = "ConsumTransactions", consumes = MediaType.APPLICATION_JSON_VALUE)
-    public Object consumTransactions(@RequestBody ConsumTransactionsModel consumTransactionsModel) {
-        //十进制转16进制
-        final String cardNumber = toCardNumber(Long.parseLong(String.valueOf(consumTransactionsModel.getCardNo())));
-        final String amount = consumTransactionsModel.getAmount();
-
-        //查询卡(钱包)
-        if (consumTransactionsModel.getMode() == 2) {
-            return new LinkedHashMap() {{
-                put("Status", 1);
-                put("Msg", 1);
-                put("Name", "测试用户");
-                put("CardNo", consumTransactionsModel.getCardNo());
-                put("Money", "0"); // 现金金额
-                put("Subsidy", "0.0"); // 补贴金额
-                put("Times", "");
-                put("Integral", "");
-                put("InTime", "");
-                put("OutTime", "");
-                put("CumulativeTime", "");
-                put("Amount", amount);
-                put("VoiceID", "");
-                put("Text", "");
-            }};
-        }
-
-        //刷卡消费
-        log.info("consumTransactions : {} - {} - {}", consumTransactionsModel.getOrder(), cardNumber, amount);
-        var ret = new LinkedHashMap() {{
-            put("Status", 1);
-            put("Msg", 1);
-            put("Name", "测试用户");
-            put("CardNo", consumTransactionsModel.getCardNo());
-            put("Money", amount); // 现金金额
-            put("Subsidy", "0.0"); // 补贴金额
-            put("Times", "");
-
-            put("Integral", "");
-            put("InTime", "");
-            put("OutTime", "");
-            put("CumulativeTime", "");
-            put("Amount", amount);
-            put("VoiceID", "");
-            put("Text", "");
-        }};
-        log.info("ConsumTransactions : {} - {}", consumTransactionsModel, ret);
-        return ret;
-    }
-
-
-    /**
-     * 补偿查询
-     */
-    @PostMapping(value = "orderQuery", consumes = MediaType.APPLICATION_JSON_VALUE)
-    public Object orderQuery(@RequestBody OrderQuery orderQuery) {
-        //十进制转16进制
-        final String cardNumber = toCardNumber(Long.parseLong(String.valueOf(orderQuery.getCardNo())));
-        //刷卡消费
-        log.info("orderQuery {} - {}:", orderQuery.getOrder(), cardNumber);
-        var amount = "99.99";
-        var ret = new LinkedHashMap() {{
-            put("Status", 1);
-            put("Msg", 1);
-            put("Name", "测试用户");
-            put("CardNo", orderQuery.getCardMode());
-            put("Money", amount); // 现金金额
-            put("Subsidy", "0.0"); // 补贴金额
-            put("Times", "");
-
-            put("Integral", "");
-            put("InTime", "");
-            put("OutTime", "");
-            put("CumulativeTime", "");
-            put("Amount", amount);
-            put("VoiceID", "");
-            put("Text", "");
-        }};
-        return ret;
-    }
-
-
-    /**
-     * 转换为卡号
-     *
-     * @param cardNo
-     * @return
-     */
-    private static String toCardNumber(long cardNo) {
-        byte[] bins = BytesUtil.longToBin(cardNo, 4);
-        var ret = BytesUtil.reverse(bins);
-        return BytesUtil.binToHex(ret);
-    }
-
-
-}

+ 54 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/controller/hxz/v1/CountsController.java

@@ -0,0 +1,54 @@
+package com.zswl.paymentterminal.demo.core.controller.hxz.v1;
+
+import com.zswl.paymentterminal.demo.core.model.CountsResult;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Random;
+
+@Slf4j
+@RestController
+@RequestMapping("hxz/v1")
+public class CountsController {
+
+    //查询模板
+    private final static String TextTemplate = """
+            金额:%s (元)
+            刷卡:%s (次)
+            时间:%s 
+            """;
+
+
+    /**
+     * 查询按钮
+     */
+    @PostMapping(value = "Counts", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public Object counts(HttpServletRequest request) {
+        final var timeText = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(System.currentTimeMillis()));
+
+        //金额
+        BigDecimal bd = new BigDecimal(Double.toString(new Random().nextDouble(100, 9999)));
+        bd = bd.setScale(2, RoundingMode.HALF_UP);
+        final var amount = bd.doubleValue();
+
+        var deviceId = request.getHeader("Device-ID");
+        var ret = new CountsResult()
+                .setStatus(1)
+                .setText(String.format(TextTemplate,
+                        amount,
+                        new Random().nextInt(10, 999),
+                        timeText)
+                );
+        log.info("Counts : {} - {}", deviceId, ret);
+        return ret;
+    }
+
+}

+ 77 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/controller/hxz/v1/PayV1Controller.java

@@ -0,0 +1,77 @@
+package com.zswl.paymentterminal.demo.core.controller.hxz.v1;
+
+import com.zswl.paymentterminal.demo.core.model.ConsumTransactionsModel;
+import com.zswl.paymentterminal.demo.core.model.ConsumTransactionsResult;
+import com.zswl.paymentterminal.demo.core.model.OrderQuery;
+import com.zswl.paymentterminal.demo.core.util.BytesUtil;
+import com.zswl.paymentterminal.demo.core.util.CardUtil;
+import com.zswl.paymentterminal.demo.core.util.JsonUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+@Slf4j
+@RestController
+@RequestMapping("hxz/v1")
+public class PayV1Controller {
+
+    /**
+     * 用户刷卡综合接口
+     */
+    @PostMapping(value = "ConsumTransactions", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public Object consumTransactions(@RequestBody ConsumTransactionsModel consumTransactionsModel) {
+        //十进制转16进制
+        final String cardNumber = CardUtil.toNumber(Long.parseLong(String.valueOf(consumTransactionsModel.getCardNo())));
+        final String amount = consumTransactionsModel.getAmount();
+
+        //查询卡(钱包)
+        if (consumTransactionsModel.getMode() == 2) {
+            return new ConsumTransactionsResult()
+                    .setStatus(0)
+                    .setMsg("不支持查询钱包")
+                    .setCardNo(consumTransactionsModel.getCardNo())
+                    .setAmount(amount)
+                    ;
+        }
+
+        //刷卡消费
+        log.info("consumTransactions : {} - {} - {}", consumTransactionsModel.getOrder(), cardNumber, amount);
+
+        var ret = new ConsumTransactionsResult()
+                .setStatus(1)
+                .setCardNo(consumTransactionsModel.getCardNo())
+                .setMoney(amount)
+                .setSubsidy("0.0")
+                .setAmount(amount);
+        log.info("ConsumTransactions : {} - {}", consumTransactionsModel, JsonUtil.toJson(ret));
+        return ret;
+    }
+
+
+    /**
+     * 补偿查询
+     */
+    @PostMapping(value = "orderQuery", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public Object orderQuery(@RequestBody OrderQuery orderQuery) {
+        //十进制转16进制
+        final String cardNumber = CardUtil.toNumber(Long.parseLong(String.valueOf(orderQuery.getCardNo())));
+        //刷卡消费
+        log.info("orderQuery {} - {}:", orderQuery.getOrder(), cardNumber);
+        final var amount = "99.99";
+        var ret = new ConsumTransactionsResult()
+                .setStatus(1)
+                .setCardNo(orderQuery.getCardNo())
+                .setMoney(amount)
+                .setSubsidy("0.0")
+                .setAmount(amount);
+        return ret;
+    }
+
+
+
+
+
+}

+ 77 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/controller/hxz/v1/QRCodeController.java

@@ -0,0 +1,77 @@
+package com.zswl.paymentterminal.demo.core.controller.hxz.v1;
+
+import com.zswl.paymentterminal.demo.core.model.ConsumTransactionsResult;
+import com.zswl.paymentterminal.demo.core.model.QRCodeTransactionModel;
+import com.zswl.paymentterminal.demo.core.model.TransactionInquiryModel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Map;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+@Slf4j
+@RestController
+@RequestMapping("hxz/v1")
+public class QRCodeController {
+
+
+    //땐데뻠닸
+    private final static Map<String, QRCodeTransactionModel> _orderMap = new ConcurrentHashMap<>();
+
+    /**
+     * 눼쉔랗郭쯤땐데�쯤連마땐데
+     */
+    @PostMapping(value = "QRCodeTransaction", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public Object qrCodeTransaction(@RequestBody QRCodeTransactionModel qrCodeTransactionModel) {
+        //�냥連마땐데
+        String orderId = UUID.randomUUID().toString().replaceAll("-", "");
+        //demo,뻠닸돕코닸쟁
+        _orderMap.put(orderId, qrCodeTransactionModel);
+        log.info("QRCodeTransaction - {}", qrCodeTransactionModel);
+        return Map.of(
+                "Status", 1,
+                "Msg", "",
+                "Qrorder", orderId
+        );
+    }
+
+
+    /**
+     * 랗郭쯤連마써벎꿴璂쌈왯
+     */
+    @PostMapping(value = "TransactionInquiry", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public Object transactionInquiry(@RequestBody TransactionInquiryModel transactionInquiryModel) {
+        log.info("TransactionInquiry - {}", transactionInquiryModel);
+        QRCodeTransactionModel qrCodeTransactionModel = _orderMap.remove(transactionInquiryModel.getQROrder());
+        if (qrCodeTransactionModel == null) {
+            return new ConsumTransactionsResult()
+                    .setStatus(0)
+                    .setMsg("땐데꼇닸瞳");
+        }
+
+        //친콰連마써벎
+        var ret = new ConsumTransactionsResult()
+                .setStatus(1)
+                .setMoney(qrCodeTransactionModel.getAmount())
+                .setSubsidy("0.0")
+                .setAmount(qrCodeTransactionModel.getAmount());
+        return ret;
+    }
+
+
+    /**
+     * 눼쉔땐데뵀
+     *
+     * @param qr
+     * @return
+     */
+    private static String createOrderNumber(String qr) {
+        return "order_" + qr;
+    }
+
+}

+ 45 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/controller/hxz/v1/ServerTimerController.java

@@ -0,0 +1,45 @@
+package com.zswl.paymentterminal.demo.core.controller.hxz.v1;
+
+
+import com.zswl.paymentterminal.demo.core.model.ServerTimeModel;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.text.SimpleDateFormat;
+import java.time.DayOfWeek;
+import java.time.LocalDate;
+import java.util.Date;
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+@Slf4j
+@RestController
+@RequestMapping("hxz/v1")
+public class ServerTimerController {
+
+
+
+    /**
+     * ͬ²½Ê±¼ä·þÎñ
+     */
+    @PostMapping(value = "ServerTime", consumes = MediaType.APPLICATION_JSON_VALUE)
+    public Object serverTime(@RequestBody ServerTimeModel serverTimeModel) {
+        var nowTime = new Date(System.currentTimeMillis());
+        LocalDate date = LocalDate.now();
+        int week = Map.of(DayOfWeek.MONDAY, 1, DayOfWeek.TUESDAY, 2, DayOfWeek.WEDNESDAY, 3, DayOfWeek.THURSDAY, 4, DayOfWeek.FRIDAY, 5, DayOfWeek.SATURDAY, 6, DayOfWeek.SUNDAY, 0).get(date.getDayOfWeek());
+        var ret = new LinkedHashMap() {{
+            put("Status", 1);
+            put("Msg", "");
+            put("Time", new SimpleDateFormat("yyyyMMddHHmmss").format(nowTime) + "" + week);
+            put("WLUptate", 0);
+            put("WLPage", 0);
+        }};
+        log.info("ServerTime : {} - {}", serverTimeModel, ret);
+        return ret;
+    }
+
+}

+ 21 - 22
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/interceptors/RequestLoggingInterceptor.java

@@ -1,22 +1,21 @@
-//package com.zswl.paymentterminal.demo.core.interceptors;
-//
-//
-//import jakarta.servlet.http.HttpServletRequest;
-//import jakarta.servlet.http.HttpServletResponse;
-//import lombok.extern.slf4j.Slf4j;
-//import org.springframework.stereotype.Component;
-//import org.springframework.web.servlet.HandlerInterceptor;
-//
-//@Slf4j
-//@Component
-//public class RequestLoggingInterceptor implements HandlerInterceptor {
-//    @Override
-//    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
-////        log.info("parameterMap {}", request.getParameterMap());
-//        // 打印请求参数
-//        request.getParameterMap().forEach((key, value) -> {
-//            System.out.println("Parameter: " + key + ", Value: " + value);
-//        });
-//        return true;
-//    }
-//}
+package com.zswl.paymentterminal.demo.core.interceptors;
+
+
+import com.zswl.paymentterminal.demo.core.util.IPUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Component;
+import org.springframework.web.servlet.HandlerInterceptor;
+
+@Slf4j
+@Component
+public class RequestLoggingInterceptor implements HandlerInterceptor {
+    @Override
+    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+        var deviceID = request.getHeader("Device-ID");
+        var ip = IPUtil.getRemoteIp(request);
+        log.info("request : {} - {} - {} ", ip, deviceID, request.getRequestURI());
+        return true;
+    }
+}

+ 3 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/ConsumTransactionsModel.java

@@ -31,6 +31,9 @@ public class ConsumTransactionsModel {
     @JsonProperty("Menus")
     private Menus[] menus;
 
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
     public static class Menus {
         @JsonProperty("MenuID")
         private String menuID;

+ 61 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/ConsumTransactionsResult.java

@@ -0,0 +1,61 @@
+package com.zswl.paymentterminal.demo.core.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class ConsumTransactionsResult {
+
+    @JsonProperty("Status")
+    private Integer status = 0;
+
+    @JsonProperty("Msg")
+    private String msg = "";
+
+    @JsonProperty("Name")
+    private String name = "ÖÐÊý²âÊÔ";
+
+    @JsonProperty("CardNo")
+    private String cardNo = "";
+
+    @JsonProperty("Money")
+    private String money = "";
+
+    @JsonProperty("Subsidy")
+    private String subsidy = "";
+
+    @JsonProperty("Times")
+    private String times = "";
+
+    @JsonProperty("Integral")
+    private String integral = "";
+
+    @JsonProperty("InTime")
+    private String inTime = "";
+
+    @JsonProperty("OutTime")
+    private String outTime = "";
+
+    @JsonProperty("CumulativeTime")
+    private String cumulativeTime = "";
+
+    @JsonProperty("Amount")
+    private String amount = "";
+
+    @JsonProperty("VoiceID")
+    private String voiceID = "";
+
+    @JsonProperty("Text")
+    private String text = "";
+
+
+}
+

+ 26 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/CountsResult.java

@@ -0,0 +1,26 @@
+package com.zswl.paymentterminal.demo.core.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+public class CountsResult {
+
+    @JsonProperty("Status")
+    private Integer status = 0;
+
+    @JsonProperty("Msg")
+    private String msg = "";
+
+    @JsonProperty("Text")
+    private String text = "";
+
+}

+ 41 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/QRCodeTransactionModel.java

@@ -0,0 +1,41 @@
+package com.zswl.paymentterminal.demo.core.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class QRCodeTransactionModel {
+
+    @JsonProperty("Mode")
+    private Integer mode;
+
+    @JsonProperty("PayType")
+    private Integer payType;
+
+    @JsonProperty("Amount")
+    private String amount;
+
+    @JsonProperty("Menus")
+    private Menus[] menus;
+
+    @JsonProperty("QR")
+    private String qR;
+
+    @Data
+    @AllArgsConstructor
+    @NoArgsConstructor
+    public static class Menus {
+
+        @JsonProperty("MenuID")
+        private String menuID;
+
+        @JsonProperty("Count")
+        private String count;
+    }
+
+
+}

+ 2 - 2
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/ServerTimeModel.java

@@ -10,11 +10,11 @@ import lombok.NoArgsConstructor;
 @NoArgsConstructor
 public class ServerTimeModel {
 
-    //璁惧�涓�殑鎬荤櫧鍚嶅崟鏁�
+    //设备中的总白名单数
     @JsonProperty("WLSum")
     private Integer wLSum;
 
-    //鏈哄彿
+    //机号
     @JsonProperty("DeviceID")
     private Integer deviceID;
 }

+ 16 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/model/TransactionInquiryModel.java

@@ -0,0 +1,16 @@
+package com.zswl.paymentterminal.demo.core.model;
+
+import com.fasterxml.jackson.annotation.JsonProperty;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class TransactionInquiryModel {
+
+    @JsonProperty("QROrder")
+    private String qROrder;
+
+}

+ 28 - 28
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/util/BytesUtil.java

@@ -7,14 +7,14 @@ import java.util.ArrayList;
 import java.util.Collections;
 
 /**
- * @鍔熻兘锛氬瓧鑺傞泦宸ュ叿绫�
- * @浣滆€咃細缁冧功閿�
- * @鍒涘缓鏃ユ湡 : 2013-8-29
+ * @功能:字节集工具类
+ * @作者:练书锋
+ * @创建日期 : 2013-8-29
  */
 public class BytesUtil {
 
     /**
-     * 濉�厖绠楁硶,灏嗗瓧鑺傞泦濉�厖鍒�8鐨勬暣鏁板€�
+     * 填充算法,将字节集填充到8的整数倍
      *
      * @param bin
      * @return
@@ -26,7 +26,7 @@ public class BytesUtil {
         if (n != 0) {
             n = 8 - n;
         }
-        // 灏嗛殢鍗崇爜鏀逛负鏁版嵁瀹屾暣搴︾殑鏍¢獙
+        // 将随即码改为数据完整度的校验
         int r = 0;
         for (int i = 0; i < bin.length; i++) {
             r = (r + (bin[i] & 0xFF)) % 256;
@@ -44,7 +44,7 @@ public class BytesUtil {
     }
 
     /**
-     * 灏嗗~鍏呯畻娉曠殑鏁版嵁杩樺師
+     * 将填充算法的数据还原
      *
      * @param bin
      * @return
@@ -52,12 +52,12 @@ public class BytesUtil {
      */
     public static byte[] unFillCode(byte[] bin) throws IOException {
         ByteArrayInputStream arrayInputStream = new ByteArrayInputStream(bin);
-        int first = arrayInputStream.read();// 绗�竴浣�
-        // 鏍¢獙鐮�
-        int r = arrayInputStream.read();// 绗�簩浣�
+        int first = arrayInputStream.read();// 第一位
+        // 校验码
+        int r = arrayInputStream.read();// 第二位
         int n = (r & 248) ^ first;
         if (n < 0 || n > 14 || arrayInputStream.available() < n) {
-            return null;// 闀垮害涓嶆�纭�紝瑙e瘑澶辫触
+            return null;// 长度不正确,解密失败
         }
         byte[] result = new byte[arrayInputStream.available() - n];
         arrayInputStream.read(result);
@@ -70,7 +70,7 @@ public class BytesUtil {
     }
 
     /**
-     * 鍊掓壘瀛楄妭闆�
+     * 倒找字节集
      *
      * @param bin
      * @param queryBin
@@ -89,7 +89,7 @@ public class BytesUtil {
     }
 
     /**
-     * 浠庝竴涓�瓧鑺備腑鏌ヨ�鍑虹幇鐨勫瓧鑺�
+     * 从一个字节中查询出现的字节
      *
      * @param bin
      * @param queryBin
@@ -106,7 +106,7 @@ public class BytesUtil {
     }
 
     /**
-     * 涓や釜瀛楄妭闆嗘暟缁勬槸鍚︾浉绛�
+     * 两个字节集数组是否相等
      *
      * @param bin1
      * @param bin2
@@ -122,7 +122,7 @@ public class BytesUtil {
     }
 
     /**
-     * 鍙栧瓧鑺傞泦涓�棿
+     * 取字节集中间
      *
      * @param bin
      * @param start
@@ -139,7 +139,7 @@ public class BytesUtil {
     }
 
     /**
-     * 灏嗗瓧鑺傞泦杞�崲涓簂ong绫�
+     * 将字节集转换为long类
      *
      * @param b
      * @return
@@ -157,7 +157,7 @@ public class BytesUtil {
     }
 
     /**
-     * 灏嗗瓧鑺傞泦杞�崲涓篿nt绫诲瀷
+     * 将字节集转换为int类型
      *
      * @param b
      * @return
@@ -167,7 +167,7 @@ public class BytesUtil {
     }
 
     /**
-     * 灏嗗瓧鑺傞泦杞�崲涓簊hort绫诲瀷
+     * 将字节集转换为short类型
      *
      * @param b
      * @return
@@ -177,10 +177,10 @@ public class BytesUtil {
     }
 
     /**
-     * 灏唋ong绫昏浆瀛楄妭闆�
+     * 将long类转字节集
      *
      * @param l
-     * @param size 淇濊瘉闀垮害
+     * @param size 保证长度
      * @return
      * @throws IOException
      */
@@ -194,7 +194,7 @@ public class BytesUtil {
     }
 
     /**
-     * 灏唅nt绫昏浆瀛楄妭闆�
+     * 将int类转字节集
      *
      * @param
      * @return
@@ -206,7 +206,7 @@ public class BytesUtil {
     }
 
     /**
-     * 灏唖hort绫诲瀷杞�崲涓哄瓧鑺傞泦
+     * 将short类型转换为字节集
      *
      * @param i
      * @param size
@@ -218,7 +218,7 @@ public class BytesUtil {
     }
 
     /**
-     * 灏嗗瓧鑺傞泦杞�崲涓�16杩涘埗
+     * 将字节集转换为16进制
      *
      * @param bin
      * @return
@@ -228,10 +228,10 @@ public class BytesUtil {
     }
 
     /**
-     * 灏嗗瓧鑺傞泦杞�崲16杩涘埗
+     * 将字节集转换16进制
      *
      * @param bin
-     * @param format 鏍煎紡鍖栨樉绀�
+     * @param format 格式化显示
      * @return
      */
     public static String binToHex(byte[] bin, boolean format) {
@@ -254,7 +254,7 @@ public class BytesUtil {
     }
 
     /**
-     * 鍗佸叚杩涘埗杞�崲涓哄瓧鑺傞泦
+     * 十六进制转换为字节集
      *
      * @param
      * @return
@@ -291,7 +291,7 @@ public class BytesUtil {
 
 
     /**
-     * 鍚堝苟涓や釜瀛楄妭闆�
+     * 合并两个字节集
      *
      * @param bin1
      * @param
@@ -311,7 +311,7 @@ public class BytesUtil {
     }
 
     /**
-     * 瀵硅薄鍒板瓧鑺傞泦
+     * 对象到字节集
      *
      * @param
      * @return
@@ -329,7 +329,7 @@ public class BytesUtil {
     }
 
     /**
-     * 瀛楄妭闆嗗埌瀵硅薄
+     * 字节集到对象
      *
      * @param buffer
      * @return

+ 10 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/util/CardUtil.java

@@ -0,0 +1,10 @@
+package com.zswl.paymentterminal.demo.core.util;
+
+public class CardUtil {
+
+    public static String toNumber(long cardNo) {
+        byte[] bins = BytesUtil.longToBin(cardNo, 4);
+        var ret = BytesUtil.reverse(bins);
+        return BytesUtil.binToHex(ret);
+    }
+}

+ 96 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/util/IPUtil.java

@@ -0,0 +1,96 @@
+package com.zswl.paymentterminal.demo.core.util;
+
+import jakarta.servlet.http.HttpServletRequest;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * 取ip的工具
+ */
+public class IPUtil {
+
+
+    /**
+     * 可能出现用户真实ip的头
+     */
+    public final static String[] headNames = new String[]{
+            "X-FORWARDED-FOR",
+            "Proxy-Client-IP",
+            "WL-Proxy-Client-IP",
+            "HTTP_CLIENT_IP",
+            "HTTP_X_FORWARDED_FOR"
+    };
+
+
+    /**
+     * 获取远程ip
+     *
+     * @param request
+     * @return
+     */
+    public static String getRemoteIp(HttpServletRequest request) {
+        final Map<String,String> header = new HashMap();
+        Arrays.stream(headNames).forEach((name) -> {
+            header.put(name, request.getHeader(name));
+        });
+        return getRemoteIp(header, request.getRemoteAddr());
+    }
+
+
+    /**
+     * 获取远程ip
+     *
+     * @return
+     */
+    public static String getRemoteIp(Map<String,String> headers, String defaultRemoteAddr) {
+        for (String name : headNames) {
+            Object obj = headers.get(name);
+            if (obj == null || "".equals(String.valueOf(obj))) {
+                continue;
+            }
+
+            String ip = String.valueOf(obj);
+            int at = ip.indexOf(",");
+            if (at > -1) {
+                ip = ip.substring(0, at);
+            }
+            return ip;
+        }
+        return defaultRemoteAddr;
+    }
+
+
+    /**
+     * ip地址转换为十进制
+     *
+     * @return
+     */
+    public static long ipv4ToLong(String ip) {
+        String[] ips = ip.split("\\.");
+        long result = 0;
+        for (int i = 0; i < ips.length; i++) {
+            int power = 3 - i;
+            result += Integer.parseInt(ips[i]) * Math.pow(256, power);
+        }
+        return result;
+    }
+
+
+    /**
+     * long 转换为 ip
+     *
+     * @param i
+     * @return
+     */
+    public static String longToIpv4(long i) {
+        return ((i >> 24) & 0xFF) +
+                "." + ((i >> 16) & 0xFF) +
+                "." + ((i >> 8) & 0xFF) +
+                "." + (i & 0xFF);
+
+    }
+
+
+}

+ 85 - 0
paydemo/src/main/java/com/zswl/paymentterminal/demo/core/util/JsonUtil.java

@@ -0,0 +1,85 @@
+package com.zswl.paymentterminal.demo.core.util;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectWriter;
+import org.springframework.util.StreamUtils;
+
+import java.io.InputStream;
+
+/**
+ * json工具
+ *
+ * @作者 练书锋
+ * @联系 oneday@vip.qq.com
+ * @时间 2014年5月17日
+ */
+public class JsonUtil {
+
+    private static ObjectMapper objectMapper = new ObjectMapper();
+
+    /**
+     * 转换到json字符串
+     *
+     * @param object
+     * @return
+     * @throws Exception
+     */
+    public static String toJson(Object object, boolean format) {
+        try {
+            ObjectWriter objectWriter;
+            if (format) {
+                return objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(object);
+            } else {
+                return objectMapper.writeValueAsString(object);
+            }
+        } catch (JsonProcessingException e) {
+            e.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 转换到json字符串
+     *
+     * @param object
+     * @return
+     */
+    public static String toJson(Object object) {
+        return toJson(object, false);
+    }
+
+
+    /**
+     * 转换为对象
+     *
+     * @param json
+     * @param cls
+     * @return
+     * @throws Exception
+     */
+    public static <T> T toObject(String json, Class<T> cls) throws Exception {
+        return objectMapper.readValue(json, cls);
+    }
+
+    /**
+     * 载入文件到对象
+     *
+     * @param configName
+     * @param cls
+     * @return
+     * @throws Exception
+     */
+    public static <T> T loadToObject(String configName, Class<T> cls) throws Exception {
+        T t = null;
+        InputStream inputStream = JsonUtil.class.getClassLoader().getResourceAsStream(configName);
+        byte[] bin = StreamUtils.copyToByteArray(inputStream);
+        String json = new String(bin, "UTF-8");
+        t = toObject(json, cls);
+        inputStream.close();
+        return t;
+    }
+
+
+}

+ 3 - 3
paydemo/src/main/resources/application.yml

@@ -5,6 +5,6 @@ spring:
 server:
   port: 9090
 
-logging:
-  level:
-    org.springframework.web.servlet.DispatcherServlet: DEBUG
+#logging:
+#  level:
+#    org.springframework.web.servlet.DispatcherServlet: DEBUG