github.com/chanxuehong/wechat@v0.0.0-20230222024006-36f0325263cd/oauth2/client.go (about) 1 package oauth2 2 3 import ( 4 "errors" 5 "net/http" 6 7 "github.com/chanxuehong/wechat/util" 8 ) 9 10 type Client struct { 11 Endpoint Endpoint 12 13 // TokenStorage 和 Token 两个字段正常情况下只用指定一个, 如果两个同时被指定了, 优先使用 TokenStorage 14 TokenStorage TokenStorage 15 Token *Token // Client 自动将最新的 Token 更新到此字段, 不管 Token 字段一开始是否被指定!!! 16 17 HttpClient *http.Client // 如果 HttpClient == nil 则默认用 util.DefaultHttpClient 18 } 19 20 func (clt *Client) httpClient() *http.Client { 21 if clt.HttpClient != nil { 22 return clt.HttpClient 23 } 24 return util.DefaultHttpClient 25 } 26 27 // GetToken 获取 Token, autoRefresh 为 true 时如果 Token 过期则自动刷新. 28 func (clt *Client) GetToken(autoRefresh bool) (tk *Token, err error) { 29 if clt.TokenStorage != nil { 30 if tk, err = clt.TokenStorage.Token(); err != nil { 31 return 32 } 33 if tk == nil { 34 err = errors.New("incorrect TokenStorage.Token implementation") 35 return 36 } 37 clt.Token = tk // update local 38 } else { 39 tk = clt.Token 40 if tk == nil { 41 err = errors.New("nil TokenStorage and nil Token") 42 return 43 } 44 } 45 if autoRefresh && tk.Expired() { 46 return clt.RefreshToken(tk.RefreshToken) 47 } 48 return 49 } 50 51 func (clt *Client) putToken(tk *Token) (err error) { 52 if clt.TokenStorage != nil { 53 if err = clt.TokenStorage.PutToken(tk); err != nil { 54 return 55 } 56 } 57 clt.Token = tk 58 return 59 }