54 lines
1.6 KiB
Go
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
|
|
}
|