bindbox-game/internal/services/services_miniprogram/miniprogram_access_token.go
2025-10-27 11:05:03 +08:00

54 lines
1.6 KiB
Go

package services_miniprogram
import (
"fmt"
"time"
"mini-chat/internal/pkg/core"
"mini-chat/internal/pkg/miniprogram"
"mini-chat/internal/repository/mysql/model"
"go.uber.org/zap"
"gorm.io/gorm"
)
func (s *service) GetAccessToken(appID, appSecret string, ctx core.Context) (string, error) {
info, err := s.readDB.MiniProgramAccessToken.WithContext(ctx.RequestContext()).
Where(s.readDB.MiniProgramAccessToken.AppID.Eq(appID)).
Where(s.readDB.MiniProgramAccessToken.ExpiredAt.Gte(time.Now())).First()
if err != nil && err != gorm.ErrRecordNotFound {
return "", err
}
accessToken := ""
if err == gorm.ErrRecordNotFound {
// 生成 access_token
accessTokenResponse := new(miniprogram.AccessTokenResponse)
if err := miniprogram.GetAccessToken(appID, appSecret, accessTokenResponse); err != nil {
s.logger.Error("GetAccessToken failed", zap.Error(err))
return "", err
}
if accessTokenResponse.AccessToken == "" {
return "", fmt.Errorf("access_token is empty")
}
// 保存 access_token
accessTokenData := new(model.MiniProgramAccessToken)
accessTokenData.AppID = appID
accessTokenData.AccessToken = accessTokenResponse.AccessToken
accessTokenData.CreatedAt = time.Now()
accessTokenData.ExpiredAt = time.Now().Add(time.Duration(accessTokenResponse.ExpiresIn) * time.Second)
if err := s.writeDB.MiniProgramAccessToken.WithContext(ctx.RequestContext()).Create(accessTokenData); err != nil {
return "", err
}
accessToken = accessTokenResponse.AccessToken
} else {
accessToken = info.AccessToken
}
return accessToken, nil
}