From a92e3aeb50efc6ef252d0fbaa2d45b4b7a3f5c61 Mon Sep 17 00:00:00 2001
From: 啊鑫 <t2856754968@163.com>
Date: 星期三, 20 八月 2025 16:06:44 +0800
Subject: [PATCH] 条码接口测试

---
 src/main/java/com/gs/xiaomi/service/BCS101ApiService.java |  140 ++++++++++++++++++++++++++++++++++++++++++++++
 src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java   |   20 ++++++
 2 files changed, 160 insertions(+), 0 deletions(-)

diff --git a/src/main/java/com/gs/xiaomi/service/BCS101ApiService.java b/src/main/java/com/gs/xiaomi/service/BCS101ApiService.java
index 0e4cfb4..f1c36eb 100644
--- a/src/main/java/com/gs/xiaomi/service/BCS101ApiService.java
+++ b/src/main/java/com/gs/xiaomi/service/BCS101ApiService.java
@@ -271,4 +271,144 @@
             throw new IOException("Empty response body");
         }
     }
+
+    /**
+     * X5鍗忚鏍囧噯瀹炵幇鐗堟湰
+     * 鍩轰簬娉ㄩ噴瑕佹眰锛歑5鍗忚涓娇鐢ㄧ殑锛堝浗瀵嗙畻娉曪級
+     * APP ID锛歜cs_fty_177301, APP Key锛欼JBVGMJXG4ZTAMLSMFXGI33NONQWY5DG
+     */
+    public String getBCS101DataX5Standard(BCS101Request request) throws IOException {
+        System.out.println("=== BCS101 API X5鍗忚鏍囧噯瀹炵幇 ===");
+
+        // 1. 鏋勫缓JSON鏁版嵁
+        String jsonData = objectMapper.writeValueAsString(request);
+        System.out.println("1. 鍘熷JSON: " + jsonData);
+
+        // 2. Base64缂栫爜
+        String base64Data = X5StringUtils.encodeBase64(jsonData);
+        System.out.println("2. Base64缂栫爜: " + base64Data);
+
+        // 3. URL缂栫爜
+        String urlEncodedData = URLEncoder.encode(base64Data, "UTF-8");
+        System.out.println("3. URL缂栫爜: " + urlEncodedData);
+
+        // 4. 鏋勫缓form鏁版嵁
+        String formData = "data=" + urlEncodedData;
+        System.out.println("4. Form鏁版嵁: " + formData);
+
+        // 5. X5鍗忚鍙傛暟
+        String appId = DataAcquisitionConfiguration.BCS_APP_ID;
+        String appKey = DataAcquisitionConfiguration.BCS_APP_Key;
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+        String nonce = String.valueOf(System.currentTimeMillis()); // 浣跨敤鏃堕棿鎴充綔涓簄once
+
+        // 6. X5鍗忚绛惧悕 - 鏍囧噯绠楁硶: hash(appId + timestamp + nonce + appKey + data)
+        String signString = appId + timestamp + nonce + appKey + formData;
+        String signature;
+        try {
+            signature = SmUtil.sm3(signString);
+            System.out.println("5. 浣跨敤SM3绛惧悕");
+        } catch (Exception e) {
+            signature = DigestUtil.md5Hex(signString).toUpperCase();
+            System.out.println("5. 浣跨敤MD5绛惧悕 (SM3涓嶅彲鐢�)");
+        }
+
+        System.out.println("6. 绛惧悕瀛楃涓�: " + signString);
+        System.out.println("7. 绛惧悕鍊�: " + signature);
+
+        // 7. Basic Auth
+        String credentials = DataAcquisitionConfiguration.BCS_USER_NAME + ":" + DataAcquisitionConfiguration.BCS_PWD;
+        String auth = X5StringUtils.encodeBase64(credentials);
+
+        // 8. 鏋勫缓璇锋眰浣�
+        RequestBody body = RequestBody.create(formData, MediaType.parse("application/x-www-form-urlencoded"));
+
+        // 9. 鏋勫缓璇锋眰 - 娣诲姞X5鍗忚鏍囧噯澶撮儴
+        Request httpRequest = new Request.Builder()
+                .url(DataAcquisitionConfiguration.BCS_101_URL)
+                .method("POST", body)
+                .addHeader("Content-Type", "application/x-www-form-urlencoded")
+                .addHeader("Authorization", "Basic " + auth)
+                .addHeader("X-App-Id", appId)
+                .addHeader("X-Timestamp", timestamp)
+                .addHeader("X-Nonce", nonce)
+                .addHeader("X-Signature", signature)
+                .build();
+
+        System.out.println("8. 鍙戦�乆5鏍囧噯璇锋眰...");
+
+        // 10. 鎵ц璇锋眰
+        try (Response response = client.newCall(httpRequest).execute()) {
+            System.out.println("9. 鍝嶅簲鐘舵��: " + response.code());
+            System.out.println("10. 鍝嶅簲澶�: " + response.headers());
+
+            if (response.body() != null) {
+                String responseBody = response.body().string();
+                System.out.println("11. 鍝嶅簲鍐呭: " + responseBody);
+                return responseBody;
+            }
+            throw new IOException("Empty response body");
+        }
+    }
+
+    /**
+     * X5鍗忚鍙樹綋2 - 涓嶅悓鐨勭鍚嶇畻娉�
+     * 绛惧悕绠楁硶: hash(appKey + data + timestamp + appId)
+     */
+    public String getBCS101DataX5Variant(BCS101Request request) throws IOException {
+        System.out.println("=== BCS101 API X5鍗忚鍙樹綋2 ===");
+
+        // 1. 鏋勫缓鏁版嵁
+        String jsonData = objectMapper.writeValueAsString(request);
+        String base64Data = X5StringUtils.encodeBase64(jsonData);
+        String urlEncodedData = URLEncoder.encode(base64Data, "UTF-8");
+        String formData = "data=" + urlEncodedData;
+
+        // 2. X5鍗忚鍙傛暟
+        String appId = DataAcquisitionConfiguration.BCS_APP_ID;
+        String appKey = DataAcquisitionConfiguration.BCS_APP_Key;
+        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+
+        // 3. 鍙樹綋绛惧悕绠楁硶: appKey + data + timestamp + appId
+        String signString = appKey + formData + timestamp + appId;
+        String signature;
+        try {
+            signature = SmUtil.sm3(signString);
+            System.out.println("浣跨敤SM3绛惧悕鍙樹綋");
+        } catch (Exception e) {
+            signature = DigestUtil.md5Hex(signString).toUpperCase();
+            System.out.println("浣跨敤MD5绛惧悕鍙樹綋");
+        }
+
+        System.out.println("绛惧悕瀛楃涓�(鍙樹綋): " + signString);
+        System.out.println("绛惧悕鍊�(鍙樹綋): " + signature);
+
+        // 4. Basic Auth
+        String credentials = DataAcquisitionConfiguration.BCS_USER_NAME + ":" + DataAcquisitionConfiguration.BCS_PWD;
+        String auth = X5StringUtils.encodeBase64(credentials);
+
+        // 5. 鏋勫缓璇锋眰 - 浣跨敤甯歌鐨刋5澶撮儴鍚嶇О
+        RequestBody body = RequestBody.create(formData, MediaType.parse("application/x-www-form-urlencoded"));
+        Request httpRequest = new Request.Builder()
+                .url(DataAcquisitionConfiguration.BCS_101_URL)
+                .method("POST", body)
+                .addHeader("Content-Type", "application/x-www-form-urlencoded")
+                .addHeader("Authorization", "Basic " + auth)
+                .addHeader("appId", appId)
+                .addHeader("timestamp", timestamp)
+                .addHeader("signature", signature)
+                .build();
+
+        System.out.println("鍙戦�乆5鍙樹綋璇锋眰...");
+
+        try (Response response = client.newCall(httpRequest).execute()) {
+            System.out.println("鍙樹綋鍝嶅簲鐘舵��: " + response.code());
+            if (response.body() != null) {
+                String responseBody = response.body().string();
+                System.out.println("鍙樹綋鍝嶅簲鍐呭: " + responseBody);
+                return responseBody;
+            }
+            throw new IOException("Empty response body");
+        }
+    }
 }
