ai_scheduler/internal/biz/handle/qywx/auth.go

83 lines
1.9 KiB
Go

package qywx
import (
"ai_scheduler/internal/config"
"ai_scheduler/internal/data/constants"
"ai_scheduler/internal/pkg/l_request"
"ai_scheduler/utils"
"context"
"encoding/json"
"errors"
"fmt"
"net/http"
"time"
"github.com/redis/go-redis/v9"
)
type Auth struct {
redis *redis.Client
cfg *config.Config
}
func NewAuth(cfg *config.Config, redis *utils.Rdb) *Auth {
return &Auth{
redis: redis.Rdb,
cfg: cfg,
}
}
func (a *Auth) GetAccessToken(ctx context.Context, corpid string, corpsecret string) (authInfo *AuthInfo, err error) {
if corpid == "" {
return nil, errors.New("corpid is empty")
}
accessToken := a.redis.Get(ctx, a.getKey(corpsecret)).Val()
var expire time.Duration
if accessToken == "" {
authRes, _err := a.getNewAccessToken(ctx, corpid, corpsecret)
if _err != nil {
return nil, _err
}
expire = time.Duration(authRes.ExpiresIn-60) * time.Second
err = a.redis.SetEx(ctx, a.getKey(corpsecret), authRes.AccessToken, expire).Err()
if err != nil {
return
}
accessToken = authRes.AccessToken
} else {
expire, _ = a.redis.TTL(ctx, a.getKey(corpsecret)).Result()
}
return &AuthInfo{
Corpid: corpid,
Corpsecret: corpsecret,
AccessToken: accessToken,
Expire: expire,
}, nil
}
func (a *Auth) getKey(corpsecret string) string {
return a.cfg.Redis.Key + ":" + constants.QywxAuthBaseKeyPrefix + ":" + corpsecret
}
func (a *Auth) getNewAccessToken(ctx context.Context, corpid string, corpsecret string) (auth AuthRes, err error) {
if corpid == "" || corpsecret == "" {
err = errors.New("corpid or corpsecret is empty")
return
}
req := l_request.Request{
Method: http.MethodGet,
Url: "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpid + "&corpsecret=" + corpsecret,
}
res, err := req.Send()
if err != nil {
return
}
err = json.Unmarshal(res.Content, &auth)
if auth.Errcode != 0 {
err = fmt.Errorf("请求失败:%s", auth.Errmsg)
return
}
return
}