forked from fastwego/wxwork
-
Notifications
You must be signed in to change notification settings - Fork 0
/
corporation.go
148 lines (124 loc) · 3.51 KB
/
corporation.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
// Copyright 2020 FastWeGo
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
/*
企业微信开发 SDK
See: https://work.weixin.qq.com/api/doc
*/
package corporation
import (
"log"
"os"
"github.com/faabiosr/cachego"
"github.com/faabiosr/cachego/file"
)
// GetAccessTokenFunc 获取 access_token 方法接口
type GetAccessTokenFunc func(ctx *App) (accessToken string, err error)
// NoticeAccessTokenExpireFunc 通知中控 刷新 access_token
type NoticeAccessTokenExpireFunc func(ctx *App) (err error)
/*
Corporation 企业实例
*/
type Corporation struct {
Config Config
Logger *log.Logger
}
/*
配置
*/
type Config struct {
Corpid string
}
/*
应用
*/
type App struct {
Config AppConfig
AccessToken AccessToken
Client Client
Server Server
Corporation *Corporation
}
/*
应用配置
*/
type AppConfig struct {
AgentId string
Secret string
Token string
EncodingAESKey string
}
/*
AccessToken 管理器 处理缓存 和 刷新 逻辑
*/
type AccessToken struct {
Cache cachego.Cache
GetAccessTokenHandler GetAccessTokenFunc
NoticeAccessTokenExpireHandler NoticeAccessTokenExpireFunc
}
/*
创建企业实例
*/
func New(config Config) (corporation *Corporation) {
instance := Corporation{
Config: config,
}
instance.Logger = log.New(os.Stdout, "[corporation:"+config.Corpid+"] ", log.LstdFlags|log.Llongfile)
return &instance
}
/*
创建应用实例
*/
func (corporation *Corporation) NewApp(config AppConfig) (app *App) {
instance := App{
Config: config,
AccessToken: AccessToken{
Cache: file.New(os.TempDir()),
GetAccessTokenHandler: GetAccessToken,
},
Corporation: corporation,
}
instance.Client = Client{Ctx: &instance}
instance.Server = Server{Ctx: &instance}
return &instance
}
/*
SetAccessTokenCacheDriver 设置 AccessToken 缓存器 默认为文件缓存:目录 os.TempDir()
驱动接口类型 为 cachego.Cache
*/
func (app *App) SetAccessTokenCacheDriver(driver cachego.Cache) {
app.AccessToken.Cache = driver
}
/*
SetGetAccessTokenHandler 设置 AccessToken 获取方法。默认 从本地缓存获取(过期从微信接口刷新)
如果有多实例服务,可以设置为 Redis 或 RPC 等中控服务器 获取 就可以避免 AccessToken 刷新冲突
*/
func (app *App) SetGetAccessTokenHandler(f GetAccessTokenFunc) {
app.AccessToken.GetAccessTokenHandler = f
}
/*
SetNoticeAccessTokenExpireHandler 设置 AccessToken 过期 通知
框架提供的默认机制是 删除本地缓存的 access_token,那么 retry 的时候 会触发 刷新
如果有多实例服务,可以设置为 通知 中控服务器 去刷新
*/
func (app *App) SetNoticeAccessTokenExpireHandler(f NoticeAccessTokenExpireFunc) {
app.AccessToken.NoticeAccessTokenExpireHandler = f
}
/*
SetLogger 日志记录 默认输出到 os.Stdout
可以新建 logger 输出到指定文件
如果不想开启日志,可以 SetLogger(nil)
*/
func (corporation *Corporation) SetLogger(logger *log.Logger) {
corporation.Logger = logger
}