liyuan 4 days ago
commit
a8a3b5c847

+ 38 - 0
.gitignore

@@ -0,0 +1,38 @@
+target/
+!.mvn/wrapper/maven-wrapper.jar
+!**/src/main/**/target/
+!**/src/test/**/target/
+
+### IntelliJ IDEA ###
+.idea/modules.xml
+.idea/jarRepositories.xml
+.idea/compiler.xml
+.idea/libraries/
+*.iws
+*.iml
+*.ipr
+
+### Eclipse ###
+.apt_generated
+.classpath
+.factorypath
+.project
+.settings
+.springBeans
+.sts4-cache
+
+### NetBeans ###
+/nbproject/private/
+/nbbuild/
+/dist/
+/nbdist/
+/.nb-gradle/
+build/
+!**/src/main/**/build/
+!**/src/test/**/build/
+
+### VS Code ###
+.vscode/
+
+### Mac OS ###
+.DS_Store

+ 111 - 0
pom.xml

@@ -0,0 +1,111 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.ueiibi.shop</groupId>
+    <artifactId>shop-sdk</artifactId>
+    <version>1.0.0-release</version>
+    <packaging>jar</packaging>
+
+    <name>ueiibi Shop SDK</name>
+    <description>Java SDK for interacting with ueiibi Shop APIs.</description>
+    <url>https://github.com/ibiteam/shop-sdk</url>
+
+    <licenses>
+        <license>
+            <name>MIT License</name>
+            <url>https://opensource.org/licenses/MIT</url>
+        </license>
+    </licenses>
+
+    <scm>
+        <url>https://github.com/ibiteam/shop-sdk</url>
+        <connection>scm:git:git://github.com/ibiteam/shop-sdk.git</connection>
+        <developerConnection>scm:git:ssh://git@github.com/ibiteam/shop-sdk.git</developerConnection>
+    </scm>
+
+    <developers>
+        <developer>
+            <id>ueiibi</id>
+            <name>北京国联视讯信息技术股份有限公司</name>
+            <email>opensource-dd@ueiibi.com</email>
+        </developer>
+    </developers>
+
+    <properties>
+        <maven.compiler.source>17</maven.compiler.source>
+        <maven.compiler.target>17</maven.compiler.target>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <!-- Apache HttpClient Fluent API -->
+        <dependency>
+            <groupId>org.apache.httpcomponents.client5</groupId>
+            <artifactId>httpclient5-fluent</artifactId>
+            <version>5.2.1</version>
+        </dependency>
+
+        <!-- Jackson Databind (JSON 解析) -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.15.3</version>
+        </dependency>
+
+        <!-- Apache Commons Codec (可选,用于签名等功能) -->
+        <dependency>
+            <groupId>commons-codec</groupId>
+            <artifactId>commons-codec</artifactId>
+            <version>1.15</version>
+        </dependency>
+        <!-- 单元测试依赖 -->
+        <dependency>
+            <groupId>org.junit.jupiter</groupId>
+            <artifactId>junit-jupiter</artifactId>
+            <version>5.9.3</version>
+            <scope>test</scope>
+        </dependency>
+        <dependency>
+            <artifactId>fastjson2-extension</artifactId>
+            <groupId>com.alibaba.fastjson2</groupId>
+            <version>2.0.53</version>
+        </dependency>
+        <dependency>
+            <groupId>org.slf4j</groupId>
+            <artifactId>slf4j-simple</artifactId> <!-- 或 logback-classic -->
+            <version>1.7.36</version>
+        </dependency>
+
+    </dependencies>
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <version>3.11.0</version>
+                <configuration>
+                    <source>${maven.compiler.source}</source>
+                    <target>${maven.compiler.target}</target>
+                    <encoding>${project.build.sourceEncoding}</encoding>
+                </configuration>
+            </plugin>
+            <!-- 配置 Maven Surefire 插件来运行单元测试 -->
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <version>3.0.0-M5</version>
+                <configuration>
+                    <includes>
+                        <include>**/*Test.java</include>
+                    </includes>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 78 - 0
src/main/java/com/ueiibi/shop/ApiClient.java

@@ -0,0 +1,78 @@
+package com.ueiibi.shop;
+
+import com.ueiibi.shop.model.*;
+import com.ueiibi.shop.util.*;
+
+import java.util.Map;
+
+public class ApiClient {
+    private final Integer appId;
+    private final String privateKey;
+    private String baseUrl;
+
+    public static void main(String[] args) {
+        Integer appId = 520980060;
+        String privateKey = "-----BEGIN PRIVATE KEY-----\n" +
+                "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCuUoNrJeK5mBjR\n" +
+                "/PVa212qis8v3t7D2UebdPsz1fSKZqg+418REr9wsBBRQPcU3CQglyM44YV8aGYt\n" +
+                "Aqz43jMw92Ofsv+V7ylbh+Sg4EFdCw+nEwm6aXYMYvNpHLgsYCfQluDTAnSRuuJK\n" +
+                "/z+DZL/J7TKUYb4gM+gy2ak2nFXsmXiSObM/HiPtnj3IQtdlCEK/kJ+BmdQDj4BH\n" +
+                "/JFjnYt50aXtupGza2jHs84BoJMFHu6Eq399BasXYroabsMUHQ1ln18LuJxm1mqh\n" +
+                "lKA/B5XnWMJ3NykG3qq6qxWwKJX7fTFLNDMD8lqjhnywb+2QHFp8UUfxLkbVEuEW\n" +
+                "JhcNJE/vAgMBAAECggEABCikyPwc5heaU/wocFP2bpikK7yx7NM0saE/UvPCQ0EC\n" +
+                "t4leHb6oQYx5vy6BFobP99UTOoqq0BZ/hYhgTwmiCAOG5Wr0TQPpJS1fR3VCKfGX\n" +
+                "HIHIRCG69r2vl+ze+fQLTx8iWvZeiJGAT5C6V6yiJLObds3EJumGGxx1PH/LTvsq\n" +
+                "Ng4liVuun4+GpF/vtltyip164Iy2xf7X7MhHV8uEL1gTVSuJURICi4ke0v1x6zrD\n" +
+                "I3idOt4OQTTG29WDcIGdMJMOtwVAX9KND2DPhAhQvd1aRjYyqdHEXAm8GohsCrdm\n" +
+                "39M00ZenNVUE32SJrN6BeoniNYFPMct4f//ygC2RMQKBgQDm9izoIxDpSW/1jnSn\n" +
+                "nNrA2fMu+SmCQ42Uc3q6K3O9BYo1mQ3w50DHPAWnSbWJnmdh7HGIXHxMv+37Fpz6\n" +
+                "pZ/N6nLx3yCJlyBaVZ8n9OL0IAaVSJfvfmOK0qcQEP6QC87iJJ4XJUOA2/Cy7FX3\n" +
+                "667e/cVdkBW22F0Q1zCjjXq4nwKBgQDBOHC9HAQQHL9Rfjvf/qzo9T+J6DV8SXGu\n" +
+                "+1xoHOynlwe3g+7xa21qhewl4bVYs85+ZLC46SW3NPwQC7Meooxcg2bVIh7YQ5Dq\n" +
+                "PWhY9cPmw3Uxbb8XeS7gaLI2iORXdCbio5XCAx5jEvKsorbOhlpEt7ZyN0IzS8Rr\n" +
+                "Y87PQHMWsQKBgEs4Iaf4w6k2oZ/3pUZxb00frnO98ibamWGfuninbipBg6GxFzk+\n" +
+                "F3rLsYuqFdWcIU9jEha3CER2varo0ndPOZx2nrjnUlF9Rqwk9pCs0L1xMLOt0M3O\n" +
+                "+9xafs5cuotvTRGZm2MuX62388xR7C2yNGGrhHvUUT4beTPi4ZRin3VBAoGAM9AU\n" +
+                "u0FV/ZQX4Zx+JdS/PUD2pt5z6T4wlAGnh+upsk8XrKheXLK4BoafCpF59a1RxCbw\n" +
+                "FMXAbV5x8UOR5rcj+HLsEl8x8kA8DfQllSViQPFM7dJGGd9PKLIqh+ExihoFi2Te\n" +
+                "dcYsUdj05kJDzyHL9v1kmUAkKmk45KtA++aGdiECgYEA5P8m6WC5F/n1EC2Bbqjw\n" +
+                "3BWisqi2nU/IFQoctOwquKbQFAIiGakiBhUzn20d1lPBpzFH1JsTcAHXeAbQFBy9\n" +
+                "vdA+cN0y2S8J61kj/E/dRKiz/H07h7IyBBw2nUZr2r2Pwi0ca8haDdBbOi2/1+29\n" +
+                "auhwh4hJYO4RlbWFPMU8qeI=\n" +
+                "-----END PRIVATE KEY-----\n";
+        String baseUrl = "https://test-tooduduapi.ptdplat.com/api/user";
+        ApiClient apiClient = new ApiClient(baseUrl,appId,privateKey);
+        OrderRequest orderRequest = new OrderRequest();
+        orderRequest.goods_id = 7497;
+        orderRequest.order_number = 10;
+        try {
+            Response response = apiClient.addOrder(orderRequest);
+            System.out.println(response);
+            if (response.code == 200) {
+                Map<String, Object> data = (Map<String, Object>) response.data;
+                System.out.println(data.get("order_sn"));
+            }else {
+                System.out.println("请求出错了:"+response.message);
+            }
+
+        } catch (Exception e) {
+            System.out.println(e.getMessage());
+            throw new RuntimeException(e);
+        }
+    }
+
+    public ApiClient(String baseUrl,Integer appId, String privateKey) {
+        this.baseUrl = baseUrl;
+        this.appId = appId;
+        this.privateKey = privateKey;
+    }
+
+    public void setBaseUrl(String url) {
+        this.baseUrl = url;
+    }
+
+    public Response addOrder(OrderRequest order) throws Exception {
+        String url = baseUrl + "/order/done";
+        return HttpUtil.post(url, order, appId, privateKey, Response.class);
+    }
+}

+ 51 - 0
src/main/java/com/ueiibi/shop/enums/FinalMap.java

@@ -0,0 +1,51 @@
+package com.ueiibi.shop.enums;
+
+/**
+ * @author Rain
+ */
+public class FinalMap {
+
+    /**
+     * 商品id
+     */
+    public static final Integer GOODS_ID = 7497;
+
+    /**
+     * 请求地址
+     */
+    public static final String BASE_URL = "https://test-tooduduapi.ptdplat.com/api/user";
+
+    /**
+     * 私钥
+     */
+    public static final String PRIVATE_KEY = "-----BEGIN PRIVATE KEY-----\n" +
+            "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCuUoNrJeK5mBjR\n" +
+            "/PVa212qis8v3t7D2UebdPsz1fSKZqg+418REr9wsBBRQPcU3CQglyM44YV8aGYt\n" +
+            "Aqz43jMw92Ofsv+V7ylbh+Sg4EFdCw+nEwm6aXYMYvNpHLgsYCfQluDTAnSRuuJK\n" +
+            "/z+DZL/J7TKUYb4gM+gy2ak2nFXsmXiSObM/HiPtnj3IQtdlCEK/kJ+BmdQDj4BH\n" +
+            "/JFjnYt50aXtupGza2jHs84BoJMFHu6Eq399BasXYroabsMUHQ1ln18LuJxm1mqh\n" +
+            "lKA/B5XnWMJ3NykG3qq6qxWwKJX7fTFLNDMD8lqjhnywb+2QHFp8UUfxLkbVEuEW\n" +
+            "JhcNJE/vAgMBAAECggEABCikyPwc5heaU/wocFP2bpikK7yx7NM0saE/UvPCQ0EC\n" +
+            "t4leHb6oQYx5vy6BFobP99UTOoqq0BZ/hYhgTwmiCAOG5Wr0TQPpJS1fR3VCKfGX\n" +
+            "HIHIRCG69r2vl+ze+fQLTx8iWvZeiJGAT5C6V6yiJLObds3EJumGGxx1PH/LTvsq\n" +
+            "Ng4liVuun4+GpF/vtltyip164Iy2xf7X7MhHV8uEL1gTVSuJURICi4ke0v1x6zrD\n" +
+            "I3idOt4OQTTG29WDcIGdMJMOtwVAX9KND2DPhAhQvd1aRjYyqdHEXAm8GohsCrdm\n" +
+            "39M00ZenNVUE32SJrN6BeoniNYFPMct4f//ygC2RMQKBgQDm9izoIxDpSW/1jnSn\n" +
+            "nNrA2fMu+SmCQ42Uc3q6K3O9BYo1mQ3w50DHPAWnSbWJnmdh7HGIXHxMv+37Fpz6\n" +
+            "pZ/N6nLx3yCJlyBaVZ8n9OL0IAaVSJfvfmOK0qcQEP6QC87iJJ4XJUOA2/Cy7FX3\n" +
+            "667e/cVdkBW22F0Q1zCjjXq4nwKBgQDBOHC9HAQQHL9Rfjvf/qzo9T+J6DV8SXGu\n" +
+            "+1xoHOynlwe3g+7xa21qhewl4bVYs85+ZLC46SW3NPwQC7Meooxcg2bVIh7YQ5Dq\n" +
+            "PWhY9cPmw3Uxbb8XeS7gaLI2iORXdCbio5XCAx5jEvKsorbOhlpEt7ZyN0IzS8Rr\n" +
+            "Y87PQHMWsQKBgEs4Iaf4w6k2oZ/3pUZxb00frnO98ibamWGfuninbipBg6GxFzk+\n" +
+            "F3rLsYuqFdWcIU9jEha3CER2varo0ndPOZx2nrjnUlF9Rqwk9pCs0L1xMLOt0M3O\n" +
+            "+9xafs5cuotvTRGZm2MuX62388xR7C2yNGGrhHvUUT4beTPi4ZRin3VBAoGAM9AU\n" +
+            "u0FV/ZQX4Zx+JdS/PUD2pt5z6T4wlAGnh+upsk8XrKheXLK4BoafCpF59a1RxCbw\n" +
+            "FMXAbV5x8UOR5rcj+HLsEl8x8kA8DfQllSViQPFM7dJGGd9PKLIqh+ExihoFi2Te\n" +
+            "dcYsUdj05kJDzyHL9v1kmUAkKmk45KtA++aGdiECgYEA5P8m6WC5F/n1EC2Bbqjw\n" +
+            "3BWisqi2nU/IFQoctOwquKbQFAIiGakiBhUzn20d1lPBpzFH1JsTcAHXeAbQFBy9\n" +
+            "vdA+cN0y2S8J61kj/E/dRKiz/H07h7IyBBw2nUZr2r2Pwi0ca8haDdBbOi2/1+29\n" +
+            "auhwh4hJYO4RlbWFPMU8qeI=\n" +
+            "-----END PRIVATE KEY-----\n";
+
+
+}

