From dfca73284ec549bf83a2c7d59b37cdcdb44800e0 Mon Sep 17 00:00:00 2001
From: tjx <t2856754968@163.com>
Date: 星期五, 24 十月 2025 13:05:22 +0800
Subject: [PATCH] 111

---
 src/main/java/com/gs/xiaomi/service/BCS101ApiService.java |  150 ++++++++++++++++++++++++++++++-------------------
 1 files changed, 92 insertions(+), 58 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..e36db50 100644
--- a/src/main/java/com/gs/xiaomi/service/BCS101ApiService.java
+++ b/src/main/java/com/gs/xiaomi/service/BCS101ApiService.java
@@ -4,13 +4,15 @@
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.gs.xiaomi.config.DataAcquisitionConfiguration;
 import com.gs.xiaomi.dto.BCS101Request;
+import com.gs.xiaomi.dto.X5Header;
+import com.gs.xiaomi.dto.X5Request;
+import com.gs.xiaomi.dto.X5Response;
 import com.gs.xiaomi.util.X5StringUtils;
 import okhttp3.*;
 import org.springframework.stereotype.Service;
 
 import java.io.IOException;
 import java.net.URLEncoder;
-import java.nio.charset.StandardCharsets;
 import java.util.concurrent.TimeUnit;
 
 @Service
