-
Notifications
You must be signed in to change notification settings - Fork 14
/
main.go
208 lines (169 loc) · 7.32 KB
/
main.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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
package workweixin
import (
"errors"
"fmt"
"github.com/zsmhub/workweixin/apis"
"github.com/zsmhub/workweixin/callbacks"
"sync"
)
// sdk 调用入口
var Sdk = &sdk{
mutex: sync.RWMutex{},
ThirdAuthCorpsClient: make(map[string]*apis.ApiClient),
CustomizedAuthCorpsClient: make(map[string]*apis.ApiClient),
}
type sdk struct {
mutex sync.RWMutex
// 服务商的回调处理和Api客户端
ProviderCallback *callbacks.CallBackHandler // 服务商回调解析 [配置位置:服务商后台 -> 应用管理 -> 通用开发参数 -> 系统事件接收URL]
ProviderClient *apis.ApiClient // 服务商客户端,用于服务商级别的接口调用,比如登录授权、推广二维码等
// 第三方应用的回调处理和Api客户端
ThirdAppCallback *callbacks.CallBackHandler // 第三方应用回调解析 [配置位置:服务商后台 -> 应用管理 -> 网页应用 -> 数据回调URL和指令回调URL]
ThirdAppClient *apis.ApiClient // 第三方应用客户端,用于获取第三方应用的预授权码,获取授权企业信息等
ThirdAuthCorpsClient map[string]*apis.ApiClient // 第三方应用授权企业客户端,用于操作授权企业相关接口,如通讯录管理,消息推送等
// 自建应用代开发的回调处理和Api客户端
CustomizedTemplateCallback *callbacks.CallBackHandler // 自建应用代开发模板回调解析
CustomizedAppClient *apis.ApiClient // 自建应用代开发客户端,用于获取第三方应用的预授权码,获取授权企业信息等
CustomizedAuthCorpsClient map[string]*apis.ApiClient // 代发开应用授权企业客户端,用于操作授权企业相关接口,如通讯录管理,消息推送等
// 第三方小程序的回调处理
ThirdMiniCallback *callbacks.CallBackHandler // 第三方小程序回调解析,如果第三方应用需要使用发微信小程序功能,需要先配置一个第三方小程序绑定微信小程序
apis.Options
}
// 初始化企微sdk参数
func (s *sdk) InitOptions(opts apis.Options) {
s.Options = opts
}
// 服务商:设置服务商回调token和加密key (如果要处理微信回调, 这一步是必须的)
func (s *sdk) NewProviderCallbackHandler(token, encodingAESKey string) error {
if token == "" || encodingAESKey == "" {
return errors.New("传参不能为空")
}
var err error
s.ProviderCallback, err = callbacks.NewCallbackHandler(token, encodingAESKey)
return err
}
// 服务商:API客户端初始化
func (s *sdk) NewProviderApiClient(corpId, corpProviderSecret string) {
s.ProviderClient = apis.NewProviderApiClient(corpId, corpProviderSecret, s.Options)
}
// 第三方应用:设置第三方应用回调token和加密key (如果要处理微信回调, 这一步是必须的)
func (s *sdk) NewThirdAppCallbackHandler(token, encodingAESKey string) error {
if token == "" || encodingAESKey == "" {
return errors.New("传参不能为空")
}
var err error
s.ThirdAppCallback, err = callbacks.NewCallbackHandler(token, encodingAESKey)
return err
}
// 第三方应用:API客户端初始化
func (s *sdk) NewThirdAppApiClient(corpId, appSuiteID, appSuiteSecret, appSuiteTicket string) {
s.ThirdAppClient = apis.NewThirdAppApiClient(corpId, appSuiteID, appSuiteSecret, appSuiteTicket, s.Options)
}
// 第三方应用:授权企业API客户端初始化
func (s *sdk) NewThirdAuthCorpApiClient(corpId, companyPermanentCode string, agentId int) error {
if s.ThirdAppClient == nil {
return errors.New("Sdk.ThirdAppClient还未初始化")
}
apiClient := apis.NewAuthCorpApiClient(corpId, companyPermanentCode, agentId, s.ThirdAppClient, s.Options)
s.mutex.Lock()
defer s.mutex.Unlock()
s.ThirdAuthCorpsClient[corpId] = apiClient
return nil
}
// 第三方应用:获取授权企业客户端
func (s *sdk) GetThirdAuthCorpApiClient(corpId string) (*apis.ApiClient, error) {
// 从数据库或缓存读取企业数据
if s.GetThirdAppAuthCorpFunc != nil {
corp, err := s.GetThirdAppAuthCorpFunc(corpId, s.ThirdAppClient.AppSuiteId)
if err != nil {
return nil, err
} else if corp.PermanentCode != "" {
if err := s.NewThirdAuthCorpApiClient(corpId, corp.PermanentCode, corp.AgentId); err != nil {
return nil, err
}
}
}
s.mutex.RLock()
if v, ok := s.ThirdAuthCorpsClient[corpId]; ok {
s.mutex.RUnlock()
return v, nil
}
s.mutex.RUnlock()
return nil, fmt.Errorf("第三方应用:corpid不存在:%s", corpId)
}
// 第三方应用:移除授权企业,比如企业取消授权时触发
func (s *sdk) RemoveThirdAuthCorp(corpId string) {
apiClient, err := s.GetThirdAuthCorpApiClient(corpId)
if err != nil {
return
}
apiClient.RemoveToken()
s.mutex.Lock()
defer s.mutex.Unlock()
delete(s.ThirdAuthCorpsClient, corpId)
}
// 自建应用代开发:设置应用回调token和加密key(如果要处理微信回调, 这一步是必须的)
func (s *sdk) NewCustomizedTemplateCallbackHandler(token, encodingAESKey string) error {
if token == "" || encodingAESKey == "" {
return errors.New("传参不能为空")
}
var err error
s.CustomizedTemplateCallback, err = callbacks.NewCallbackHandler(token, encodingAESKey)
return err
}
// 自建应用代开发:API客户端初始化
func (s *sdk) NewCustomizedApiClient(corpId, appSuiteID, appSuiteSecret, appSuiteTicket string) {
s.CustomizedAppClient = apis.NewCustomizedApiClient(corpId, appSuiteID, appSuiteSecret, appSuiteTicket, s.Options)
}
// 自建应用代开发:授权企业API客户端初始化
func (s *sdk) NewCustomizedAuthCorpApiClient(corpId, companyPermanentCode string, agentId int) error {
if s.CustomizedAppClient == nil {
return errors.New("Sdk.CustomizedAppClient还未初始化")
}
apiClient := apis.NewCustomizedAuthCorpApiClient(corpId, companyPermanentCode, agentId, s.CustomizedAppClient, s.Options)
s.mutex.Lock()
defer s.mutex.Unlock()
s.CustomizedAuthCorpsClient[corpId] = apiClient
return nil
}
// 自建应用代开发:获取授权企业客户端
func (s *sdk) GetCustomizedAuthCorpApiClient(corpId string) (*apis.ApiClient, error) {
// 从数据库或缓存读取企业数据
if s.GetCustomizedAppAuthCorpFunc != nil {
corp, err := s.GetCustomizedAppAuthCorpFunc(corpId, s.CustomizedAppClient.AppSuiteId)
if err != nil {
return nil, err
} else if corp.PermanentCode != "" {
if err := s.NewCustomizedAuthCorpApiClient(corpId, corp.PermanentCode, corp.AgentId); err != nil {
return nil, err
}
}
}
s.mutex.RLock()
if v, ok := s.CustomizedAuthCorpsClient[corpId]; ok {
s.mutex.RUnlock()
return v, nil
}
s.mutex.RUnlock()
return nil, fmt.Errorf("自建应用代开发:corpid不存在:%s", corpId)
}
// 自建应用代开发:移除授权企业,比如企业取消授权时触发
func (s *sdk) RemoveCustomizedAuthCorp(corpId string) {
apiClient, err := s.GetCustomizedAuthCorpApiClient(corpId)
if err != nil {
return
}
apiClient.RemoveToken()
s.mutex.Lock()
defer s.mutex.Unlock()
delete(s.CustomizedAuthCorpsClient, corpId)
}
// 第三方小程序:设置第三方小程序回调token和加密key (如果要处理微信回调, 这一步是必须的)
func (s *sdk) NewThirdMiniCallbackHandler(token, encodingAESKey string) error {
if token == "" || encodingAESKey == "" {
return errors.New("传参不能为空")
}
var err error
s.ThirdMiniCallback, err = callbacks.NewCallbackHandler(token, encodingAESKey)
return err
}