jc 1 mese fa
parent
commit
f39010ee8b

+ 5 - 0
pom.xml

@@ -38,6 +38,11 @@
             <groupId>org.springframework.boot</groupId>
             <artifactId>spring-boot-starter-validation</artifactId>
         </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.8.16</version>
+        </dependency>
     </dependencies>
     <dependencyManagement>
         <dependencies>

+ 64 - 0
src/main/java/com/zt/Main.java

@@ -0,0 +1,64 @@
+package com.zt;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.http.HttpRequest;
+import cn.hutool.http.HttpResponse;
+import cn.hutool.http.HttpUtil;
+import cn.hutool.json.JSONUtil;
+import com.zt.common.pojo.CeShi;
+import com.zt.common.utils.SingUtil;
+
+import java.util.Date;
+
+/**
+ * @Date 2025/3/31 15:33
+ * @Author neko
+ **/
+public class Main {
+    private static final String APP_ID = "your_app_id";
+    private static final String BASE_URL = "http://localhost:8088/api";
+    public static void main(String[] args) {
+        String reqId = "unique_req_id";
+        String reqTime = "1";
+        String goodsId = "12345";
+        Integer amount = 2;
+        Double price = 99.9;
+        String mobile = "13800000000";
+        String nowDate = DateUtil.format(new Date(), "yyyy-MM-dd");
+
+        String sign = SingUtil.generateSign(APP_ID, goodsId, reqId, reqTime);
+
+        // 调用接口一
+        CeShi params = new CeShi();
+        params.setAppId(APP_ID);
+        params.setSign(sign);
+        params.setReqTime(reqTime);
+        params.setGoodsId(goodsId);
+        params.setAmount(amount);
+        params.setPrice(price);
+        params.setMobile(mobile);
+        params.setNowDate(nowDate);
+
+        String jsonParams = JSONUtil.toJsonStr(params);
+        HttpResponse response1 = HttpRequest.post(BASE_URL + "/interface1")
+                .header("reqId", reqId)
+                .body(jsonParams)
+                .execute();
+        System.out.println("接口一响应:" + response1.body());
+
+        // 调用接口二
+        String url = BASE_URL + "/interface2?" +
+                "appId=" + APP_ID +
+                "&sign=" + sign +
+                "&reqTime=" + reqTime +
+                "&goodsId=" + goodsId +
+                "&amount=" + amount +
+                "&price=" + price +
+                "&mobile=" + mobile +
+                "&nowDate=" + nowDate;
+        HttpResponse response2 = HttpUtil.createGet(url)
+                .header("reqId", reqId)
+                .execute();
+        System.out.println("接口二响应:" + response2.body());
+    }
+}

+ 38 - 0
src/main/java/com/zt/common/pojo/CeShi.java

@@ -0,0 +1,38 @@
+package com.zt.common.pojo;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import jakarta.validation.constraints.*;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+/**
+ * @Date 2025/3/31 15:25
+ * @Author neko
+ **/
+@Data
+public class CeShi {
+    @NotBlank(message = "appId 不能为空")
+    private String appId;
+    @NotBlank(message = "sign 不能为空")
+    private String sign;
+    @NotBlank(message = "reqTime 不能为空")
+    private String reqTime;
+    @NotBlank(message = "goodsId 不能为空")
+    private String goodsId;
+    @NotNull(message = "amount 不能为空")
+    @Min(value = 1, message = "商品数量大于0")
+    private Integer amount;
+    @NotNull(message = "price 不能为空")
+    @DecimalMin(value = "0", message = "价格大于0")
+    @DecimalMax(value = "9999", message = "价格小于9999")
+    private Double price;
+    @NotBlank(message = "mobile 不能为空")
+    @Pattern(regexp = "^1[3-9]\\d{9}$", message = "手机号格式不正确")
+    private String mobile;
+    @NotBlank(message = "nowDate 不能为空")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone ="GMT+8")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private String nowDate;
+}

+ 1 - 3
src/main/java/com/zt/common/Shoop.java → src/main/java/com/zt/common/pojo/Shoop.java

@@ -1,4 +1,4 @@
-package com.zt.common;
+package com.zt.common.pojo;
 
 import com.fasterxml.jackson.annotation.JsonFormat;
 import jakarta.validation.constraints.*;