+ 11 - 0
src/main/java/com/ueiibi/shop/model/OrderRequest.java

@@ -0,0 +1,11 @@
+package com.ueiibi.shop.model;
+
+/**
+ * @author Rain
+ */
+public class OrderRequest {
+
+
+    public Integer goods_id;
+    public Integer order_number;
+}

+ 18 - 0
src/main/java/com/ueiibi/shop/model/OrderResult.java

@@ -0,0 +1,18 @@
+package com.ueiibi.shop.model;
+
+import com.alibaba.fastjson2.JSONObject;
+
+/**
+ * @author Rain
+ */
+public class OrderResult {
+
+    public Integer code;
+
+    public String message;
+
+    public JSONObject data;
+
+
+
+}

+ 16 - 0
src/main/java/com/ueiibi/shop/model/Response.java

@@ -0,0 +1,16 @@
+package com.ueiibi.shop.model;
+
+public class Response {
+    public int code;
+    public String message;
+    public Object data;
+
+    @Override
+    public String toString() {
+        return "response{" +
+                "code=" + code +
+                ", message='" + message + '\'' +
+                ", data=" + data +
+                '}';
+    }
+}

+ 30 - 0
src/main/java/com/ueiibi/shop/util/HttpUtil.java

@@ -0,0 +1,30 @@
+package com.ueiibi.shop.util;
+
+import org.apache.hc.client5.http.fluent.Request;
+import org.apache.hc.core5.http.ContentType;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+import java.time.Instant;
+
+public class HttpUtil {
+    private static final ObjectMapper mapper = new ObjectMapper();
+
+    public static <T> T post(String url, Object body, Integer appId, String privateKey, Class<T> clazz) throws Exception {
+        String timestamp = String.valueOf(Instant.now().getEpochSecond());
+        String raw = appId + timestamp;
+        String sign = SignUtil.sign(raw, privateKey);
+        String json = mapper.writeValueAsString(body);
+
+        String response = Request.post(url)
+                .addHeader("Content-Type", "application/json")
+                .addHeader("app-id", String.valueOf(appId))
+                .addHeader("timestamp", timestamp)
+                .addHeader("sign", sign)
+                .bodyString(json, ContentType.APPLICATION_JSON)
+                .execute()
+                .returnContent()
+                .asString();
+
+        return mapper.readValue(response, clazz);
+    }
+}

