From a063c29865376dfa4bfa2406b6bf16f0c419927e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=97=B4=E8=B4=A7?= <252048765@qq.com>
Date: Fri, 9 May 2025 20:35:33 +0800
Subject: [PATCH 1/2] =?UTF-8?q?=E6=B7=BB=E5=8A=A0dy-java-tiktok=E6=A8=A1?=
=?UTF-8?q?=E5=9D=97=E5=8F=8A=E4=BE=9D=E8=B5=96=E9=85=8D=E7=BD=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
dy-java-tiktok/pom.xml | 30 ++++++++++++
.../java/com/dyj/tiktok/DyTiktokClient.java | 48 +++++++++++++++++++
pom.xml | 28 +++++++++++
3 files changed, 106 insertions(+)
create mode 100644 dy-java-tiktok/pom.xml
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/DyTiktokClient.java
diff --git a/dy-java-tiktok/pom.xml b/dy-java-tiktok/pom.xml
new file mode 100644
index 0000000..0daf631
--- /dev/null
+++ b/dy-java-tiktok/pom.xml
@@ -0,0 +1,30 @@
+
+ 4.0.0
+
+ com.dyj
+ dy-java
+ ${revision}
+
+
+ dy-java-tiktok
+ jar
+ dy-java-tiktok
+
+
+
+
+
+ com.dyj
+ dy-java-spring
+ ${revision}
+ compile
+
+
+ com.dyj
+ dy-java-common
+ ${revision}
+ compile
+
+
+
diff --git a/dy-java-tiktok/src/main/java/com/dyj/tiktok/DyTiktokClient.java b/dy-java-tiktok/src/main/java/com/dyj/tiktok/DyTiktokClient.java
new file mode 100644
index 0000000..b3690d5
--- /dev/null
+++ b/dy-java-tiktok/src/main/java/com/dyj/tiktok/DyTiktokClient.java
@@ -0,0 +1,48 @@
+package com.dyj.tiktok;
+
+import com.dyj.common.client.BaseClient;
+import com.dyj.common.config.AgentConfiguration;
+import com.dyj.common.config.DyConfiguration;
+import com.dyj.common.domain.DataAndExtraBodyVo;
+import com.dyj.common.domain.DyResult;
+import com.dyj.common.domain.DySimpleResult;
+import com.dyj.common.domain.UserTokenInfo;
+import com.dyj.common.domain.vo.*;
+import org.apache.commons.codec.digest.DigestUtils;
+import org.springframework.util.StreamUtils;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Files;
+import java.util.List;
+
+/**
+ * @author danmo
+ * @date 2024-04-03 17:25
+ **/
+public class DyTiktokClient extends BaseClient {
+
+ public DyTiktokClient() {
+ }
+
+ public static DyTiktokClient getInstance() {
+ return new DyTiktokClient();
+ }
+
+ public DyTiktokClient tenantId(Integer tenantId) {
+ super.tenantId = tenantId;
+ return this;
+ }
+
+ public DyTiktokClient clientKey(String clientKey) {
+ this.clientKey = clientKey;
+ return this;
+ }
+
+ public String getPreAuthUrl(String redirectUri){
+ return "成功";
+ }
+
+}
diff --git a/pom.xml b/pom.xml
index 3b1e1bb..577ce6b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -14,6 +14,7 @@
dy-java-common
dy-java-web
dy-java-applet
+ dy-java-tiktok
@@ -23,6 +24,7 @@
2.7.18
1.5.36
1.2.83
+ 1.3.0
@@ -86,6 +88,32 @@
${java.version}
+
+
+ org.codehaus.mojo
+ flatten-maven-plugin
+ ${flatten-maven-plugin.version}
+
+ true
+ resolveCiFriendliesOnly
+
+
+
+ flatten
+ process-resources
+
+ flatten
+
+
+
+ flatten.clean
+ clean
+
+ clean
+
+
+
+
\ No newline at end of file
--
Gitee
From 883746abc2518e3eca999db72bfb23d3bc96f0fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=90=83=E8=B4=A7?= <252048765@qq.com>
Date: Mon, 19 May 2025 00:43:39 +0800
Subject: [PATCH 2/2] =?UTF-8?q?feat(tiktok):=20=E6=B7=BB=E5=8A=A0=20TikTok?=
=?UTF-8?q?=20=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD=E5=92=8C=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 新增 TikTok 认证、用户信息、视频列表等功能
- 实现访问令牌获取和刷新逻辑
- 添加视频上传相关接口- 定义 TikTok 相关的枚举和数据结构- 更新项目依赖,包括 Forest、Lombok 等
---
dy-java-common/pom.xml | 8 +-
.../dyj/common/client/TikTokAuthClient.java | 19 ++
.../java/com/dyj/common/domain/DyError.java | 14 ++
.../com/dyj/common/domain/DyTikTokResult.java | 14 ++
.../common/domain/query/UserInfoQuery.java | 8 +-
.../common/domain/vo/AccessTikTokTokenVo.java | 67 ++++++
.../dyj/common/enums/DyTikTokPathEnum.java | 68 ++++++
.../ClientQueryTokenInterceptor.java | 2 +-
.../interceptor/ClientTokenInterceptor.java | 4 +-
.../SubscriptionTokenInterceptor.java | 2 +-
.../TikTokBodyTokenInterceptor.java | 62 +++++
.../TpThirdV2TokenHeaderInterceptor.java | 2 +-
.../TpV2AuthTokenHeaderInterceptor.java | 2 +-
.../TransactionMerchantTokenInterceptor.java | 2 +-
.../com/dyj/common/utils/DecryptUtils.java | 2 -
.../java/com/dyj/common/utils/FieldUtils.java | 38 +++
.../dyj/spring/DyConfigurationRegister.java | 5 +
.../spring/config/DyAutoConfiguration.java | 2 +-
dy-java-tiktok/pom.xml | 4 +
.../java/com/dyj/tiktok/DyTiktokClient.java | 123 +++++++++-
.../com/dyj/tiktok/client/UserClient.java | 21 ++
.../com/dyj/tiktok/client/VideoClient.java | 29 +++
.../domain/vo/InitUploadVideoReqVo.java | 151 ++++++++++++
.../domain/vo/InitUploadVideoRespVo.java | 36 +++
.../domain/vo/QueryPostStatusRespVo.java | 66 ++++++
.../tiktok/domain/vo/QueryVideoListVo.java | 136 +++++++++++
.../dyj/tiktok/domain/vo/TikTokInfoVo.java | 115 +++++++++
.../tiktok/domain/vo/UploadImageReqVo.java | 150 ++++++++++++
.../tiktok/domain/vo/UploadImageRespVo.java | 29 +++
.../com/dyj/tiktok/enums/PostModeEnum.java | 25 ++
.../com/dyj/tiktok/enums/PostStatusEnum.java | 49 ++++
.../dyj/tiktok/enums/PrivacyLevelEnum.java | 24 ++
.../com/dyj/tiktok/enums/TiktokScopeEnum.java | 29 +++
.../dyj/tiktok/enums/UploadSourceEnum.java | 21 ++
.../tiktok/handler/AbstractTikTokHandler.java | 29 +++
.../tiktok/handler/AccessTokenHandler.java | 32 +++
.../com/dyj/tiktok/handler/UserHandler.java | 23 ++
.../com/dyj/tiktok/handler/VideoHandler.java | 220 ++++++++++++++++++
pom.xml | 34 ++-
39 files changed, 1636 insertions(+), 31 deletions(-)
create mode 100644 dy-java-common/src/main/java/com/dyj/common/client/TikTokAuthClient.java
create mode 100644 dy-java-common/src/main/java/com/dyj/common/domain/DyError.java
create mode 100644 dy-java-common/src/main/java/com/dyj/common/domain/DyTikTokResult.java
create mode 100644 dy-java-common/src/main/java/com/dyj/common/domain/vo/AccessTikTokTokenVo.java
create mode 100644 dy-java-common/src/main/java/com/dyj/common/enums/DyTikTokPathEnum.java
create mode 100644 dy-java-common/src/main/java/com/dyj/common/interceptor/TikTokBodyTokenInterceptor.java
create mode 100644 dy-java-common/src/main/java/com/dyj/common/utils/FieldUtils.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/client/UserClient.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/client/VideoClient.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/domain/vo/InitUploadVideoReqVo.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/domain/vo/InitUploadVideoRespVo.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/domain/vo/QueryPostStatusRespVo.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/domain/vo/QueryVideoListVo.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/domain/vo/TikTokInfoVo.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/domain/vo/UploadImageReqVo.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/domain/vo/UploadImageRespVo.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/enums/PostModeEnum.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/enums/PostStatusEnum.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/enums/PrivacyLevelEnum.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/enums/TiktokScopeEnum.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/enums/UploadSourceEnum.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/handler/AbstractTikTokHandler.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/handler/AccessTokenHandler.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/handler/UserHandler.java
create mode 100644 dy-java-tiktok/src/main/java/com/dyj/tiktok/handler/VideoHandler.java
diff --git a/dy-java-common/pom.xml b/dy-java-common/pom.xml
index ce1397b..7480046 100644
--- a/dy-java-common/pom.xml
+++ b/dy-java-common/pom.xml
@@ -19,13 +19,19 @@
com.dtflys.forest
- forest-spring-boot-starter
+ forest-spring-boot3-starter
com.alibaba
fastjson
+
+
+ org.projectlombok
+ lombok
+
+
diff --git a/dy-java-common/src/main/java/com/dyj/common/client/TikTokAuthClient.java b/dy-java-common/src/main/java/com/dyj/common/client/TikTokAuthClient.java
new file mode 100644
index 0000000..2e74387
--- /dev/null
+++ b/dy-java-common/src/main/java/com/dyj/common/client/TikTokAuthClient.java
@@ -0,0 +1,19 @@
+package com.dyj.common.client;
+
+import com.dtflys.forest.annotation.BaseRequest;
+import com.dtflys.forest.annotation.Body;
+import com.dtflys.forest.annotation.Post;
+import com.dyj.common.domain.vo.AccessTikTokTokenVo;
+import com.dyj.common.interceptor.NoTokenInterceptor;
+
+@BaseRequest(baseURL = "${tikTokDomain}",interceptor = NoTokenInterceptor.class)
+public interface TikTokAuthClient {
+
+ /** 获取accessToken */
+ @Post(value = "${tikTokOauthAccessToken}")
+ AccessTikTokTokenVo getAccessToken(@Body("client_key") String clientKey, @Body("client_secret") String clientSecret, @Body("code") String code, @Body("grant_type") String grantType, @Body("redirect_uri") String redirectUri);
+
+ /** 刷新accessToken */
+ @Post(value = "${tikTokOauthAccessToken}")
+ AccessTikTokTokenVo refreshToken(@Body("client_key") String clientKey, @Body("client_secret") String clientSecret, @Body("grant_type") String grantType, @Body("refresh_token") String refreshToken);
+}
diff --git a/dy-java-common/src/main/java/com/dyj/common/domain/DyError.java b/dy-java-common/src/main/java/com/dyj/common/domain/DyError.java
new file mode 100644
index 0000000..922166c
--- /dev/null
+++ b/dy-java-common/src/main/java/com/dyj/common/domain/DyError.java
@@ -0,0 +1,14 @@
+package com.dyj.common.domain;
+
+import lombok.Data;
+
+@Data
+public class DyError {
+
+ private String code;
+
+ private String message;
+
+ private String log_id;
+
+}
diff --git a/dy-java-common/src/main/java/com/dyj/common/domain/DyTikTokResult.java b/dy-java-common/src/main/java/com/dyj/common/domain/DyTikTokResult.java
new file mode 100644
index 0000000..8eb4663
--- /dev/null
+++ b/dy-java-common/src/main/java/com/dyj/common/domain/DyTikTokResult.java
@@ -0,0 +1,14 @@
+package com.dyj.common.domain;
+
+import lombok.Data;
+
+@Data
+public class DyTikTokResult {
+ /**
+ * 返回对象
+ */
+ private T data;
+
+ private DyError error;
+
+}
diff --git a/dy-java-common/src/main/java/com/dyj/common/domain/query/UserInfoQuery.java b/dy-java-common/src/main/java/com/dyj/common/domain/query/UserInfoQuery.java
index a77adb3..50cdb0e 100644
--- a/dy-java-common/src/main/java/com/dyj/common/domain/query/UserInfoQuery.java
+++ b/dy-java-common/src/main/java/com/dyj/common/domain/query/UserInfoQuery.java
@@ -13,13 +13,11 @@ public class UserInfoQuery extends BaseQuery {
*/
protected String open_id;
- public String getOpen_id() {
- return open_id;
- }
-
public void setOpen_id(String open_id) {
this.open_id = open_id;
}
-
+ public String getOpen_id() {
+ return open_id;
+ }
}
diff --git a/dy-java-common/src/main/java/com/dyj/common/domain/vo/AccessTikTokTokenVo.java b/dy-java-common/src/main/java/com/dyj/common/domain/vo/AccessTikTokTokenVo.java
new file mode 100644
index 0000000..2f16b1e
--- /dev/null
+++ b/dy-java-common/src/main/java/com/dyj/common/domain/vo/AccessTikTokTokenVo.java
@@ -0,0 +1,67 @@
+package com.dyj.common.domain.vo;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import lombok.*;
+import lombok.experimental.Accessors;
+
+import java.io.Serial;
+import java.io.Serializable;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = true)
+public class AccessTikTokTokenVo extends BaseVo implements Serializable {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 授权用户唯一标识
+ */
+ @JSONField(name = "open_id")
+ private String openId;
+
+ /**
+ * 用户授权的作用域(Scope),使用逗号(,)分隔,开放平台几乎每个接口都需要特定的Scope。
+ */
+ private String scope;
+
+ /**
+ * 接口调用凭证
+ */
+ @JSONField(name = "access_token")
+ private String accessToken;
+
+ /**
+ * access_token接口调用凭证超时时间,单位(秒)
+ */
+ @JSONField(name = "expires_in")
+ private Long expiresIn;
+
+ /**
+ * 日志ID
+ */
+ @JSONField(name = "log_id")
+ private String logId;
+
+ /**
+ * 用户刷新access_token
+ */
+ @JSONField(name = "refresh_token")
+ private String refreshToken;
+
+ /**
+ * refresh_token凭证超时时间,单位(秒)
+ */
+ @JSONField(name = "refresh_expires_in")
+ private Long refreshExpiresIn;
+
+ /**
+ * token类型
+ */
+ @JSONField(name = "token_type")
+ private String tokenType;
+
+}
diff --git a/dy-java-common/src/main/java/com/dyj/common/enums/DyTikTokPathEnum.java b/dy-java-common/src/main/java/com/dyj/common/enums/DyTikTokPathEnum.java
new file mode 100644
index 0000000..c96cea3
--- /dev/null
+++ b/dy-java-common/src/main/java/com/dyj/common/enums/DyTikTokPathEnum.java
@@ -0,0 +1,68 @@
+package com.dyj.common.enums;
+
+public enum DyTikTokPathEnum {
+
+ /**
+ * 域名
+ */
+ DOMAIN("tikTokDomain", "https://open.tiktokapis.com/v2"),
+ /**
+ * 获取 access_token
+ */
+ OAUTH_ACCESS_TOKEN("tikTokOauthAccessToken", "/oauth/token/"),
+
+ /**
+ * 用户信息
+ */
+ USER_INFO("tikTokUserInfo", "/user/info/"),
+
+ /**
+ * 查询视频列表
+ */
+ QUERY_VIDEO_LIST("tikTokQueryVideoList", "/video/list/"),
+
+ /**
+ * 初始化上传视频
+ */
+ INIT_UPLOAD_VIDEO("tikTokInitUploadVideo", "/post/publish/inbox/video/init/"),
+
+ /**
+ * 上传图片
+ */
+ UPLOAD_IMAGE("tikTokUploadImage", "/post/publish/content/init/"),
+
+ QUERY_POST_STATUS("tikTokQueryPostStatus", "/post/publish/status/fetch/");
+
+ private String key;
+ private String value;
+
+ DyTikTokPathEnum(String key, String value) {
+ this.key = key;
+ this.value = value;
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getValue() {
+ return value;
+ }
+
+ public void setValue(String value) {
+ this.value = value;
+ }
+
+ public void setKey(String key) {
+ this.key = key;
+ }
+
+ public static String getValueByKey(String key) {
+ for (DyWebUrlPathEnum e : DyWebUrlPathEnum.values()) {
+ if (e.getKey().equals(key)) {
+ return e.getValue();
+ }
+ }
+ return null;
+ }
+}
diff --git a/dy-java-common/src/main/java/com/dyj/common/interceptor/ClientQueryTokenInterceptor.java b/dy-java-common/src/main/java/com/dyj/common/interceptor/ClientQueryTokenInterceptor.java
index 2d48e5b..d1aa584 100644
--- a/dy-java-common/src/main/java/com/dyj/common/interceptor/ClientQueryTokenInterceptor.java
+++ b/dy-java-common/src/main/java/com/dyj/common/interceptor/ClientQueryTokenInterceptor.java
@@ -18,7 +18,7 @@ import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.Objects;
@Component
diff --git a/dy-java-common/src/main/java/com/dyj/common/interceptor/ClientTokenInterceptor.java b/dy-java-common/src/main/java/com/dyj/common/interceptor/ClientTokenInterceptor.java
index a9333ff..16faaac 100644
--- a/dy-java-common/src/main/java/com/dyj/common/interceptor/ClientTokenInterceptor.java
+++ b/dy-java-common/src/main/java/com/dyj/common/interceptor/ClientTokenInterceptor.java
@@ -26,8 +26,8 @@ import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;
-import javax.annotation.PostConstruct;
-import javax.annotation.Resource;
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
import java.util.Objects;
@Component
diff --git a/dy-java-common/src/main/java/com/dyj/common/interceptor/SubscriptionTokenInterceptor.java b/dy-java-common/src/main/java/com/dyj/common/interceptor/SubscriptionTokenInterceptor.java
index 8490e3c..48390b2 100644
--- a/dy-java-common/src/main/java/com/dyj/common/interceptor/SubscriptionTokenInterceptor.java
+++ b/dy-java-common/src/main/java/com/dyj/common/interceptor/SubscriptionTokenInterceptor.java
@@ -22,7 +22,7 @@ import org.apache.commons.logging.LogFactory;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
-import javax.annotation.Resource;
+import jakarta.annotation.Resource;
import java.util.Objects;
/**
diff --git a/dy-java-common/src/main/java/com/dyj/common/interceptor/TikTokBodyTokenInterceptor.java b/dy-java-common/src/main/java/com/dyj/common/interceptor/TikTokBodyTokenInterceptor.java
new file mode 100644
index 0000000..0a017d3
--- /dev/null
+++ b/dy-java-common/src/main/java/com/dyj/common/interceptor/TikTokBodyTokenInterceptor.java
@@ -0,0 +1,62 @@
+package com.dyj.common.interceptor;
+
+import com.alibaba.fastjson.JSONObject;
+import com.dtflys.forest.exceptions.ForestRuntimeException;
+import com.dtflys.forest.http.ForestRequest;
+import com.dtflys.forest.http.ForestResponse;
+import com.dtflys.forest.interceptor.Interceptor;
+import com.dyj.common.domain.UserTokenInfo;
+import com.dyj.common.domain.query.UserInfoQuery;
+import com.dyj.common.service.IAgentTokenService;
+import com.dyj.common.utils.DyConfigUtils;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.springframework.stereotype.Component;
+
+import java.util.Objects;
+
+@Component
+public class TikTokBodyTokenInterceptor implements Interceptor