diff --git a/client.go b/client.go index c9d38b2..0040968 100644 --- a/client.go +++ b/client.go @@ -9,6 +9,7 @@ import ( "io/ioutil" "net/http" "net/http/httputil" + "time" ) // NewClient returns new Client struct @@ -45,6 +46,7 @@ func (c *Client) GetAccessToken() (*TokenResponse, error) { // Set Token fur current Client if t.Token != "" { c.Token = &t + c.tokenExpiresAt = time.Now().Add(time.Duration(t.ExpiresIn) * time.Second) } return &t, err @@ -55,6 +57,7 @@ func (c *Client) SetAccessToken(token string) error { c.Token = &TokenResponse{ Token: token, } + c.tokenExpiresAt = time.Unix(0, 0) return nil } @@ -124,7 +127,7 @@ func (c *Client) Send(req *http.Request, v interface{}) error { // client.Token will be updated when changed func (c *Client) SendWithAuth(req *http.Request, v interface{}) error { if c.Token != nil { - if c.Token.ExpiresIn < RequestNewTokenBeforeExpiresIn { + if !c.tokenExpiresAt.IsZero() && time.Until(c.tokenExpiresAt) < RequestNewTokenBeforeExpiresIn { // c.Token will be updated in GetAccessToken call if _, err := c.GetAccessToken(); err != nil { return err diff --git a/types.go b/types.go index 2f7cddc..d9b6737 100644 --- a/types.go +++ b/types.go @@ -15,7 +15,7 @@ const ( APIBaseLive = "https://api.paypal.com" // RequestNewTokenBeforeExpiresIn is used by SendWithAuth and try to get new Token when it's about to expire - RequestNewTokenBeforeExpiresIn = 60 + RequestNewTokenBeforeExpiresIn = time.Duration(60) * time.Second ) // Possible values for `no_shipping` in InputFields @@ -107,12 +107,13 @@ type ( // Client represents a Paypal REST API Client Client struct { - client *http.Client - ClientID string - Secret string - APIBase string - Log io.Writer // If user set log file name all requests will be logged there - Token *TokenResponse + client *http.Client + ClientID string + Secret string + APIBase string + Log io.Writer // If user set log file name all requests will be logged there + Token *TokenResponse + tokenExpiresAt time.Time } // CreditCard struct