+ 24 - 0
src/main/java/com/ueiibi/shop/util/PemUtil.java

@@ -0,0 +1,24 @@
+package com.ueiibi.shop.util;
+
+import java.security.KeyFactory;
+import java.security.PrivateKey;
+import java.security.PublicKey;
+import java.security.spec.PKCS8EncodedKeySpec;
+import java.security.spec.X509EncodedKeySpec;
+import java.util.Base64;
+
+public class PemUtil {
+    public static PrivateKey loadPrivateKey(String pem) throws Exception {
+        String clean = pem.replaceAll("-----\\w+ PRIVATE KEY-----", "").replaceAll("\\s", "");
+        byte[] keyBytes = Base64.getDecoder().decode(clean);
+        PKCS8EncodedKeySpec spec = new PKCS8EncodedKeySpec(keyBytes);
+        return KeyFactory.getInstance("RSA").generatePrivate(spec);
+    }
+
+    public static PublicKey loadPublicKey(String pem) throws Exception {
+        String clean = pem.replaceAll("-----\\w+ PUBLIC KEY-----", "").replaceAll("\\s", "");
+        byte[] keyBytes = Base64.getDecoder().decode(clean);
+        X509EncodedKeySpec spec = new X509EncodedKeySpec(keyBytes);
+        return KeyFactory.getInstance("RSA").generatePublic(spec);
+    }
+}