@@ -28,80 +30,112 @@
     }
 
     /**
-     * 鑾峰彇BCS101鏁版嵁
+     * 鑾峰彇BCS101鏁版嵁 - 涓ユ牸鎸夌収C# X5鍗忚瀹炵幇
+     * <p>
+     * 鍩轰簬C# Helper102.POSTResponseData鏂规硶鐨凧ava瀹炵幇
+     * X5鍗忚娴佺▼:
+     * 1. 搴忓垪鍖朆ody涓篔SON瀛楃涓�
+     * 2. MD5绛惧悕: MD5(appid+bodyStr+appkey)
+     * 3. 鏋勫缓X5Request {header: {appid, sign}, body: bodyStr}
+     * 4. Base64缂栫爜鏁翠釜X5Request
+     * 5. URL缂栫爜
+     * 6. 鍙戦�� data=url缂栫爜(base64缂栫爜)鐨勬暟鎹�
      *
      * @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鍗忚鐨勶紝 鎴戠湅浣犳病鏈変负鎴戞坊鍔�
-     *                     APP ID锛歜cs_fty_177301
-     *                     APP Key锛欼JBVGMJXG4ZTAMLSMFXGI33NONQWY5DG
      */
     public String getBCS101Data(BCS101Request request) throws IOException {
-        // 鐩存帴灏嗚姹傚璞¤浆鎹负JSON瀛楃涓�
-        String jsonData = objectMapper.writeValueAsString(request);
+        try {
+            System.out.println("=== BCS101 X5鍗忚瀹炵幇 (鍩轰簬C#浠g爜) ===");
 
-        // Base64缂栫爜
-        String base64Data = X5StringUtils.encodeBase64(jsonData);
+            // 1. 搴忓垪鍖朆ody涓篔SON瀛楃涓�
+            String bodyStr = objectMapper.writeValueAsString(request);
+            System.out.println("1. Body JSON: " + bodyStr);
 
-        // URL缂栫爜
-        String urlEncodedData = URLEncoder.encode(base64Data, String.valueOf(StandardCharsets.UTF_8));
+            // 2. MD5绛惧悕: sign = MD5(appid + bodyStr + appkey)
+            String appId = DataAcquisitionConfiguration.BCS_APP_ID;
+            String appKey = DataAcquisitionConfiguration.BCS_APP_Key;
+            String signString = appId + bodyStr + appKey;
+            String sign = DigestUtil.md5Hex(signString).toUpperCase();
+            System.out.println("2. 绛惧悕瀛楃涓�: " + signString);
+            System.out.println("3. MD5绛惧悕: " + sign);
 
-        // 鏋勫缓form琛ㄥ崟鏁版嵁
-        String formData = "data=" + urlEncodedData;
+            // 3. 鏋勫缓X5Header
+            X5Header header = new X5Header(appId, sign);
 
-        // 鐢熸垚鏃堕棿鎴�
-        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
+            // 4. 鏋勫缓X5Request
+            X5Request x5Request = new X5Request(header, bodyStr);
+            String x5RequestJson = objectMapper.writeValueAsString(x5Request);
+            System.out.println("4. X5Request JSON: " + x5RequestJson);
 
-        // 鐢熸垚X5绛惧悕
-        String signature = generateX5Signature(
-                DataAcquisitionConfiguration.BCS_APP_ID,
-                DataAcquisitionConfiguration.BCS_APP_Key,
-                timestamp,
-                formData
-        );
+            // 5. Base64缂栫爜鏁翠釜X5Request
+            String base64Data = X5StringUtils.encodeBase64(x5RequestJson);
+            System.out.println("5. Base64缂栫爜: " + base64Data);
 
-        // 鏋勫缓Authorization header
-        String credentials = DataAcquisitionConfiguration.BCS_USER_NAME + ":" + DataAcquisitionConfiguration.BCS_PWD;
-        String auth = X5StringUtils.encodeBase64(credentials);
+            // 6. URL缂栫爜
+            String urlEncodedData = URLEncoder.encode(base64Data, "UTF-8");
+            System.out.println("6. URL缂栫爜: " + urlEncodedData);
 
-        // 鏋勫缓璇锋眰浣�
-        RequestBody body = RequestBody.create(formData, MediaType.parse("application/x-www-form-urlencoded"));
+            // 7. 鏋勫缓form琛ㄥ崟鏁版嵁: data=url缂栫爜(base64缂栫爜)鐨勬暟鎹�
+            String formData = "data=" + urlEncodedData;
+            System.out.println("7. Form鏁版嵁: " + formData);
 
-        // 鏋勫缓璇锋眰
-        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", DataAcquisitionConfiguration.BCS_APP_ID)
-                .addHeader("X-Timestamp", timestamp)
-                .addHeader("X-Signature", signature)
-                .build();
+            // 8. Basic Auth璁よ瘉
+            String credentials = DataAcquisitionConfiguration.BCS_USER_NAME + ":" + DataAcquisitionConfiguration.BCS_PWD;
+            String auth = X5StringUtils.encodeBase64(credentials);
+            System.out.println("8. Basic Auth: Basic " + auth);
 
-        // 鎵ц璇锋眰
-        try (Response response = client.newCall(httpRequest).execute()) {
-            if (response.body() != null) {
-                return response.body().string();
+            // 9. 鏋勫缓HTTP璇锋眰 - 涓ユ牸鎸夌収C#浠g爜鐨勮姹傛牸寮�
+            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("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8")
+                    .addHeader("Cache-Control", "no-cache")
+                    .addHeader("Pragma", "no-cache")
+                    .build();
+
+            System.out.println("9. 鍙戦�乆5鍗忚璇锋眰鍒�: " + DataAcquisitionConfiguration.BCS_101_URL);
+
+            // 10. 鎵ц璇锋眰
+            try (Response response = client.newCall(httpRequest).execute()) {
+                System.out.println("10. HTTP鐘舵�佺爜: " + response.code());
+                System.out.println("11. 鍝嶅簲澶�: " + response.headers());
+
+                if (response.body() != null) {
+                    String responseBody = response.body().string();
+                    System.out.println("12. 鍘熷鍝嶅簲: " + responseBody);
+
+                    // 11. 灏濊瘯瑙f瀽涓篨5Response鏍煎紡
+                    try {
+                        X5Response x5Response = objectMapper.readValue(responseBody, X5Response.class);
+                        System.out.println("13. X5鍝嶅簲瑙f瀽鎴愬姛: " + x5Response);
+
+                        // 妫�鏌ュ搷搴旂姸鎬�
+                        if (x5Response.getHeader() != null && "200".equals(x5Response.getHeader().getCode())) {
+                            System.out.println("14. X5鍗忚璋冪敤鎴愬姛");
+                        } else {
+                            System.out.println("14. X5鍗忚璋冪敤澶辫触: " +
+                                    (x5Response.getHeader() != null ? x5Response.getHeader().getDesc() : "鏈煡閿欒"));
+                        }
+                    } catch (Exception e) {
+                        System.out.println("13. 闈瀀5鏍煎紡鍝嶅簲锛岀洿鎺ヨ繑鍥炲師濮嬪唴瀹�");
+                    }
+
+                    return responseBody;
+                }
+
+                throw new IOException("Empty response body");
             }
-            throw new IOException("Empty response body");
+
+        } catch (Exception ex) {
+            System.err.println("BCS101 X5鍗忚璋冪敤寮傚父: " + ex.getMessage());
+            ex.printStackTrace();
+            throw new IOException("BCS101 X5鍗忚璋冪敤澶辫触", ex);
         }
     }
 
-    /**
-     * 鐢熸垚X5鍗忚绛惧悕
-     *
-     * @param appId     APP ID
-     * @param appKey    APP Key
-     * @param timestamp 鏃堕棿鎴�
-     * @param data      璇锋眰鏁版嵁
-     * @return 绛惧悕瀛楃涓�
-     */
-    private String generateX5Signature(String appId, String appKey, String timestamp, String data) {
-        // X5绛惧悕绠楁硶: MD5(appId + appKey + timestamp + data)
-        String signString = appId + appKey + timestamp + data;
-        return DigestUtil.md5Hex(signString).toUpperCase();
-    }
 }

--
Gitblit v1.9.3