@@ -15,8 +15,6 @@ import java.util.Date;
 public class Shoop {
     @NotBlank(message = "appId不能为空")
     private String appId;
-    @NotBlank(message = "请求id不能为空")
-    private String reqId;
     @NotBlank(message = "签名不能为空")
     private String sign;
     @NotNull(message = "时间不能为空")

+ 32 - 0
src/main/java/com/zt/common/utils/Constant.java

@@ -0,0 +1,32 @@
+package com.zt.common.utils;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @ClassName: Constant
+ * @Author: neko
+ * @Date: 2024年2月26日 14:05
+ */
+public class Constant {
+
+
+    public static String TOKEN_NAME = "Authorization";
+
+    /**
+     * 请求响应码常量
+     */
+    public static final Integer RESPONSE_CODE_SUCCESS = 200;
+    public static final Integer RESPONSE_CODE_ERROR = 400;
+    public static final Integer RESPONSE_CODE_NO_LOGIN = 402;
+    public static final Integer RESPONSE_CODE_FORBIDDEN = 403;
+
+    public static final Map<Integer, String> RESPONSE_CODE_MAP = new HashMap<>();
+    static {
+        RESPONSE_CODE_MAP.put(RESPONSE_CODE_SUCCESS, "请求成功");
+        RESPONSE_CODE_MAP.put(RESPONSE_CODE_ERROR, "请求失败");
+        RESPONSE_CODE_MAP.put(RESPONSE_CODE_NO_LOGIN, "没有登录");
+        RESPONSE_CODE_MAP.put(RESPONSE_CODE_FORBIDDEN, "权限不足");
+    }
+
+}

+ 54 - 0
src/main/java/com/zt/common/utils/Result.java

@@ -0,0 +1,54 @@
+package com.zt.common.utils;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * @ClassName: Result 返回结果
+ *  code 响应码 代表请求成功/失败
+ *  message 响应信息
+ *  data 响应数据
+ * @Author: neko
+ * @Date: 2024年2月26日 13:58
+ */
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class Result {
+    private Integer code;//状态码
+    private String message;//提示信息
+    private Object data;//数据
+
+    //成功响应
+    public static Result OK() {
+        return new Result(Constant.RESPONSE_CODE_SUCCESS, "操作成功", null);
+    }
+
+    public static Result OK(Object data) {
+        return new Result(Constant.RESPONSE_CODE_SUCCESS, "操作成功", data);
+    }
+
+    //失败响应
+    public static Result ERROR() {
+        return new Result(Constant.RESPONSE_CODE_ERROR, "操作失败", null);
+    }
+
+    public static Result ERROR(Object data) {
+        return new Result(Constant.RESPONSE_CODE_ERROR, "操作失败", data);
+    }
+
+    public static Result ERROR(String message) {
+        return new Result(Constant.RESPONSE_CODE_ERROR, message, null);
+    }
+
+    //未登录响应
+    public static Result NO_LOGIN(){
+        return new Result(Constant.RESPONSE_CODE_NO_LOGIN, "未登录", null);
+    }
+
+    //权限不足响应
+    public static Result FORBIDDEN(){
+        return new Result(Constant.RESPONSE_CODE_FORBIDDEN, "权限不足,禁止访问", null);
+    }
+}

+ 24 - 0
src/main/java/com/zt/common/utils/SingUtil.java

@@ -0,0 +1,24 @@
+package com.zt.common.utils;
+
+import cn.hutool.crypto.digest.DigestUtil;
+
+import java.util.Date;
+
+/**
+ * @Date 2025/3/31 15:27
+ * @Author neko
+ **/
+
+public class SingUtil {
+    private static final String APP_KEY = "your_app_key";
+
+    public static String generateSign(String appId, String goodsId, String reqId, String reqTime) {
+        String content = appId + goodsId + reqId + reqTime + APP_KEY;
+        return DigestUtil.md5Hex(content);
+    }
+
+    public static boolean verifySign(String appId, String goodsId, String reqId, String reqTime, String sign) {
+        String generatedSign = generateSign(appId, goodsId, reqId, reqTime);
+        return generatedSign.equals(sign);
+    }
+}

+ 50 - 0
src/main/java/com/zt/controller/ApiController.java

@@ -0,0 +1,50 @@
+package com.zt.controller;
+
+import com.zt.common.pojo.CeShi;
+import jakarta.validation.Valid;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import com.zt.common.utils.SingUtil;
+
+/**
+ * @Date 2025/3/31 15:27
+ * @Author neko
+ **/
+@RestController
+@RequestMapping("/api")
+public class ApiController {
+    @PostMapping("/interface1")
+    public ResponseEntity<String> interface1(@RequestHeader("reqId") String reqId, @Valid @RequestBody CeShi params) {
+        if (!SingUtil.verifySign(params.getAppId(), params.getGoodsId(), reqId, params.getReqTime(), params.getSign())) {
+            return new ResponseEntity<>("签名验证失败", HttpStatus.BAD_REQUEST);
+        }
+        return new ResponseEntity<>("接口一处理成功", HttpStatus.OK);
+    }
+
+    @GetMapping("/interface2")
+    public ResponseEntity<String> interface2(@RequestHeader("reqId") String reqId,
+                                             @RequestParam("appId") String appId,
+                                             @RequestParam("sign") String sign,
+                                             @RequestParam("reqTime") String reqTime,
+                                             @RequestParam("goodsId") String goodsId,
+                                             @RequestParam("amount") Integer amount,
+                                             @RequestParam("price") Double price,
+                                             @RequestParam("mobile") String mobile,
+                                             @RequestParam("nowDate") String nowDate) {
+        CeShi params = new CeShi();
+        params.setAppId(appId);
+        params.setSign(sign);
+        params.setReqTime(reqTime);
+        params.setGoodsId(goodsId);
+        params.setAmount(amount);
+        params.setPrice(price);
+        params.setMobile(mobile);
+        params.setNowDate(nowDate);
+
+        if (!SingUtil.verifySign(appId, goodsId, reqId, reqTime, sign)) {
+            return new ResponseEntity<>("签名验证失败", HttpStatus.BAD_REQUEST);
+        }
+        return new ResponseEntity<>("接口二处理成功", HttpStatus.OK);
+    }
+}

+ 13 - 6
src/main/java/com/zt/controller/Test1.java

@@ -1,13 +1,15 @@
 package com.zt.controller;
 
-import com.zt.common.Shoop;
+import com.zt.common.pojo.Shoop;
+import com.zt.common.utils.Result;
 import jakarta.validation.Valid;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.util.DigestUtils;
 import org.springframework.web.bind.annotation.*;
 
+import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.Map;
-import java.util.Objects;
 
 /**
  * @Date 2025/3/29 10:37
@@ -18,24 +20,29 @@ import java.util.Objects;
 @Slf4j
 public class Test1 {
     @RequestMapping("inter")
-    public String inter(@RequestHeader("redId") String redId, @Valid @RequestBody Shoop shoop){
+    public Result inter(@RequestHeader("redId") String redId, @Valid @RequestBody Shoop shoop){
         System.out.println(redId);
+        String md5pwd = DigestUtils.md5DigestAsHex((shoop.getAppId()+shoop.getGoodsId()+redId+shoop.getReqTime()).getBytes(StandardCharsets.UTF_8));
+        System.out.println(md5pwd);
         Map<String, Object> map = new HashMap<>();
         map.put("code", "200");
         map.put("msg", "操作成功");
         map.put("data", shoop);
 
-        return map.toString();
+//        return map.toString()+redId;
+        return new Result(200,"操作成功",map);
     }
 
     @RequestMapping("inter2")
-    public String inter2(@RequestHeader("redId") String redId,Shoop shoop){
+    public Result inter2(@RequestHeader("redId") String redId,@Valid Shoop shoop){
         log.info("redId:{}",redId);
         Map<String, Object> map = new HashMap<>();
         map.put("code", "200");
         map.put("msg", "操作成功");
         map.put("data", shoop);
-        return map.toString();
+//        return map.toString();
+        return new Result(200,"操作成功",map);
     }
 
+
 }

+ 47 - 0
src/main/java/com/zt/controller/Text2.java

@@ -0,0 +1,47 @@
+package com.zt.controller;
+
+import cn.hutool.json.JSONUtil;
+import com.zt.common.pojo.Shoop;
+import com.zt.common.utils.Result;
+import org.springframework.util.DigestUtils;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.net.http.HttpRequest;
+import java.net.http.HttpResponse;
+import java.nio.charset.StandardCharsets;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
+import java.time.format.DateTimeFormatter;
+import java.util.Date;
+import java.util.logging.SimpleFormatter;
+
+/**
+ * @Date 2025/3/31 9:44
+ * @Author neko
+ **/
+public class Text2 {
+    private static final String BASE_URL = "http://localhost:8088/api";
+    public static void main(String[] args) throws ParseException {
+        String appId = "1";
+        String reqId = "123";
+        Integer reqTime = 1;
+        Integer goodsId = 1;
+        String sign = DigestUtils.md5DigestAsHex((appId+goodsId+reqId+reqTime).getBytes(StandardCharsets.UTF_8));
+        Shoop shoop = new Shoop();
+        shoop.setAppId(appId);
+        shoop.setSign(sign);
+        shoop.setGoodsId(Long.valueOf(goodsId));
+        shoop.setReqTime(Long.valueOf(reqTime));
+        shoop.setAmount(1L);
+        shoop.setPrice(1.0);
+        shoop.setMobile("18803602213");
+        String dateString = "2025-03-31 12:12:12";
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date date = dateFormat.parse(dateString);
+        shoop.setNewDate(date);
+        System.out.println(Result.OK(shoop));
+
+    }
+}