|
- package wechat
-
- import (
- "code.gitea.io/gitea/modules/redis/redis_client"
- "code.gitea.io/gitea/modules/redis/redis_key"
- "code.gitea.io/gitea/modules/redis/redis_lock"
- "time"
- )
-
- const EMPTY_REDIS_VAL = "Nil"
-
- var accessTokenLock = redis_lock.NewDistributeLock(redis_key.AccessTokenLockKey())
-
- func GetWechatAccessToken() string {
- token, _ := redis_client.Get(redis_key.WechatAccessTokenKey())
- if token != "" {
- if token == EMPTY_REDIS_VAL {
- return ""
- }
- live, _ := redis_client.TTL(redis_key.WechatAccessTokenKey())
- //refresh wechat access token when expire time less than 5 minutes
- if live > 0 && live < 300 {
- refreshAccessToken()
- }
- return token
- }
- return refreshAndGetAccessToken()
- }
-
- func refreshAccessToken() {
- if ok := accessTokenLock.Lock(3 * time.Second); ok {
- defer accessTokenLock.UnLock()
- callAccessTokenAndUpdateCache()
- }
- }
-
- func refreshAndGetAccessToken() string {
- if ok := accessTokenLock.LockWithWait(3*time.Second, 3*time.Second); ok {
- defer accessTokenLock.UnLock()
- token, _ := redis_client.Get(redis_key.WechatAccessTokenKey())
- if token != "" {
- if token == EMPTY_REDIS_VAL {
- return ""
- }
- return token
- }
- return callAccessTokenAndUpdateCache()
- }
- return ""
-
- }
-
- func callAccessTokenAndUpdateCache() string {
- r := callAccessToken()
-
- var token string
- if r != nil {
- token = r.Access_token
- }
-
- if token == "" {
- redis_client.Setex(redis_key.WechatAccessTokenKey(), EMPTY_REDIS_VAL, 10*time.Second)
- return ""
- }
- redis_client.Setex(redis_key.WechatAccessTokenKey(), token, time.Duration(r.Expires_in)*time.Second)
- return token
- }
|