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 +++++++++++++++++++++++++++++++++--------
src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java | 13 ++++
pom.xml | 8 ++
3 files changed, 120 insertions(+), 28 deletions(-)
diff --git a/pom.xml b/pom.xml
index 391f2ca..024ad4b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -85,7 +85,13 @@
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
- <version>5.8.18</version>
+ <version>5.8.25</version>
+ </dependency>
+
+ <dependency>
+ <groupId>org.bouncycastle</groupId>
+ <artifactId>bcprov-jdk15on</artifactId>
+ <version>1.68</version>
</dependency>
</dependencies>
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 'CC_MI_OEM_HTTP_OUT' (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();
+ }
}
}
diff --git a/src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java b/src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java
index b7a66c5..f5ee5c8 100644
--- a/src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java
+++ b/src/test/java/com/gs/xiaomi/XiaomiApplicationTests.java
@@ -42,13 +42,24 @@
request.setPageNo(1);
request.setPageSize(1000);
+ System.out.println("=== 娴嬭瘯BCS101 API鏈嶅姟锛圔asic Auth鐗堟湰锛� ===");
try {
- // 璋冪敤BCS101 API鏈嶅姟
+ // 璋冪敤鏍囧噯BCS101 API鏈嶅姟锛堝彧浣跨敤Basic Auth锛�
String response = bcs101ApiService.getBCS101Data(request);
System.out.println("BCS101 API Response: " + response);
} catch (Exception e) {
System.out.println("BCS101 API璋冪敤寮傚父: " + e.getMessage());
e.printStackTrace();
}
+
+ System.out.println("\n=== 娴嬭瘯BCS101 API鏈嶅姟锛堝甫X5鍗忚鐗堟湰锛� ===");
+ try {
+ // 璋冪敤甯5鍗忚鐨凚CS101 API鏈嶅姟
+ String responseWithX5 = bcs101ApiService.getBCS101DataWithX5(request, true);
+ System.out.println("BCS101 API Response (X5): " + responseWithX5);
+ } catch (Exception e) {
+ System.out.println("BCS101 API X5璋冪敤寮傚父: " + e.getMessage());
+ e.printStackTrace();
+ }
}
}
--
Gitblit v1.9.3