mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-04 12:52:27 +08:00
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>
This commit is contained in:
@@ -7,6 +7,16 @@ type AccessTokenHandle interface {
|
|||||||
GetAccessToken() (accessToken string, err error)
|
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 接口
|
// AccessTokenContextHandle AccessToken 接口
|
||||||
type AccessTokenContextHandle interface {
|
type AccessTokenContextHandle interface {
|
||||||
AccessTokenHandle
|
AccessTokenHandle
|
||||||
|
|||||||
@@ -34,7 +34,7 @@ func (business *Business) GetPhoneNumber(in *GetPhoneNumberRequest) (info PhoneI
|
|||||||
|
|
||||||
// GetPhoneNumberWithContext 利用context将code换取用户手机号。 每个code只能使用一次,code的有效期为5min
|
// GetPhoneNumberWithContext 利用context将code换取用户手机号。 每个code只能使用一次,code的有效期为5min
|
||||||
func (business *Business) GetPhoneNumberWithContext(ctx context.Context, in *GetPhoneNumberRequest) (info PhoneInfo, err error) {
|
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 {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,5 +8,5 @@ import (
|
|||||||
// Context struct
|
// Context struct
|
||||||
type Context struct {
|
type Context struct {
|
||||||
*config.Config
|
*config.Config
|
||||||
credential.AccessTokenHandle
|
credential.AccessTokenContextHandle
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -43,14 +43,21 @@ func NewMiniProgram(cfg *config.Config) *MiniProgram {
|
|||||||
}
|
}
|
||||||
ctx := &context.Context{
|
ctx := &context.Context{
|
||||||
Config: cfg,
|
Config: cfg,
|
||||||
AccessTokenHandle: defaultAkHandle,
|
AccessTokenContextHandle: defaultAkHandle,
|
||||||
}
|
}
|
||||||
return &MiniProgram{ctx}
|
return &MiniProgram{ctx}
|
||||||
}
|
}
|
||||||
|
|
||||||
// SetAccessTokenHandle 自定义 access_token 获取方式
|
// SetAccessTokenHandle 自定义 access_token 获取方式
|
||||||
func (miniProgram *MiniProgram) SetAccessTokenHandle(accessTokenHandle credential.AccessTokenHandle) {
|
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
|
// GetContext get Context
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package miniprogram
|
package miniprogram
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
originalContext "context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
|
||||||
"github.com/silenceper/wechat/v2/credential"
|
"github.com/silenceper/wechat/v2/credential"
|
||||||
@@ -37,6 +38,22 @@ func (miniProgram *MiniProgram) GetAccessToken() (string, error) {
|
|||||||
return akRes.AccessToken, nil
|
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
|
// SetAuthorizerRefreshToken 设置代执操作业务授权账号authorizer_refresh_token
|
||||||
func (miniProgram *MiniProgram) SetAuthorizerRefreshToken(authorizerRefreshToken string) *MiniProgram {
|
func (miniProgram *MiniProgram) SetAuthorizerRefreshToken(authorizerRefreshToken string) *MiniProgram {
|
||||||
miniProgram.authorizerRefreshToken = authorizerRefreshToken
|
miniProgram.authorizerRefreshToken = authorizerRefreshToken
|
||||||
@@ -68,7 +85,7 @@ func (miniProgram *MiniProgram) GetBasic() *basic.Basic {
|
|||||||
// GetURLLink 小程序URL Link接口 调用前需确认已调用 SetAuthorizerRefreshToken 避免由于缓存中 authorizer_access_token 过期执行中断
|
// GetURLLink 小程序URL Link接口 调用前需确认已调用 SetAuthorizerRefreshToken 避免由于缓存中 authorizer_access_token 过期执行中断
|
||||||
func (miniProgram *MiniProgram) GetURLLink() *urllink.URLLink {
|
func (miniProgram *MiniProgram) GetURLLink() *urllink.URLLink {
|
||||||
return urllink.NewURLLink(&miniContext.Context{
|
return urllink.NewURLLink(&miniContext.Context{
|
||||||
AccessTokenHandle: miniProgram,
|
AccessTokenContextHandle: miniProgram,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user