+ 74 - 0
src/main/java/com/ueiibi/shop/util/SignUtil.java

@@ -0,0 +1,74 @@
+package com.ueiibi.shop.util;
+
+import java.nio.charset.StandardCharsets;
+import java.security.*;
+import java.time.Instant;
+import java.util.Base64;
+
+public class SignUtil {
+    public static String sign(String content, String privateKeyStr) throws Exception {
+        PrivateKey privateKey = PemUtil.loadPrivateKey(privateKeyStr);
+        Signature signature = Signature.getInstance("SHA256withRSA");
+        signature.initSign(privateKey);
+        signature.update(content.getBytes(StandardCharsets.UTF_8));
+        return Base64.getEncoder().encodeToString(signature.sign());
+    }
+    public static boolean verify(String content, String signBase64, String publicKeyStr) throws Exception {
+        PublicKey publicKey = PemUtil.loadPublicKey(publicKeyStr);
+        Signature signature = Signature.getInstance("SHA256withRSA");
+        signature.initVerify(publicKey);
+        signature.update(content.getBytes(StandardCharsets.UTF_8));
+        byte[] signBytes = Base64.getDecoder().decode(signBase64);
+        return signature.verify(signBytes);
+    }
+
+    public static void main(String[] args) throws Exception {
+        Integer appId = 520980060;
+        String privateKey = "-----BEGIN PRIVATE KEY-----\n" +
+                "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCuUoNrJeK5mBjR\n" +
+                "/PVa212qis8v3t7D2UebdPsz1fSKZqg+418REr9wsBBRQPcU3CQglyM44YV8aGYt\n" +
+                "Aqz43jMw92Ofsv+V7ylbh+Sg4EFdCw+nEwm6aXYMYvNpHLgsYCfQluDTAnSRuuJK\n" +
+                "/z+DZL/J7TKUYb4gM+gy2ak2nFXsmXiSObM/HiPtnj3IQtdlCEK/kJ+BmdQDj4BH\n" +
+                "/JFjnYt50aXtupGza2jHs84BoJMFHu6Eq399BasXYroabsMUHQ1ln18LuJxm1mqh\n" +
+                "lKA/B5XnWMJ3NykG3qq6qxWwKJX7fTFLNDMD8lqjhnywb+2QHFp8UUfxLkbVEuEW\n" +
+                "JhcNJE/vAgMBAAECggEABCikyPwc5heaU/wocFP2bpikK7yx7NM0saE/UvPCQ0EC\n" +
+                "t4leHb6oQYx5vy6BFobP99UTOoqq0BZ/hYhgTwmiCAOG5Wr0TQPpJS1fR3VCKfGX\n" +
+                "HIHIRCG69r2vl+ze+fQLTx8iWvZeiJGAT5C6V6yiJLObds3EJumGGxx1PH/LTvsq\n" +
+                "Ng4liVuun4+GpF/vtltyip164Iy2xf7X7MhHV8uEL1gTVSuJURICi4ke0v1x6zrD\n" +
+                "I3idOt4OQTTG29WDcIGdMJMOtwVAX9KND2DPhAhQvd1aRjYyqdHEXAm8GohsCrdm\n" +
+                "39M00ZenNVUE32SJrN6BeoniNYFPMct4f//ygC2RMQKBgQDm9izoIxDpSW/1jnSn\n" +
+                "nNrA2fMu+SmCQ42Uc3q6K3O9BYo1mQ3w50DHPAWnSbWJnmdh7HGIXHxMv+37Fpz6\n" +
+                "pZ/N6nLx3yCJlyBaVZ8n9OL0IAaVSJfvfmOK0qcQEP6QC87iJJ4XJUOA2/Cy7FX3\n" +
+                "667e/cVdkBW22F0Q1zCjjXq4nwKBgQDBOHC9HAQQHL9Rfjvf/qzo9T+J6DV8SXGu\n" +
+                "+1xoHOynlwe3g+7xa21qhewl4bVYs85+ZLC46SW3NPwQC7Meooxcg2bVIh7YQ5Dq\n" +
+                "PWhY9cPmw3Uxbb8XeS7gaLI2iORXdCbio5XCAx5jEvKsorbOhlpEt7ZyN0IzS8Rr\n" +
+                "Y87PQHMWsQKBgEs4Iaf4w6k2oZ/3pUZxb00frnO98ibamWGfuninbipBg6GxFzk+\n" +
+                "F3rLsYuqFdWcIU9jEha3CER2varo0ndPOZx2nrjnUlF9Rqwk9pCs0L1xMLOt0M3O\n" +
+                "+9xafs5cuotvTRGZm2MuX62388xR7C2yNGGrhHvUUT4beTPi4ZRin3VBAoGAM9AU\n" +
+                "u0FV/ZQX4Zx+JdS/PUD2pt5z6T4wlAGnh+upsk8XrKheXLK4BoafCpF59a1RxCbw\n" +
+                "FMXAbV5x8UOR5rcj+HLsEl8x8kA8DfQllSViQPFM7dJGGd9PKLIqh+ExihoFi2Te\n" +
+                "dcYsUdj05kJDzyHL9v1kmUAkKmk45KtA++aGdiECgYEA5P8m6WC5F/n1EC2Bbqjw\n" +
+                "3BWisqi2nU/IFQoctOwquKbQFAIiGakiBhUzn20d1lPBpzFH1JsTcAHXeAbQFBy9\n" +
+                "vdA+cN0y2S8J61kj/E/dRKiz/H07h7IyBBw2nUZr2r2Pwi0ca8haDdBbOi2/1+29\n" +
+                "auhwh4hJYO4RlbWFPMU8qeI=\n" +
+                "-----END PRIVATE KEY-----\n";
+        String publicKey = "-----BEGIN PUBLIC KEY-----\n" +
+                "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArlKDayXiuZgY0fz1Wttd\n" +
+                "qorPL97ew9lHm3T7M9X0imaoPuNfERK/cLAQUUD3FNwkIJcjOOGFfGhmLQKs+N4z\n" +
+                "MPdjn7L/le8pW4fkoOBBXQsPpxMJuml2DGLzaRy4LGAn0Jbg0wJ0kbriSv8/g2S/\n" +
+                "ye0ylGG+IDPoMtmpNpxV7Jl4kjmzPx4j7Z49yELXZQhCv5CfgZnUA4+AR/yRY52L\n" +
+                "edGl7bqRs2tox7POAaCTBR7uhKt/fQWrF2K6Gm7DFB0NZZ9fC7icZtZqoZSgPweV\n" +
+                "51jCdzcpBt6quqsVsCiV+30xSzQzA/Jao4Z8sG/tkBxafFFH8S5G1RLhFiYXDSRP\n" +
+                "7wIDAQAB\n" +
+                "-----END PUBLIC KEY-----\n";
+//        String timestamp = String.valueOf(Instant.now().getEpochSecond());
+        String timestamp = String.valueOf(1746696859);
+        String raw = appId + timestamp;
+        String sign = SignUtil.sign(raw, privateKey);
+        System.out.printf("sign = %s\n", sign);
+        System.out.printf("raw = %s\n", raw);
+
+        Boolean res = SignUtil.verify(raw,sign,publicKey);
+        System.out.printf("res = %s\n", res);
+    }
+}

