From 92bf6c7699b1bc2e94d1a0652ae123bcbe6edf4f Mon Sep 17 00:00:00 2001 From: mqf20 Date: Tue, 7 Jan 2025 22:13:03 +0800 Subject: [PATCH] use context when getting access token (#815) * use context Signed-off-by: mqf20 * added docs Signed-off-by: mqf20 * improved docs Signed-off-by: mqf20 * added SetAccessTokenContextHandle Signed-off-by: mqf20 --------- Signed-off-by: mqf20 --- credential/access_token.go | 10 ++++++++++ miniprogram/business/phone_number.go | 2 +- miniprogram/context/context.go | 2 +- miniprogram/miniprogram.go | 13 ++++++++++--- openplatform/miniprogram/miniprogram.go | 19 ++++++++++++++++++- 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/credential/access_token.go b/credential/access_token.go index 6094a02..b2269f3 100644 --- a/credential/access_token.go +++ b/credential/access_token.go @@ -7,6 +7,16 @@ type AccessTokenHandle interface { GetAccessToken() (accessToken string, err error) } +// AccessTokenCompatibleHandle 同时实现 AccessTokenHandle 和 AccessTokenContextHandle +type AccessTokenCompatibleHandle struct { + AccessTokenHandle +} + +// GetAccessTokenContext 获取access_token,先从cache中获取,没有则从服务端获取 +func (c AccessTokenCompatibleHandle) GetAccessTokenContext(_ context.Context) (accessToken string, err error) { + return c.GetAccessToken() +} + // AccessTokenContextHandle AccessToken 接口 type AccessTokenContextHandle interface { AccessTokenHandle diff --git a/miniprogram/business/phone_number.go b/miniprogram/business/phone_number.go index 38592cc..4c5fe24 100644 --- a/miniprogram/business/phone_number.go +++ b/miniprogram/business/phone_number.go @@ -34,7 +34,7 @@ func (business *Business) GetPhoneNumber(in *GetPhoneNumberRequest) (info PhoneI // GetPhoneNumberWithContext 利用context将code换取用户手机号。 每个code只能使用一次,code的有效期为5min func (business *Business) GetPhoneNumberWithContext(ctx context.Context, in *GetPhoneNumberRequest) (info PhoneInfo, err error) { - accessToken, err := business.GetAccessToken() + accessToken, err := business.GetAccessTokenContext(ctx) if err != nil { return } diff --git a/miniprogram/context/context.go b/miniprogram/context/context.go index 546ead9..89c8ef0 100644 --- a/miniprogram/context/context.go +++ b/miniprogram/context/context.go @@ -8,5 +8,5 @@ import ( // Context struct type Context struct { *config.Config - credential.AccessTokenHandle + credential.AccessTokenContextHandle } diff --git a/miniprogram/miniprogram.go b/miniprogram/miniprogram.go index c502738..412701e 100644 --- a/miniprogram/miniprogram.go +++ b/miniprogram/miniprogram.go @@ -42,15 +42,22 @@ func NewMiniProgram(cfg *config.Config) *MiniProgram { defaultAkHandle = credential.NewDefaultAccessToken(cfg.AppID, cfg.AppSecret, cacheKeyPrefix, cfg.Cache) } ctx := &context.Context{ - Config: cfg, - AccessTokenHandle: defaultAkHandle, + Config: cfg, + AccessTokenContextHandle: defaultAkHandle, } return &MiniProgram{ctx} } // SetAccessTokenHandle 自定义 access_token 获取方式 func (miniProgram *MiniProgram) SetAccessTokenHandle(accessTokenHandle credential.AccessTokenHandle) { - miniProgram.ctx.AccessTokenHandle = accessTokenHandle + miniProgram.ctx.AccessTokenContextHandle = credential.AccessTokenCompatibleHandle{ + AccessTokenHandle: accessTokenHandle, + } +} + +// SetAccessTokenContextHandle 自定义 access_token 获取方式 +func (miniProgram *MiniProgram) SetAccessTokenContextHandle(accessTokenContextHandle credential.AccessTokenContextHandle) { + miniProgram.ctx.AccessTokenContextHandle = accessTokenContextHandle } // GetContext get Context diff --git a/openplatform/miniprogram/miniprogram.go b/openplatform/miniprogram/miniprogram.go index 8bececb..52d2b8b 100644 --- a/openplatform/miniprogram/miniprogram.go +++ b/openplatform/miniprogram/miniprogram.go @@ -1,6 +1,7 @@ package miniprogram import ( + originalContext "context" "fmt" "github.com/silenceper/wechat/v2/credential" @@ -37,6 +38,22 @@ func (miniProgram *MiniProgram) GetAccessToken() (string, error) { return akRes.AccessToken, nil } +// GetAccessTokenContext 利用ctx获取ak +func (miniProgram *MiniProgram) GetAccessTokenContext(ctx originalContext.Context) (string, error) { + ak, akErr := miniProgram.openContext.GetAuthrAccessTokenContext(ctx, miniProgram.AppID) + if akErr == nil { + return ak, nil + } + if miniProgram.authorizerRefreshToken == "" { + return "", fmt.Errorf("please set the authorizer_refresh_token first") + } + akRes, akResErr := miniProgram.GetComponent().RefreshAuthrTokenContext(ctx, miniProgram.AppID, miniProgram.authorizerRefreshToken) + if akResErr != nil { + return "", akResErr + } + return akRes.AccessToken, nil +} + // SetAuthorizerRefreshToken 设置代执操作业务授权账号authorizer_refresh_token func (miniProgram *MiniProgram) SetAuthorizerRefreshToken(authorizerRefreshToken string) *MiniProgram { miniProgram.authorizerRefreshToken = authorizerRefreshToken @@ -68,7 +85,7 @@ func (miniProgram *MiniProgram) GetBasic() *basic.Basic { // GetURLLink 小程序URL Link接口 调用前需确认已调用 SetAuthorizerRefreshToken 避免由于缓存中 authorizer_access_token 过期执行中断 func (miniProgram *MiniProgram) GetURLLink() *urllink.URLLink { return urllink.NewURLLink(&miniContext.Context{ - AccessTokenHandle: miniProgram, + AccessTokenContextHandle: miniProgram, }) }