1
0
mirror of https://github.com/silenceper/wechat.git synced 2026-03-01 00:35:26 +08:00

Compare commits

...

2 Commits

+13
View File
@@ -105,6 +105,7 @@ type StableAccessToken struct {
appSecret string appSecret string
cacheKeyPrefix string cacheKeyPrefix string
cache cache.Cache cache cache.Cache
accessTokenLock *sync.Mutex
} }
// NewStableAccessToken new StableAccessToken // NewStableAccessToken new StableAccessToken
@@ -117,6 +118,7 @@ func NewStableAccessToken(appID, appSecret, cacheKeyPrefix string, cache cache.C
appSecret: appSecret, appSecret: appSecret,
cache: cache, cache: cache,
cacheKeyPrefix: cacheKeyPrefix, cacheKeyPrefix: cacheKeyPrefix,
accessTokenLock: new(sync.Mutex),
} }
} }
@@ -135,6 +137,17 @@ func (ak *StableAccessToken) GetAccessTokenContext(ctx context.Context) (accessT
} }
} }
// 加上lock,是为了防止在并发获取token时,cache刚好失效,导致从微信服务器上获取到不同token
ak.accessTokenLock.Lock()
defer ak.accessTokenLock.Unlock()
// 双检,防止重复从微信服务器获取
if val := ak.cache.Get(accessTokenCacheKey); val != nil {
if accessToken = val.(string); accessToken != "" {
return
}
}
// cache失效,从微信服务器获取 // cache失效,从微信服务器获取
var resAccessToken ResAccessToken var resAccessToken ResAccessToken
resAccessToken, err = ak.GetAccessTokenDirectly(ctx, false) resAccessToken, err = ak.GetAccessTokenDirectly(ctx, false)