From 972dec0406d713294f5507fdda81d6c495caa63a Mon Sep 17 00:00:00 2001 From: silenceper Date: Mon, 25 May 2020 22:00:51 +0800 Subject: [PATCH] =?UTF-8?q?=E5=B0=86=E5=B0=8F=E7=A8=8B=E5=BA=8F=E8=8E=B7?= =?UTF-8?q?=E5=8F=96ak=E7=9A=84=E6=96=B9=E5=BC=8F=E4=B9=9F=E6=8A=BD?= =?UTF-8?q?=E8=B1=A1=E5=87=BA=E6=9D=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- credential/default_access_token.go | 2 + miniprogram/context/access_token.go | 87 ----------------------------- miniprogram/context/context.go | 10 +--- miniprogram/miniprogram.go | 16 +++--- officialaccount/officialaccount.go | 4 +- 5 files changed, 15 insertions(+), 104 deletions(-) delete mode 100644 miniprogram/context/access_token.go diff --git a/credential/default_access_token.go b/credential/default_access_token.go index f346933..1157d2e 100644 --- a/credential/default_access_token.go +++ b/credential/default_access_token.go @@ -15,6 +15,8 @@ const ( accessTokenURL = "https://api.weixin.qq.com/cgi-bin/token" //CacheKeyOfficialAccountPrefix 微信公众号cache key前缀 CacheKeyOfficialAccountPrefix = "gowechat_officialaccount_" + //CacheKeyMiniProgramPrefix 小程序cache key前缀 + CacheKeyMiniProgramPrefix = "gowechat_miniprogram_" ) //DefaultAccessToken 默认AccessToken 获取 diff --git a/miniprogram/context/access_token.go b/miniprogram/context/access_token.go deleted file mode 100644 index f382d71..0000000 --- a/miniprogram/context/access_token.go +++ /dev/null @@ -1,87 +0,0 @@ -package context - -import ( - "encoding/json" - "fmt" - "sync" - "time" - - "github.com/silenceper/wechat/v2/util" -) - -const ( - //AccessTokenURL 获取access_token的接口 - AccessTokenURL = "https://api.weixin.qq.com/cgi-bin/token" - //CacheKeyPrefix cache前缀 - CacheKeyPrefix = "gowechat_miniprogram_" -) - -//ResAccessToken struct -type ResAccessToken struct { - util.CommonError - - AccessToken string `json:"access_token"` - ExpiresIn int64 `json:"expires_in"` -} - -//GetAccessTokenFunc 获取 access token 的函数签名 -type GetAccessTokenFunc func(ctx *Context) (accessToken string, err error) - -//SetAccessTokenLock 设置读写锁(一个appID一个读写锁) -func (ctx *Context) SetAccessTokenLock(l *sync.RWMutex) { - ctx.accessTokenLock = l -} - -//SetGetAccessTokenFunc 设置自定义获取accessToken的方式, 需要自己实现缓存 -func (ctx *Context) SetGetAccessTokenFunc(f GetAccessTokenFunc) { - ctx.accessTokenFunc = f -} - -//GetAccessToken 获取access_token -func (ctx *Context) GetAccessToken() (accessToken string, err error) { - ctx.accessTokenLock.Lock() - defer ctx.accessTokenLock.Unlock() - - if ctx.accessTokenFunc != nil { - return ctx.accessTokenFunc(ctx) - } - accessTokenCacheKey := fmt.Sprintf("%s_access_token_%s", CacheKeyPrefix, ctx.AppID) - val := ctx.Cache.Get(accessTokenCacheKey) - if val != nil { - accessToken = val.(string) - return - } - - //从微信服务器获取 - var resAccessToken ResAccessToken - resAccessToken, err = ctx.GetAccessTokenFromServer() - if err != nil { - return - } - - accessToken = resAccessToken.AccessToken - return -} - -//GetAccessTokenFromServer 强制从微信服务器获取token -func (ctx *Context) GetAccessTokenFromServer() (resAccessToken ResAccessToken, err error) { - url := fmt.Sprintf("%s?grant_type=client_credential&appid=%s&secret=%s", AccessTokenURL, ctx.AppID, ctx.AppSecret) - var body []byte - body, err = util.HTTPGet(url) - if err != nil { - return - } - err = json.Unmarshal(body, &resAccessToken) - if err != nil { - return - } - if resAccessToken.ErrMsg != "" { - err = fmt.Errorf("get access_token error : errcode=%v , errormsg=%v", resAccessToken.ErrCode, resAccessToken.ErrMsg) - return - } - - accessTokenCacheKey := fmt.Sprintf("%s_access_token_%s", CacheKeyPrefix, ctx.AppID) - expires := resAccessToken.ExpiresIn - 1500 - err = ctx.Cache.Set(accessTokenCacheKey, resAccessToken.AccessToken, time.Duration(expires)*time.Second) - return -} diff --git a/miniprogram/context/context.go b/miniprogram/context/context.go index 6a6017d..546ead9 100644 --- a/miniprogram/context/context.go +++ b/miniprogram/context/context.go @@ -1,18 +1,12 @@ package context import ( - "sync" - + "github.com/silenceper/wechat/v2/credential" "github.com/silenceper/wechat/v2/miniprogram/config" ) // Context struct type Context struct { *config.Config - - //accessTokenLock 读写锁 同一个AppID一个 - accessTokenLock *sync.RWMutex - - //accessTokenFunc 自定义获取 access token 的方法 - accessTokenFunc GetAccessTokenFunc + credential.AccessTokenHandle } diff --git a/miniprogram/miniprogram.go b/miniprogram/miniprogram.go index 2eb551b..bbb2572 100644 --- a/miniprogram/miniprogram.go +++ b/miniprogram/miniprogram.go @@ -1,8 +1,7 @@ package miniprogram import ( - "sync" - + "github.com/silenceper/wechat/v2/credential" "github.com/silenceper/wechat/v2/miniprogram/analysis" "github.com/silenceper/wechat/v2/miniprogram/auth" "github.com/silenceper/wechat/v2/miniprogram/basic" @@ -19,16 +18,19 @@ type MiniProgram struct { //NewMiniProgram 实例化小程序API func NewMiniProgram(cfg *config.Config) *MiniProgram { - if cfg.Cache == nil { - panic("cache未设置") - } + defaultAkHandle := credential.NewDefaultAccessToken(cfg.AppID, cfg.AppSecret, credential.CacheKeyMiniProgramPrefix, cfg.Cache) ctx := &context.Context{ - Config: cfg, + Config: cfg, + AccessTokenHandle: defaultAkHandle, } - ctx.SetAccessTokenLock(new(sync.RWMutex)) return &MiniProgram{ctx} } +//SetAccessTokenHandle 自定义access_token获取方式 +func (miniProgram *MiniProgram) SetAccessTokenHandle(accessTokenHandle credential.AccessTokenHandle) { + miniProgram.ctx.AccessTokenHandle = accessTokenHandle +} + // GetContext get Context func (miniProgram *MiniProgram) GetContext() *context.Context { return miniProgram.ctx diff --git a/officialaccount/officialaccount.go b/officialaccount/officialaccount.go index ac3fdf9..1bc0673 100644 --- a/officialaccount/officialaccount.go +++ b/officialaccount/officialaccount.go @@ -24,10 +24,10 @@ type OfficialAccount struct { //NewOfficialAccount 实例化公众号API func NewOfficialAccount(cfg *config.Config) *OfficialAccount { - defaultAK := credential.NewDefaultAccessToken(cfg.AppID, cfg.AppSecret, credential.CacheKeyOfficialAccountPrefix, cfg.Cache) + defaultAkHandle := credential.NewDefaultAccessToken(cfg.AppID, cfg.AppSecret, credential.CacheKeyOfficialAccountPrefix, cfg.Cache) ctx := &context.Context{ Config: cfg, - AccessTokenHandle: defaultAK, + AccessTokenHandle: defaultAkHandle, } return &OfficialAccount{ctx: ctx} }