Files
2025-11-21 09:09:09 +08:00

155 lines
3.9 KiB
Go

package tiktok_api
import (
"encoding/json"
"errors"
doudian_sdk "git.rosy.net.cn/baseapi/platformapi/tiktok_shop/sdk-golang/core"
"git.rosy.net.cn/jx-callback/globals"
"sync"
"time"
)
type API struct {
appKey string
appSecret string
accessToken string
refreshToken string
expiresIn int64 // 当前时间的七天内为有效期
locker sync.RWMutex
accessTokenObj *doudian_sdk.AccessToken // 存储数据库
}
func New(appKey, appSecret, accessToken string) *API {
var access *doudian_sdk.AccessToken
doudian_sdk.GlobalConfig.AppKey = appKey
doudian_sdk.GlobalConfig.AppSecret = appSecret
if accessToken != "" {
if err := json.Unmarshal([]byte(accessToken), &access); err != nil {
globals.SugarLogger.Debug("accessToken init err :", err)
return nil
}
api := &API{
appKey: appKey,
appSecret: appSecret,
accessToken: access.AccessToken,
refreshToken: access.RefreshToken,
expiresIn: access.ExpiresIn,
accessTokenObj: access,
}
if access.ExpiresIn < time.Now().Unix() {
api.RefreshToken()
}
return api
}
return &API{
appKey: appKey,
appSecret: appSecret,
}
}
func (a *API) GetToken() string {
if a.expiresIn != 0 && a.expiresIn > time.Now().Unix() && a.accessToken != "" {
return a.accessToken
} else {
if _, err := a.RefreshToken(); err != nil {
globals.SugarLogger.Debug("Tiktok RefreshToken Err : ", err)
return ""
}
return a.accessToken
}
}
// CreateToken 创建token只有第一次授权或者更新授权才需要,其他时候直接刷新就可以啦
func (a *API) CreateToken(code string) (*doudian_sdk.CreateTokenData, error) {
doudian_sdk.GlobalConfig.AppKey = a.appKey
doudian_sdk.GlobalConfig.AppSecret = a.appSecret
buildParam := &doudian_sdk.BuildAccessTokenParam{
Code: code,
ShopId: 0,
Config: nil,
}
access, err := doudian_sdk.BuildAccessToken(buildParam)
if err != nil {
return nil, err
}
a.accessToken = access.AccessToken
a.refreshToken = access.RefreshToken
a.expiresIn = time.Now().Unix() + access.ExpiresIn
a.accessTokenObj = access
access.CreateTokenData.ExpiresIn = a.expiresIn
return &access.CreateTokenData, nil
}
// RefreshToken 刷新token
func (a *API) RefreshToken() (*doudian_sdk.CreateTokenData, error) {
doudian_sdk.GlobalConfig.AppKey = a.appKey
doudian_sdk.GlobalConfig.AppSecret = a.appSecret
refresh := doudian_sdk.NewRefreshTokenRequest()
refresh.GetParam().RefreshToken = a.refreshToken
refresh.GetParam().GrantType = "refresh_token"
createToken, err := refresh.Execute(a.accessTokenObj)
if err != nil {
return nil, err
}
if createToken.Code != RequestSuccessCode {
return nil, errors.New(createToken.SubMsg + ":" + createToken.LogId)
}
a.accessToken = createToken.Data.AccessToken
a.refreshToken = createToken.Data.RefreshToken
a.expiresIn = time.Now().Unix() + createToken.Data.ExpiresIn
a.accessTokenObj.CreateTokenData = createToken.Data
// 不要
createToken.Data.ExpiresIn = a.expiresIn
return &createToken.Data, nil
}
func (a *API) SetToken(token string) {
a.locker.Lock()
defer a.locker.Unlock()
a.accessToken = token
}
func (a *API) SetRefreshToken(token string) {
a.locker.Lock()
defer a.locker.Unlock()
a.refreshToken = token
}
func (a *API) SetExpiresIn(expiresIn int64) {
a.locker.Lock()
defer a.locker.Unlock()
a.expiresIn = expiresIn
}
func (a *API) SetAcctokenObj(acctokenObj *doudian_sdk.AccessToken) {
a.locker.Lock()
defer a.locker.Unlock()
a.accessTokenObj = acctokenObj
}
// GetAppId 获取appid
func (a *API) GetAppId() string {
a.locker.Lock()
defer a.locker.Unlock()
return a.appKey
}
func (a *API) SetAccessToken(token string) {
a.locker.Lock()
defer a.locker.Unlock()
var access *doudian_sdk.AccessToken
if err := json.Unmarshal([]byte(token), &access); err != nil {
return
}
a.accessToken = access.AccessToken
a.refreshToken = access.RefreshToken
a.expiresIn = access.ExpiresIn
a.accessTokenObj = access
return
}