yunzmall_token.go 1.8 KB
package yunzmall

import (
	"context"
	"github.com/gogf/gf/encoding/gjson"
	"github.com/gogf/gf/errors/gerror"
	"github.com/gogf/gf/frame/g"
	"github.com/gogf/gf/os/gtime"
	"github.com/gogf/gf/util/gconv"
)

type TokenGetRes struct {
	Code int `json:"code"`
	Data struct {
		Token     string `json:"token"`
		ExpiresAt int64  `json:"expiresAt"`
	} `json:"data"`
	Msg string `json:"msg"`
}

func (s *Client) GetToken(ctx context.Context) (res *TokenGetRes, err error) {
	var method = "/app/application/getToken"
	result, err := s.post(ctx, method, g.Map{
		"app_key":    s.AppKey,
		"app_secret": s.AppSecret,
	}, true)
	if err != nil {
		return
	}
	err = gjson.New(result).Scan(&res)
	if err != nil {
		return
	}
	return
}

func (s *Client) RefreshToken(ctx context.Context) (res string, err error) {
	var conn = g.Redis().Conn()
	defer func() {
		_ = conn.Close()
	}()
	_, _ = conn.DoVar("SELECT", s.DB)
	var result *TokenGetRes
	result, err = s.GetToken(ctx)
	if err != nil {
		err = gerror.New("获取token失败")
		return
	}
	if result.Code != 0 {
		err = gerror.New("获取token失败")
		return
	}
	res = result.Data.Token
	_, _ = conn.Do("HMSET", CacheKey+gconv.String(s.Source), "Token", result.Data.Token, "ExpiresAt", result.Data.ExpiresAt)
	return
}

type TokenCacheRes struct {
	Token     string
	ExpiresAt int64
}

func (s *Client) AccessToken(ctx context.Context) (res string, err error) {
	var conn = g.Redis().Conn()
	defer func() {
		_ = conn.Close()
	}()
	_, _ = conn.DoVar("SELECT", s.DB)
	cache, _ := conn.DoVar("HGETALL", CacheKey+gconv.String(s.Source))
	if cache.IsEmpty() {
		return s.RefreshToken(ctx)
	}
	var cacheRes *TokenCacheRes
	_ = gjson.New(cache).Scan(&cacheRes)
	if cacheRes.ExpiresAt < gtime.TimestampMilli() {
		return s.RefreshToken(ctx)
	}
	res = cacheRes.Token
	return
}