|
|
@@ -3,11 +3,14 @@ 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() |
|
|
|
|
|
|
|
func GetWechatAccessToken() string { |
|
|
|
token, _ := redis_client.Get(redis_key.WechatAccessTokenKey()) |
|
|
|
if token != "" { |
|
|
@@ -17,14 +20,37 @@ func GetWechatAccessToken() string { |
|
|
|
live, _ := redis_client.TTL(redis_key.WechatAccessTokenKey()) |
|
|
|
//refresh wechat access token when expire time less than 5 minutes |
|
|
|
if live > 0 && live < 300 { |
|
|
|
refreshAccessTokenCache() |
|
|
|
refreshAccessToken() |
|
|
|
} |
|
|
|
return token |
|
|
|
} |
|
|
|
return refreshAccessTokenCache() |
|
|
|
return refreshAndGetAccessToken() |
|
|
|
} |
|
|
|
|
|
|
|
func refreshAccessToken() { |
|
|
|
if ok := accessTokenLock.Lock(redis_key.AccessTokenLockKey(), 3*time.Second); ok { |
|
|
|
defer accessTokenLock.UnLock(redis_key.AccessTokenLockKey()) |
|
|
|
callAccessTokenAndUpdateCache() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
func refreshAndGetAccessToken() string { |
|
|
|
if ok := accessTokenLock.LockWithWait(redis_key.AccessTokenLockKey(), 3*time.Second, 3*time.Second); ok { |
|
|
|
defer accessTokenLock.UnLock(redis_key.AccessTokenLockKey()) |
|
|
|
token, _ := redis_client.Get(redis_key.WechatAccessTokenKey()) |
|
|
|
if token != "" { |
|
|
|
if token == EMPTY_REDIS_VAL { |
|
|
|
return "" |
|
|
|
} |
|
|
|
return token |
|
|
|
} |
|
|
|
return callAccessTokenAndUpdateCache() |
|
|
|
} |
|
|
|
return "" |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
func refreshAccessTokenCache() string { |
|
|
|
func callAccessTokenAndUpdateCache() string { |
|
|
|
r := callAccessToken() |
|
|
|
|
|
|
|
var token string |
|
|
@@ -36,9 +62,6 @@ func refreshAccessTokenCache() string { |
|
|
|
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 |
|
|
|
|
|
|
|
} |