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  }