Quellcode durchsuchen

use context when getting access token (#815)

* use context

Signed-off-by: mqf20 <mingqingfoo@gmail.com>

* added docs

Signed-off-by: mqf20 <mingqingfoo@gmail.com>

* improved docs

Signed-off-by: mqf20 <mingqingfoo@gmail.com>

* added SetAccessTokenContextHandle

Signed-off-by: mqf20 <mingqingfoo@gmail.com>

---------

Signed-off-by: mqf20 <mingqingfoo@gmail.com>
mqf20 vor 1 Jahr
Ursprung
Commit
92bf6c7699

+ 10 - 0
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

+ 1 - 1
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
 	}

+ 1 - 1
miniprogram/context/context.go

@@ -8,5 +8,5 @@ import (
 // Context struct
 type Context struct {
 	*config.Config
-	credential.AccessTokenHandle
+	credential.AccessTokenContextHandle
 }

+ 10 - 3
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

+ 18 - 1
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,
 	})
 }