|
|
@@ -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();
|
|
|
}
|
|
|
|