yumeng vor 3 Wochen
Ursprung
Commit
9cf66b3b40

+ 12 - 2
src/main/java/com/adx/tencent/conversionsync/ConversionSyncService.java

@@ -140,7 +140,12 @@ public class ConversionSyncService {
             // 网络级错误
             result.failed.incrementAndGet();
             if (coldStore != null) {
-                try { coldStore.saveMediaCallback(callbackRecord); } catch (Exception ignored) {}
+                try {
+                    coldStore.saveMediaCallback(callbackRecord);
+                } catch (Exception e) {
+                    log.error("[ConversionSync] 保存callback记录失败: dedupeKey={}, error={}",
+                            callbackKey, e.getMessage());
+                }
             }
             return;
         }
@@ -148,7 +153,12 @@ public class ConversionSyncService {
         // HTTP 请求完成
         result.sent.incrementAndGet();
         if (coldStore != null) {
-            try { coldStore.saveMediaCallback(callbackRecord); } catch (Exception ignored) {}
+            try {
+                coldStore.saveMediaCallback(callbackRecord);
+            } catch (Exception e) {
+                log.error("[ConversionSync] 保存callback记录失败: dedupeKey={}, error={}",
+                        callbackKey, e.getMessage());
+            }
         }
     }
 

+ 21 - 12
src/main/java/com/adx/tencent/tencent/TencentClient.java

@@ -166,27 +166,36 @@ public class TencentClient {
     // ─── 内部方法 ────────────────────────────────────────────────────────────
 
     /**
-     * 构造 callback POST 请求,自动判断是否需要鉴权 header。
+     * 构造 callback POST 请求,始终携带鉴权 header。
+     * 2025-03-31 起腾讯不再支持 HTTP 无鉴权上报,所有请求均需鉴权。
      */
     private HttpRequest buildCallbackRequest(String callbackUrl, byte[] payload) {
-        boolean needAuth = callbackUrl.contains("api.e.qq.com");
+        // 强制 https(兼容旧的 http://tracking.e.qq.com 格式)
+        String url = callbackUrl;
+        if (url.startsWith("http://tracking.e.qq.com")) {
+            url = url.replace("http://tracking.e.qq.com", "https://api.e.qq.com");
+        } else if (url.startsWith("http://")) {
+            url = url.replace("http://", "https://");
+        }
 
         HttpRequest.Builder reqBuilder = HttpRequest.newBuilder()
-                .uri(URI.create(callbackUrl))
+                .uri(URI.create(url))
                 .POST(HttpRequest.BodyPublishers.ofByteArray(payload))
                 .header("Content-Type", "application/json")
                 .timeout(Duration.ofSeconds(15));
 
-        if (needAuth) {
-            String currentToken = accessTokenSupplier.get();
-            if (currentToken != null && !currentToken.isBlank()) {
-                long timestamp = Instant.now().getEpochSecond();
-                String nonce = UUID.randomUUID().toString().replace("-", "").substring(0, 32);
-                reqBuilder.header("access-token", currentToken);
-                reqBuilder.header("timestamp", String.valueOf(timestamp));
-                reqBuilder.header("nonce", nonce);
-            }
+        // 始终添加鉴权 header
+        String currentToken = accessTokenSupplier.get();
+        if (currentToken != null && !currentToken.isBlank()) {
+            long timestamp = Instant.now().getEpochSecond();
+            String nonce = UUID.randomUUID().toString().replace("-", "").substring(0, 32);
+            reqBuilder.header("access-token", currentToken);
+            reqBuilder.header("timestamp", String.valueOf(timestamp));
+            reqBuilder.header("nonce", nonce);
+        } else {
+            log.warn("[Tencent] access_token 为空, 鉴权可能失败");
         }
+
         return reqBuilder.build();
     }
 

+ 1 - 1
src/main/resources/application-prod.yml

@@ -25,7 +25,7 @@ adx:
     "3": REGISTER
     "4": ONE_DAY_RETENTION
     "5": COMPLETE_ORDER
-    "6": START_APP
+    "6": OPTIMIZATIONGOAL_PROMOTION_VIEW_KEY_PAGE
     "7": CUSTOM
     "8": CUSTOM
     "9": CUSTOM