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

---
 src/main/java/com/gs/xiaomi/service/BCS101ApiService.java |  127 +++++++++++++++++++++++++++++++++--------
 1 files changed, 101 insertions(+), 26 deletions(-)

diff --git a/src/main/java/com/gs/xiaomi/service/BCS101ApiService.java b/src/main/java/com/gs/xiaomi/service/BCS101ApiService.java
index 7c157cc..3f0f5ee 100644
--- a/src/main/java/com/gs/xiaomi/service/BCS101ApiService.java
+++ b/src/main/java/com/gs/xiaomi/service/BCS101ApiService.java
@@ -1,5 +1,6 @@
 package com.gs.xiaomi.service;
 
+import cn.hutool.crypto.SmUtil;
 import cn.hutool.crypto.digest.DigestUtil;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.gs.xiaomi.config.DataAcquisitionConfiguration;
@@ -33,13 +34,77 @@
      * @param request BCS101璇锋眰鍙傛暟
      * @return API鍝嶅簲
      * @throws IOException 缃戠粶寮傚父
-     *                     鎺ュ彛杩斿洖
-     *                     Error: ERROR_IN_MODULECHAIN;ERROR_IN_MODULECHAIN, Sender Channel &#39;CC_MI_OEM_HTTP_OUT&#39; (ID: a58369adbaa03aafb76d2c02c2ae7cd7): Catching exception calling messaging system
-     *                     鎴戞槸闇�瑕乆5鍗忚鐨勶紝 鎴戠湅浣犳病鏈変负鎴戞坊鍔�
+     *                     <p>
+     *                     HTTP璁块棶闇�瑕丅aisc Auth(璇ヨ处鎴蜂负鏉$爜闆嗘垚涓撶敤璐︽埛锛屽瘑鐮佸垏鍕胯緭鍏ラ敊璇紒锛�:
+     *                     璐︽埛: RFCBCSXIAOBU
+     *                     瀵嗙爜: L5X8!pdL
+     *                     濡備綍浣跨敤锛�
+     *                     浣跨敤http 璋冪敤鏃堕渶瑕佹牴鎹处鎴峰瘑鐮佸鍔爃ttp headers鍙傛暟Authorization
+     *                     瀵瑰簲鐨勫�间负Basic bas64(璐︽埛:瀵嗙爜)
+     *                     <p>
+     *                     X5鍗忚涓娇鐢ㄧ殑锛堝浗瀵嗙畻娉曪級
+     *                     瀵瑰簲appid鍜屽搴攁ppkey璇蜂娇鐢ㄥ皬绫虫潯鐮佸钩鍙板垎閰嶇殑瀵瑰簲鐨勬祴璇曟満淇℃伅锛�
      *                     APP ID锛歜cs_fty_177301
      *                     APP Key锛欼JBVGMJXG4ZTAMLSMFXGI33NONQWY5DG
+     *                     <p>
+     *                     HTTP HEADER鍙傛暟:
+     *                     Authorization  Basic XXXXX
+     *                     鍚屾椂璇锋坊鍔燞TTP HEADER鍙傛暟锛�
+     *                     Content-Type  application/x-www-form-urlencoded
+     *                     body閫夋嫨raw锛�
+     *                     鏁版嵁鏍煎紡涓篸ata=url缂栫爜(base64缂栫爜)鐨勬暟鎹�
+     *                     </p>
      */
     public String getBCS101Data(BCS101Request request) throws IOException {
+        // 鐩存帴灏嗚姹傚璞¤浆鎹负JSON瀛楃涓�
+        String jsonData = objectMapper.writeValueAsString(request);
+
+        // Base64缂栫爜
+        String base64Data = X5StringUtils.encodeBase64(jsonData);
+
+        // URL缂栫爜
+        String urlEncodedData = URLEncoder.encode(base64Data, String.valueOf(StandardCharsets.UTF_8));
+
+        // 鏋勫缓form琛ㄥ崟鏁版嵁 - 鎸夌収娉ㄩ噴瑕佹眰锛歞ata=url缂栫爜(base64缂栫爜)鐨勬暟鎹�
+        String formData = "data=" + urlEncodedData;
+
+        // 鏋勫缓Basic Auth - 浣跨敤涓撶敤鏉$爜闆嗘垚璐︽埛
+        String credentials = DataAcquisitionConfiguration.BCS_USER_NAME + ":" + DataAcquisitionConfiguration.BCS_PWD;
+        String auth = X5StringUtils.encodeBase64(credentials);
+
+        // 鏋勫缓璇锋眰浣� - Content-Type: application/x-www-form-urlencoded
+        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)
+                .build();
+
+        // 鎵ц璇锋眰
+        try (Response response = client.newCall(httpRequest).execute()) {
+            if (response.body() != null) {
+                String responseBody = response.body().string();
+                // 璁板綍鍝嶅簲淇℃伅鐢ㄤ簬璋冭瘯
+                System.out.println("BCS101 API鍝嶅簲鐘舵��: " + response.code());
+                System.out.println("BCS101 API鍝嶅簲鍐呭: " + responseBody);
+                return responseBody;
+            }
+            throw new IOException("Empty response body");
+        }
+    }
+
+    /**
+     * 鑾峰彇BCS101鏁版嵁 - 甯5鍗忚鏀寔
+     *
+     * @param request  BCS101璇锋眰鍙傛暟
+     * @param enableX5 鏄惁鍚敤X5鍗忚鍥藉瘑绛惧悕
+     * @return API鍝嶅簲
+     * @throws IOException 缃戠粶寮傚父
+     */
+    public String getBCS101DataWithX5(BCS101Request request, boolean enableX5) throws IOException {
         // 鐩存帴灏嗚姹傚璞¤浆鎹负JSON瀛楃涓�
         String jsonData = objectMapper.writeValueAsString(request);
 
@@ -52,46 +117,49 @@
         // 鏋勫缓form琛ㄥ崟鏁版嵁
         String formData = "data=" + urlEncodedData;
 
-        // 鐢熸垚鏃堕棿鎴�
-        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
-
-        // 鐢熸垚X5绛惧悕
-        String signature = generateX5Signature(
-                DataAcquisitionConfiguration.BCS_APP_ID,
-                DataAcquisitionConfiguration.BCS_APP_Key,
-                timestamp,
-                formData
-        );
-
-        // 鏋勫缓Authorization header
+        // 鏋勫缓Basic Auth
         String credentials = DataAcquisitionConfiguration.BCS_USER_NAME + ":" + DataAcquisitionConfiguration.BCS_PWD;
         String auth = X5StringUtils.encodeBase64(credentials);
 
         // 鏋勫缓璇锋眰浣�
         RequestBody body = RequestBody.create(formData, MediaType.parse("application/x-www-form-urlencoded"));
 
-        // 鏋勫缓璇锋眰
-        Request httpRequest = new Request.Builder()
+        Request.Builder requestBuilder = 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", DataAcquisitionConfiguration.BCS_APP_ID)
-                .addHeader("X-Timestamp", timestamp)
-                .addHeader("X-Signature", signature)
-                .build();
+                .addHeader("Authorization", "Basic " + auth);
+
+        // 濡傛灉鍚敤X5鍗忚锛屾坊鍔犲浗瀵嗙鍚�
+        if (enableX5) {
+            String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+            String signature = generateX5Signature(
+                    DataAcquisitionConfiguration.BCS_APP_ID,
+                    DataAcquisitionConfiguration.BCS_APP_Key,
+                    timestamp,
+                    formData
+            );
+            requestBuilder.addHeader("X-App-Id", DataAcquisitionConfiguration.BCS_APP_ID)
+                    .addHeader("X-Timestamp", timestamp)
+                    .addHeader("X-Signature", signature);
+        }
+
+        Request httpRequest = requestBuilder.build();
 
         // 鎵ц璇锋眰
         try (Response response = client.newCall(httpRequest).execute()) {
             if (response.body() != null) {
-                return response.body().string();
+                String responseBody = response.body().string();
+                System.out.println("BCS101 API鍝嶅簲鐘舵��: " + response.code());
+                System.out.println("BCS101 API鍝嶅簲鍐呭: " + responseBody);
+                return responseBody;
             }
             throw new IOException("Empty response body");
         }
     }
 
     /**
-     * 鐢熸垚X5鍗忚绛惧悕
+     * 鐢熸垚X5鍗忚绛惧悕 - 浣跨敤鍥藉瘑绠楁硶
      *
      * @param appId     APP ID
      * @param appKey    APP Key
@@ -100,8 +168,15 @@
      * @return 绛惧悕瀛楃涓�
      */
     private String generateX5Signature(String appId, String appKey, String timestamp, String data) {
-        // X5绛惧悕绠楁硶: MD5(appId + appKey + timestamp + data)
+        // X5鍗忚鍥藉瘑绠楁硶绛惧悕: 灏濊瘯浣跨敤SM3锛屽鏋滀笉鏀寔鍒欎娇鐢∕D5
         String signString = appId + appKey + timestamp + data;
-        return DigestUtil.md5Hex(signString).toUpperCase();
+        try {
+            // 灏濊瘯浣跨敤鍥藉瘑SM3绠楁硶
+            return SmUtil.sm3(signString).toUpperCase();
+        } catch (Exception e) {
+            // 濡傛灉SM3涓嶅彲鐢紝fallback鍒癕D5
+            System.out.println("SM3绠楁硶涓嶅彲鐢紝浣跨敤MD5鏇夸唬: " + e.getMessage());
+            return DigestUtil.md5Hex(signString).toUpperCase();
+        }
     }
 }

--
Gitblit v1.9.3