Files
data-engine/service/tencent/oauth_service.go
2026-05-06 16:19:22 +08:00

79 lines
2.2 KiB
Go

package tencent
import (
"context"
dto "dataengine/model/dto/tencent"
"encoding/json"
"fmt"
"io"
"net/http"
"github.com/gogf/gf/v2/frame/g"
)
type oauthService struct{}
var OauthService = new(oauthService)
// RefreshToken 刷新腾讯广告Token
func (s *oauthService) RefreshToken(ctx context.Context, req *dto.RefreshTokenReq) (res *dto.RefreshTokenRes, err error) {
// 如果请求中没有提供参数,则从配置文件读取
clientID := req.ClientID
clientSecret := req.ClientSecret
refreshToken := req.RefreshToken
if clientID == "" || clientSecret == "" || refreshToken == "" {
clientID = g.Cfg().MustGet(ctx, "tencent.oauth.client_id").String()
clientSecret = g.Cfg().MustGet(ctx, "tencent.oauth.client_secret").String()
refreshToken = g.Cfg().MustGet(ctx, "tencent.oauth.refresh_token").String()
}
url := fmt.Sprintf("https://api.e.qq.com/oauth/refresh_token?client_id=%s&client_secret=%s&refresh_token=%s",
clientID, clientSecret, refreshToken)
httpReq, err := http.NewRequestWithContext(ctx, "GET", url, nil)
if err != nil {
return nil, fmt.Errorf("创建请求失败: %w", err)
}
client := &http.Client{}
resp, err := client.Do(httpReq)
if err != nil {
return nil, fmt.Errorf("请求失败: %w", err)
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return nil, fmt.Errorf("读取响应失败: %w", err)
}
var result struct {
Code int `json:"code"`
Message string `json:"message"`
Data struct {
AccessToken string `json:"access_token"`
RefreshToken string `json:"refresh_token"`
AccessTokenExpiresIn int64 `json:"access_token_expires_in"`
RefreshTokenExpiresIn int64 `json:"refresh_token_expires_in"`
} `json:"data"`
}
if err := json.Unmarshal(body, &result); err != nil {
return nil, fmt.Errorf("解析响应失败: %w", err)
}
if result.Code != 0 {
return nil, fmt.Errorf("API错误: code=%d, message=%s", result.Code, result.Message)
}
res = &dto.RefreshTokenRes{
AccessToken: result.Data.AccessToken,
RefreshToken: result.Data.RefreshToken,
AccessTokenExpiresIn: result.Data.AccessTokenExpiresIn,
RefreshTokenExpiresIn: result.Data.RefreshTokenExpiresIn,
}
return res, nil
}