From d01c8589213c2f61c7a0029346aafe25e38729b2 Mon Sep 17 00:00:00 2001 From: mqf20 Date: Tue, 7 Jan 2025 13:58:17 +0800 Subject: [PATCH 1/4] use context Signed-off-by: mqf20 --- credential/access_token.go | 8 ++++++++ miniprogram/business/phone_number.go | 2 +- miniprogram/context/context.go | 2 +- miniprogram/miniprogram.go | 8 +++++--- openplatform/miniprogram/miniprogram.go | 19 ++++++++++++++++++- 5 files changed, 33 insertions(+), 6 deletions(-) diff --git a/credential/access_token.go b/credential/access_token.go index 6094a024b..5f8982c73 100644 --- a/credential/access_token.go +++ b/credential/access_token.go @@ -7,6 +7,14 @@ type AccessTokenHandle interface { GetAccessToken() (accessToken string, err error) } +type AccessTokenCompatibleHandle struct { + AccessTokenHandle +} + +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 38592cce8..4c5fe248d 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 546ead908..89c8ef05e 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 c50273827..67a6246f5 100644 --- a/miniprogram/miniprogram.go +++ b/miniprogram/miniprogram.go @@ -42,15 +42,17 @@ 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, + } } // GetContext get Context diff --git a/openplatform/miniprogram/miniprogram.go b/openplatform/miniprogram/miniprogram.go index 8bececbe8..52d2b8b0d 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, }) } From 7a601f773e59d0f44016cf2a55b5c3fbecffce69 Mon Sep 17 00:00:00 2001 From: mqf20 Date: Tue, 7 Jan 2025 15:17:35 +0800 Subject: [PATCH 2/4] added docs Signed-off-by: mqf20 --- credential/access_token.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/credential/access_token.go b/credential/access_token.go index 5f8982c73..888a6ce92 100644 --- a/credential/access_token.go +++ b/credential/access_token.go @@ -7,10 +7,12 @@ 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() } From 4620819c82049cf7e86492bb492215c08586f8d6 Mon Sep 17 00:00:00 2001 From: mqf20 Date: Tue, 7 Jan 2025 15:30:12 +0800 Subject: [PATCH 3/4] improved docs Signed-off-by: mqf20 --- credential/access_token.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/credential/access_token.go b/credential/access_token.go index 888a6ce92..b2269f31e 100644 --- a/credential/access_token.go +++ b/credential/access_token.go @@ -7,7 +7,7 @@ type AccessTokenHandle interface { GetAccessToken() (accessToken string, err error) } -// AccessTokenCompatibleHandle 允许 AccessTokenHandle 兼容 AccessTokenContextHandle. +// AccessTokenCompatibleHandle 同时实现 AccessTokenHandle 和 AccessTokenContextHandle type AccessTokenCompatibleHandle struct { AccessTokenHandle } From 3c54064570b75d20a7dab94c2df2935232596437 Mon Sep 17 00:00:00 2001 From: mqf20 Date: Tue, 7 Jan 2025 15:47:29 +0800 Subject: [PATCH 4/4] added SetAccessTokenContextHandle Signed-off-by: mqf20 --- miniprogram/miniprogram.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/miniprogram/miniprogram.go b/miniprogram/miniprogram.go index 67a6246f5..412701e2e 100644 --- a/miniprogram/miniprogram.go +++ b/miniprogram/miniprogram.go @@ -55,6 +55,11 @@ func (miniProgram *MiniProgram) SetAccessTokenHandle(accessTokenHandle credentia } } +// SetAccessTokenContextHandle 自定义 access_token 获取方式 +func (miniProgram *MiniProgram) SetAccessTokenContextHandle(accessTokenContextHandle credential.AccessTokenContextHandle) { + miniProgram.ctx.AccessTokenContextHandle = accessTokenContextHandle +} + // GetContext get Context func (miniProgram *MiniProgram) GetContext() *context.Context { return miniProgram.ctx