diff --git a/src/main/java/vip/gadfly/tiktok/core/enums/TtOpApiUrl.java b/src/main/java/vip/gadfly/tiktok/core/enums/TtOpApiUrl.java index 198668cc9db3bb85d977b9c782bc90dd0824c13b..eef152d8d7a10af6377ae7202f6e324d848ea0fa 100644 --- a/src/main/java/vip/gadfly/tiktok/core/enums/TtOpApiUrl.java +++ b/src/main/java/vip/gadfly/tiktok/core/enums/TtOpApiUrl.java @@ -107,6 +107,18 @@ public interface TtOpApiUrl { * oauth2静默授权的url链接. */ CONNECT_SILENT_OAUTH2_AUTHORIZE_URL(TIKTOK_SILENT_OPEN_API_HOST_URL, "/oauth/authorize/v2/?client_key=%s&redirect_uri=%s&response_type=code&scope=%s&state=%s"), + /** + * 验券准备 + */ + CERTIFICATE_URL(TIKTOK_OPEN_API_HOST_URL, "/goodlife/v1/fulfilment/certificate/prepare/?code=%s&encrypted_data=%s"), + /** + * 开始验券 + */ + CERTIFICATE_VERIFY_URL(TIKTOK_OPEN_API_HOST_URL, "https://open.douyin.com/goodlife/v1/fulfilment/certificate/verify/"), + /** + * 验券历史 + */ + CERTIFICATE_RECORD_URL(TIKTOK_OPEN_API_HOST_URL, "https://open.douyin.com/goodlife/v1/fulfilment/certificate/verify_record/query/?size=%s&cursor=%s&account_id=%s"), ; private final String prefix; diff --git a/src/main/java/vip/gadfly/tiktok/open/api/TtOpCheckService.java b/src/main/java/vip/gadfly/tiktok/open/api/TtOpCheckService.java new file mode 100644 index 0000000000000000000000000000000000000000..091d48c0f167fe6da2d401bb6a81b5a7ee3165fb --- /dev/null +++ b/src/main/java/vip/gadfly/tiktok/open/api/TtOpCheckService.java @@ -0,0 +1,34 @@ +package vip.gadfly.tiktok.open.api; + +import vip.gadfly.tiktok.open.bean.check.TtOpPrepareResult; +import vip.gadfly.tiktok.open.bean.userinfo.TtOpUserInfoResult; + +import java.util.List; + +/** + * wangyongjin + */ +public interface TtOpCheckService { + + /** + * 扫描核销预处理 + * @param code 核销码 + * @param encryptedData 二维码扫描 + */ + TtOpPrepareResult prepare(String code,String encryptedData); + + /** + * 验劵 + * @param poiId 门店id + * @param encryptedCode 返回的抖音券码 + */ + TtOpPrepareResult verify(String poiId, List encryptedCode); + + /** + * 验劵 + * @param cursor 游标,传前一页最后一条记录的游标(首页传0) + * @param size 页大小,取值范围1~20 + * @param accountId 企业号商家总店id(验券准备接口中返回) + */ + TtOpPrepareResult verifyRecord(Integer cursor, Integer size,String accountId); +} diff --git a/src/main/java/vip/gadfly/tiktok/open/api/impl/TtOpCheckServiceImpl.java b/src/main/java/vip/gadfly/tiktok/open/api/impl/TtOpCheckServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..319aad34e8f7da4c826784fe6665eceebdf30870 --- /dev/null +++ b/src/main/java/vip/gadfly/tiktok/open/api/impl/TtOpCheckServiceImpl.java @@ -0,0 +1,68 @@ +package vip.gadfly.tiktok.open.api.impl; + +import com.google.common.collect.LinkedListMultimap; +import com.google.common.collect.Multimap; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import vip.gadfly.tiktok.config.TtOpConfigStorage; +import vip.gadfly.tiktok.core.enums.TtOpTicketType; +import vip.gadfly.tiktok.open.api.TtOpCheckService; +import vip.gadfly.tiktok.open.bean.check.TtOpPrepareResult; +import vip.gadfly.tiktok.open.bean.check.TtOpVerifyRequest; +import vip.gadfly.tiktok.open.common.ITtOpBaseService; + +import java.util.List; +import java.util.UUID; + +import static vip.gadfly.tiktok.core.enums.TtOpApiUrl.OAuth2.*; + +/** + * wangyongjin + */ +@Slf4j +@RequiredArgsConstructor +public class TtOpCheckServiceImpl implements TtOpCheckService { + + private final ITtOpBaseService ttOpBaseService; + + protected TtOpConfigStorage getTtOpConfigStorage() { + return this.ttOpBaseService.getTtOpConfigStorage(); + } + + @Override + public TtOpPrepareResult prepare(String code,String encryptedData) { + String rawUrl = CERTIFICATE_URL.getUrl(getTtOpConfigStorage()); + String accessToken = this.ttOpBaseService.getTicket(TtOpTicketType.CLIENT,false); + Multimap headers = LinkedListMultimap.create(); + headers.put("Content-Type", "application/json"); + headers.put("access-token",accessToken); + String url = String.format(rawUrl, code, encryptedData); + return this.ttOpBaseService.getWithHeader(url, headers,TtOpPrepareResult.class); + } + + @Override + public TtOpPrepareResult verify(String poiId, List encryptedCode) { + String rawUrl = CERTIFICATE_VERIFY_URL.getUrl(getTtOpConfigStorage()); + String accessToken = this.ttOpBaseService.getTicket(TtOpTicketType.CLIENT,false); + TtOpVerifyRequest request = new TtOpVerifyRequest() + .setVerifyToken(UUID.randomUUID().toString()) + .setPoiId(poiId) + .setEncryptedCodes(encryptedCode) + ; + Multimap headers = LinkedListMultimap.create(); + headers.put("Content-Type", "application/x-www-form-urlencoded"); + headers.put("access-token",accessToken); + return this.ttOpBaseService.postWithHeaders(rawUrl, headers, request, TtOpPrepareResult.class); + } + + @Override + public TtOpPrepareResult verifyRecord(Integer cursor, Integer size,String accountId) { + String rawUrl = CERTIFICATE_RECORD_URL.getUrl(getTtOpConfigStorage()); + String accessToken = this.ttOpBaseService.getTicket(TtOpTicketType.CLIENT,false); + Multimap headers = LinkedListMultimap.create(); + headers.put("Content-Type", "application/json"); + headers.put("access-token",accessToken); + String url = String.format(rawUrl, size, cursor,accountId); + return this.ttOpBaseService.getWithHeader(url, headers,TtOpPrepareResult.class); + } +} diff --git a/src/main/java/vip/gadfly/tiktok/open/bean/check/TtOpPrepareResult.java b/src/main/java/vip/gadfly/tiktok/open/bean/check/TtOpPrepareResult.java new file mode 100644 index 0000000000000000000000000000000000000000..1cde4bd0c0900ba3e37c47ae9faca6a935bf8a99 --- /dev/null +++ b/src/main/java/vip/gadfly/tiktok/open/bean/check/TtOpPrepareResult.java @@ -0,0 +1,13 @@ +package vip.gadfly.tiktok.open.bean.check; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import vip.gadfly.tiktok.open.common.TtOpBaseResult; + + +@Data +@EqualsAndHashCode(callSuper = true) +public class TtOpPrepareResult extends TtOpBaseResult { + + +} diff --git a/src/main/java/vip/gadfly/tiktok/open/bean/check/TtOpVerifyRequest.java b/src/main/java/vip/gadfly/tiktok/open/bean/check/TtOpVerifyRequest.java new file mode 100644 index 0000000000000000000000000000000000000000..7f1f0eeb4d084c1f0a524e2be1cbb3f524dc931d --- /dev/null +++ b/src/main/java/vip/gadfly/tiktok/open/bean/check/TtOpVerifyRequest.java @@ -0,0 +1,39 @@ +package vip.gadfly.tiktok.open.bean.check; + +import com.alibaba.fastjson.annotation.JSONField; +import com.fasterxml.jackson.annotation.JsonAlias; +import com.fasterxml.jackson.annotation.JsonProperty; +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.experimental.Accessors; +import vip.gadfly.tiktok.open.common.TtOpBaseParam; + +import java.util.List; + +@Data +@Accessors(chain = true) +@EqualsAndHashCode(callSuper = true) +public class TtOpVerifyRequest extends TtOpBaseParam { + + + @JSONField(name = "verify_token") + @JsonAlias("verify_token") + @JsonProperty("verify_token") + @SerializedName("verify_token") + private String verifyToken; + + @JSONField(name = "poi_id") + @JsonAlias("poi_id") + @JsonProperty("poi_id") + @SerializedName("poi_id") + private String poiId; + + + @JSONField(name = "encrypted_codes") + @JsonAlias("encrypted_codes") + @JsonProperty("encrypted_codes") + @SerializedName("encrypted_codes") + private List encryptedCodes; + +} diff --git a/src/main/java/vip/gadfly/tiktok/open/common/AbstractTtOpApiBase.java b/src/main/java/vip/gadfly/tiktok/open/common/AbstractTtOpApiBase.java index 5bb01930dfc4071a4d70fd13ab0f8cb48ae57038..c2a77e737d1b4eccbb78627d5638d3ddfff36b47 100644 --- a/src/main/java/vip/gadfly/tiktok/open/common/AbstractTtOpApiBase.java +++ b/src/main/java/vip/gadfly/tiktok/open/common/AbstractTtOpApiBase.java @@ -18,9 +18,11 @@ import vip.gadfly.tiktok.core.http.impl.OkHttpTtOpHttpClient; import vip.gadfly.tiktok.core.util.TtOpConfigStorageHolder; import vip.gadfly.tiktok.core.util.crypto.MD5; import vip.gadfly.tiktok.core.util.crypto.SignUtil; +import vip.gadfly.tiktok.open.api.TtOpCheckService; import vip.gadfly.tiktok.open.api.TtOpOAuth2Service; import vip.gadfly.tiktok.open.api.TtOpUserInfoService; import vip.gadfly.tiktok.open.api.TtOpVideoService; +import vip.gadfly.tiktok.open.api.impl.TtOpCheckServiceImpl; import vip.gadfly.tiktok.open.api.impl.TtOpOauth2ServiceImpl; import vip.gadfly.tiktok.open.api.impl.TtOpUserInfoServiceImpl; import vip.gadfly.tiktok.open.api.impl.TtOpVideoServiceImpl; @@ -62,7 +64,9 @@ public abstract class AbstractTtOpApiBase implements ITtOpBaseService, IRetryabl @Getter @Setter private TtOpVideoService ttOpVideoService = new TtOpVideoServiceImpl(this); - + @Getter + @Setter + private TtOpCheckService ttOpCheckService = new TtOpCheckServiceImpl(this); private Map configStorageMap; public AbstractTtOpApiBase() { diff --git a/src/main/java/vip/gadfly/tiktok/open/common/ITtOpBaseService.java b/src/main/java/vip/gadfly/tiktok/open/common/ITtOpBaseService.java index cb83c6fc9853715499f61b989557b3a6d0bc57bd..7d6d8165a126f7fe5f357cf21dd52f4bb2701bba 100644 --- a/src/main/java/vip/gadfly/tiktok/open/common/ITtOpBaseService.java +++ b/src/main/java/vip/gadfly/tiktok/open/common/ITtOpBaseService.java @@ -3,6 +3,7 @@ package vip.gadfly.tiktok.open.common; import com.google.common.collect.Multimap; import vip.gadfly.tiktok.config.TtOpConfigStorage; import vip.gadfly.tiktok.core.enums.TtOpTicketType; +import vip.gadfly.tiktok.open.api.TtOpCheckService; import vip.gadfly.tiktok.open.api.TtOpOAuth2Service; import vip.gadfly.tiktok.open.api.TtOpUserInfoService; import vip.gadfly.tiktok.open.api.TtOpVideoService; @@ -174,4 +175,8 @@ public interface ITtOpBaseService { TtOpVideoService getTtOpVideoService(); void setTtOpVideoService(TtOpVideoService ttOpVideoService); + + TtOpCheckService getTtOpCheckService(); + + void setTtOpCheckService(TtOpCheckService ttOpCheckService); }