1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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
}