diff --git a/src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java b/src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java
index 45cc4df..3b4e7cd 100644
--- a/src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java
+++ b/src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java
@@ -83,5 +83,25 @@
             System.out.println("BCS101 API 绠�鍖栫増鏈皟鐢ㄥ紓甯�: " + e.getMessage());
             e.printStackTrace();
         }
+
+        System.out.println("\n=== 娴嬭瘯BCS101 API鏈嶅姟锛圶5鍗忚鏍囧噯鐗堟湰锛� ===");
+        try {
+            // 璋冪敤X5鍗忚鏍囧噯鐗堟湰
+            String x5StandardResponse = bcs101ApiService.getBCS101DataX5Standard(request);
+            System.out.println("BCS101 API X5Standard Response: " + x5StandardResponse);
+        } catch (Exception e) {
+            System.out.println("BCS101 API X5鏍囧噯鐗堟湰璋冪敤寮傚父: " + e.getMessage());
+            e.printStackTrace();
+        }
+
+        System.out.println("\n=== 娴嬭瘯BCS101 API鏈嶅姟锛圶5鍗忚鍙樹綋鐗堟湰锛� ===");
+        try {
+            // 璋冪敤X5鍗忚鍙樹綋鐗堟湰
+            String x5VariantResponse = bcs101ApiService.getBCS101DataX5Variant(request);
+            System.out.println("BCS101 API X5Variant Response: " + x5VariantResponse);
+        } catch (Exception e) {
+            System.out.println("BCS101 API X5鍙樹綋鐗堟湰璋冪敤寮傚父: " + e.getMessage());
+            e.printStackTrace();
+        }
     }
 }

--
Gitblit v1.9.3