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

refactor: enhance WorkAccessToken to improve cache key handling

- Updated the AgentID field in WorkAccessToken struct to clarify its optional nature for distinguishing applications.
- Modified the access token cache key construction to support both new and legacy formats based on the presence of AgentID.
- Added comments for better understanding of the cache key logic and its compatibility with historical versions.

This change improves the flexibility and clarity of access token management in multi-agent scenarios.
This commit is contained in:
mahongran
2025-01-03 18:22:44 +08:00
parent 988ea49a03
commit dd5f680161

View File

@@ -189,7 +189,7 @@ func (ak *StableAccessToken) GetAccessTokenDirectly(ctx context.Context, forceRe
type WorkAccessToken struct { type WorkAccessToken struct {
CorpID string CorpID string
CorpSecret string CorpSecret string
AgentID string AgentID string // 可选,用于区分不同应用
cacheKeyPrefix string cacheKeyPrefix string
cache cache.Cache cache cache.Cache
accessTokenLock *sync.Mutex accessTokenLock *sync.Mutex
@@ -203,7 +203,7 @@ func NewWorkAccessToken(corpID, corpSecret, agentID, cacheKeyPrefix string, cach
return &WorkAccessToken{ return &WorkAccessToken{
CorpID: corpID, CorpID: corpID,
CorpSecret: corpSecret, CorpSecret: corpSecret,
AgentID: agentID, AgentID: agentID, // agentID可以为空兼容历史版本
cache: cache, cache: cache,
cacheKeyPrefix: cacheKeyPrefix, cacheKeyPrefix: cacheKeyPrefix,
accessTokenLock: new(sync.Mutex), accessTokenLock: new(sync.Mutex),
@@ -221,8 +221,18 @@ func (ak *WorkAccessToken) GetAccessTokenContext(ctx context.Context) (accessTok
ak.accessTokenLock.Lock() ak.accessTokenLock.Lock()
defer ak.accessTokenLock.Unlock() defer ak.accessTokenLock.Unlock()
// 修改缓存key加入agentID // 构建缓存key
accessTokenCacheKey := fmt.Sprintf("%s_access_token_%s_%s", ak.cacheKeyPrefix, ak.CorpID, ak.AgentID) var accessTokenCacheKey string
// 每个应用有独立的secret获取到的access_token只能本应用使用所以每个应用的access_token应该分开来获取
// API文档:https://developer.work.weixin.qq.com/document/path/91039
if ak.AgentID != "" {
// 如果设置了AgentID使用新的key格式
accessTokenCacheKey = fmt.Sprintf("%s_access_token_%s_%s", ak.cacheKeyPrefix, ak.CorpID, ak.AgentID)
} else {
// 兼容历史版本的key格式
accessTokenCacheKey = fmt.Sprintf("%s_access_token_%s", ak.cacheKeyPrefix, ak.CorpID)
}
val := ak.cache.Get(accessTokenCacheKey) val := ak.cache.Get(accessTokenCacheKey)
if val != nil { if val != nil {
accessToken = val.(string) accessToken = val.(string)