91 lines
2.1 KiB
Go
91 lines
2.1 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
|
|
}
|
|
|
|
type UploadMediaRes struct {
|
|
Errcode int `json:"errcode"`
|
|
Errmsg string `json:"errmsg"`
|
|
Type string `json:"type"`
|
|
MediaId string `json:"media_id"`
|
|
CreatedAt string `json:"created_at"`
|
|
}
|