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 }