79 lines
2.2 KiB
Go
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
|
|
}
|