+ 46 - 0
src/main/java/com/ueiibi/shop/util/TireMallUtil.java

@@ -0,0 +1,46 @@
+package com.ueiibi.shop.util;
+
+import com.alibaba.fastjson2.JSONObject;
+import com.ueiibi.shop.ApiClient;
+import com.ueiibi.shop.enums.FinalMap;
+import com.ueiibi.shop.model.OrderRequest;
+import com.ueiibi.shop.model.OrderResult;
+import com.ueiibi.shop.model.Response;
+import org.apache.hc.core5.http.HttpStatus;
+
+
+/**
+ * @author Rain
+ */
+public class TireMallUtil {
+
+
+    /**
+     * 创建国联商城订单
+     *
+     * @param appId       appId由国联提供
+     * @param orderNumber 商品数量
+     * @return 结果
+     */
+    public static OrderResult sendOrder(Integer appId, Integer orderNumber) {
+        ApiClient apiClient = new ApiClient(FinalMap.BASE_URL, appId, FinalMap.PRIVATE_KEY);
+        OrderRequest orderRequest = new OrderRequest();
+        orderRequest.goods_id = 7497;
+        orderRequest.order_number = orderNumber;
+        try {
+            Response response = apiClient.addOrder(orderRequest);
+            OrderResult orderResult = new OrderResult();
+            orderResult.message = response.message;
+            orderResult.code = response.code;
+            orderResult.data = JSONObject.from(response.data);
+            return orderResult;
+        } catch (Exception e) {
+            OrderResult orderResult = new OrderResult();
+            orderResult.code = HttpStatus.SC_INTERNAL_SERVER_ERROR;
+            orderResult.message = e.getMessage();
+            return orderResult;
+        }
+    }
+
+
+}