-
Notifications
You must be signed in to change notification settings - Fork 277
/
message.go
180 lines (145 loc) · 3.33 KB
/
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
// Package message 消息
package message
import (
"encoding/json"
"errors"
"net/http"
"strings"
"github.com/medivhzhan/weapp"
"github.com/medivhzhan/weapp/util"
)
const (
sendAPI = "/cgi-bin/message/custom/send"
)
// MsgType 消息类型
type MsgType string
const (
// TextMsg 文本消息类型
TextMsg MsgType = "text"
// ImgMsg 图片消息类型
ImgMsg MsgType = "image"
// LinkMsg 图文链接消息类型
LinkMsg MsgType = "link"
// CardMsg 小程序卡片消息类型
CardMsg MsgType = "miniprogrampage"
// Event 事件类型
Event MsgType = "event"
)
// 消息体
type message struct {
Receiver string `json:"touser"` // user openID
Type MsgType `json:"msgtype"` // text | image | link | miniprogrampage
Text Text `json:"text,omitempty"`
Image Image `json:"image,omitempty"`
Link Link `json:"link,omitempty"`
Card Card `json:"miniprogrampage,omitempty"`
}
// Text 文本消息
// 支持添加可跳转小程序的文字链
type Text struct {
Content string `json:"content"`
}
// Image 图片消息
type Image struct {
MediaID string `json:"media_id"`
}
// Card 卡片消息
type Card struct {
Title string `json:"title"`
PagePath string `json:"pagepath"`
ThumbMediaID string `json:"thumb_media_id"`
}
// Link 图文链接消息
type Link struct {
Title string `json:"title"`
Description string `json:"description"`
URL string `json:"url"`
ThumbURL string `json:"thumb_url"`
}
// SendTo 发送文本消息
//
// @openID 用户openID
// @token 微信 access_token
func (msg Text) SendTo(openID, token string) (wres weapp.Response, err error) {
m := message{
Receiver: openID,
Type: "text",
Text: msg,
}
body, err := json.Marshal(m)
if err != nil {
return
}
return send(token, string(body))
}
// SendTo 发送图片消息
//
// @openID 用户openID
// @token 微信 access_token
func (msg Image) SendTo(openID, token string) (wres weapp.Response, err error) {
m := message{
Receiver: openID,
Type: "image",
Image: msg,
}
body, err := json.Marshal(m)
if err != nil {
return
}
return send(token, string(body))
}
// SendTo 发送图文链接消息
//
// @openID 用户openID
// @token 微信 access_token
func (msg Link) SendTo(openID, token string) (wres weapp.Response, err error) {
m := message{
Receiver: openID,
Type: "link",
Link: msg,
}
body, err := json.Marshal(m)
if err != nil {
return
}
return send(token, string(body))
}
// SendTo 发送卡片消息
//
// @openID 用户openID
// @token 微信 access_token
func (msg Card) SendTo(openID, token string) (wres weapp.Response, err error) {
m := message{
Receiver: openID,
Type: "miniprogrampage",
Card: msg,
}
body, err := json.Marshal(m)
if err != nil {
return
}
return send(token, string(body))
}
// send 发送消息
//
// @token 微信 access_token
func send(token, body string) (wres weapp.Response, err error) {
api, err := util.TokenAPI(weapp.BaseURL+sendAPI, token)
if err != nil {
return
}
res, err := http.Post(api, "application/json", strings.NewReader(body))
if err != nil {
return
}
defer res.Body.Close()
if res.StatusCode != 200 {
err = errors.New(weapp.WeChatServerError)
return
}
if err = json.NewDecoder(res.Body).Decode(&wres); err != nil {
return
}
err = errors.New(wres.Errmsg)
return
}