1
0
mirror of https://github.com/silenceper/wechat.git synced 2026-02-16 18:52:27 +08:00

微信稳定性获取 access_token 接口,添加防止并发性获取 access_token 和多次微信服务获取代码

This commit is contained in:
w_yangyili
2024-11-26 10:55:56 +08:00
parent b6762f11ef
commit a15ccac41e

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)