-
Notifications
You must be signed in to change notification settings - Fork 279
/
subscribe_message.go
313 lines (262 loc) · 8.66 KB
/
subscribe_message.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
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
package weapp
import (
"strconv"
"github.com/medivhzhan/weapp/v3/request"
)
const (
apiAddTemplate = "/wxaapi/newtmpl/addtemplate"
apiDeleteTemplate = "/wxaapi/newtmpl/deltemplate"
apiGetTemplateCategory = "/wxaapi/newtmpl/getcategory"
apiGetPubTemplateKeyWordsById = "/wxaapi/newtmpl/getpubtemplatekeywords"
apiGetPubTemplateTitleList = "/wxaapi/newtmpl/getpubtemplatetitles"
apiGetTemplateList = "/wxaapi/newtmpl/gettemplate"
apiSendSubscribeMessage = "/cgi-bin/message/subscribe/send"
)
// AddTemplateResponse 添加模版消息返回数据
type AddTemplateResponse struct {
request.CommonError
Pid string `json:"priTmplId"` // 添加至帐号下的模板id,发送小程序订阅消息时所需
}
// AddTemplate 组合模板并添加至帐号下的个人模板库
//
// token 微信 access_token
// tid 模板ID
// desc 服务场景描述,15个字以内
// keywordIDList 关键词 ID 列表
func (cli *Client) AddTemplate(tid, desc string, keywordIDList []int32) (*AddTemplateResponse, error) {
api := baseURL + apiAddTemplate
token, err := cli.AccessToken()
if err != nil {
return nil, err
}
return cli.addTemplate(api, token, tid, desc, keywordIDList)
}
func (cli *Client) addTemplate(api, token, tid, desc string, keywordIDList []int32) (*AddTemplateResponse, error) {
api, err := tokenAPI(api, token)
if err != nil {
return nil, err
}
params := requestParams{
"tid": tid,
"kidList": keywordIDList,
"sceneDesc": desc,
}
res := new(AddTemplateResponse)
err = cli.request.Post(api, params, res)
if err != nil {
return nil, err
}
return res, nil
}
// DeleteTemplate 删除帐号下的某个模板
//
// token 微信 access_token
// pid 模板ID
func (cli *Client) DeleteTemplate(pid string) (*request.CommonError, error) {
api := baseURL + apiDeleteTemplate
token, err := cli.AccessToken()
if err != nil {
return nil, err
}
return cli.deleteTemplate(api, token, pid)
}
func (cli *Client) deleteTemplate(api, token, pid string) (*request.CommonError, error) {
api, err := tokenAPI(api, token)
if err != nil {
return nil, err
}
params := requestParams{
"priTmplId": pid,
}
res := new(request.CommonError)
err = cli.request.Post(api, params, res)
if err != nil {
return nil, err
}
return res, nil
}
// GetTemplateCategoryResponse 删除帐号下的某个模板返回数据
type GetTemplateCategoryResponse struct {
request.CommonError
Data []struct {
ID int `json:"id"` // 类目id,查询公共库模版时需要
Name string `json:"name"` // 类目的中文名
} `json:"data"` // 类目列表
}
// GetTemplateCategory 删除帐号下的某个模板
//
// token 微信 access_token
func (cli *Client) GetTemplateCategory() (*GetTemplateCategoryResponse, error) {
api := baseURL + apiGetTemplateCategory
token, err := cli.AccessToken()
if err != nil {
return nil, err
}
return cli.getTemplateCategory(token, api)
}
func (cli *Client) getTemplateCategory(token, api string) (*GetTemplateCategoryResponse, error) {
api, err := tokenAPI(api, token)
if err != nil {
return nil, err
}
res := new(GetTemplateCategoryResponse)
err = cli.request.Get(api, res)
if err != nil {
return nil, err
}
return res, nil
}
// GetPubTemplateKeyWordsByIdResponse 模板标题下的关键词列表
type GetPubTemplateKeyWordsByIdResponse struct {
request.CommonError
Count int32 `json:"count"` // 模版标题列表总数
Data []struct {
Kid int `json:"kid"` // 关键词 id,选用模板时需要
Name string `json:"name"` // 关键词内容
Example string `json:"example"` // 关键词内容对应的示例
Rule string `json:"rule"` // 参数类型
} `json:"data"` // 关键词列表
}
// GetPubTemplateKeyWordsById 获取模板标题下的关键词列表
//
// token 微信 access_token
// tid 模板ID
func (cli *Client) GetPubTemplateKeyWordsById(tid string) (*GetPubTemplateKeyWordsByIdResponse, error) {
api := baseURL + apiGetPubTemplateKeyWordsById
token, err := cli.AccessToken()
if err != nil {
return nil, err
}
return cli.getPubTemplateKeyWordsById(api, token, tid)
}
func (cli *Client) getPubTemplateKeyWordsById(api, token, tid string) (*GetPubTemplateKeyWordsByIdResponse, error) {
queries := requestQueries{
"access_token": token,
"tid": tid,
}
url, err := request.EncodeURL(api, queries)
if err != nil {
return nil, err
}
res := new(GetPubTemplateKeyWordsByIdResponse)
if err = cli.request.Get(url, res); err != nil {
return nil, err
}
return res, nil
}
// GetPubTemplateTitleListResponse 帐号所属类目下的公共模板标题
type GetPubTemplateTitleListResponse struct {
request.CommonError
Count uint `json:"count"` // 模版标题列表总数
Data []struct {
Tid int `json:"tid"` // 模版标题 id
Title string `json:"title"` // 模版标题
Type int32 `json:"type"` // 模版类型,2 为一次性订阅,3 为长期订阅
CategoryId string `json:"categoryId"` // 模版所属类目 id
} `json:"data"` // 模板标题列表
}
// GetPubTemplateTitleList 获取帐号所属类目下的公共模板标题
//
// token 微信 access_token
// ids 类目 id,多个用逗号隔开
// start 用于分页,表示从 start 开始。从 0 开始计数。
// limit 用于分页,表示拉取 limit 条记录。最大为 30
func (cli *Client) GetPubTemplateTitleList(ids string, start, limit int) (*GetPubTemplateTitleListResponse, error) {
api := baseURL + apiGetPubTemplateTitleList
token, err := cli.AccessToken()
if err != nil {
return nil, err
}
return cli.getPubTemplateTitleList(api, token, ids, start, limit)
}
func (cli *Client) getPubTemplateTitleList(api, token, ids string, start, limit int) (*GetPubTemplateTitleListResponse, error) {
queries := requestQueries{
"access_token": token,
"ids": ids,
"start": strconv.Itoa(start),
"limit": strconv.Itoa(limit),
}
url, err := request.EncodeURL(api, queries)
if err != nil {
return nil, err
}
res := new(GetPubTemplateTitleListResponse)
if err := cli.request.Get(url, res); err != nil {
return nil, err
}
return res, nil
}
// GetTemplateListResponse 获取模板列表返回的数据
type GetTemplateListResponse struct {
request.CommonError
Data []struct {
Pid string `json:"priTmplId"` // 添加至帐号下的模板 id,发送小程序订阅消息时所需
Title string `json:"title"` // 模版标题
Content string `json:"content"` // 模版内容
Example string `json:"example"` // 模板内容示例
Type int32 `json:"type"` // 模版类型,2 为一次性订阅,3 为长期订阅
} `json:"data"` // 个人模板列表
}
// GetTemplateList 获取帐号下已存在的模板列表
//
// token 微信 access_token
func (cli *Client) GetTemplateList() (*GetTemplateListResponse, error) {
api := baseURL + apiGetTemplateList
token, err := cli.AccessToken()
if err != nil {
return nil, err
}
return cli.getTemplateList(api, token)
}
func (cli *Client) getTemplateList(api, token string) (*GetTemplateListResponse, error) {
url, err := tokenAPI(api, token)
if err != nil {
return nil, err
}
res := new(GetTemplateListResponse)
if err := cli.request.Get(url, res); err != nil {
return nil, err
}
return res, nil
}
// SubscribeMessage 订阅消息
type SubscribeMessage struct {
ToUser string `json:"touser"`
TemplateID string `json:"template_id"`
Page string `json:"page,omitempty"`
MiniprogramState MiniprogramState `json:"miniprogram_state,omitempty"`
Data map[string]SubscribeMessageValue `json:"data"`
}
type SubscribeMessageValue struct {
Value string `json:"value"`
}
// MiniprogramState 跳转小程序类型
type MiniprogramState = string
// developer为开发版;trial为体验版;formal为正式版;默认为正式版
const (
MiniprogramStateDeveloper MiniprogramState = "developer"
MiniprogramStateTrial MiniprogramState = "trial"
MiniprogramStateFormal MiniprogramState = "formal"
)
// Send 发送订阅消息
//
// token access_token
func (cli *Client) SendSubscribeMsg(msg *SubscribeMessage) (*request.CommonError, error) {
api := baseURL + apiSendSubscribeMessage
token, err := cli.AccessToken()
if err != nil {
return nil, err
}
return cli.sendSubscribeMsg(api, token, msg)
}
func (cli *Client) sendSubscribeMsg(api, token string, msg *SubscribeMessage) (*request.CommonError, error) {
api, err := tokenAPI(api, token)
if err != nil {
return nil, err
}
res := new(request.CommonError)
if err := cli.request.Post(api, msg, res); err != nil {
return nil, err
}
return res, nil
}