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 '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(); + } } } -- Gitblit v1.9.3