-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathcomponent.go
More file actions
209 lines (186 loc) · 5.56 KB
/
component.go
File metadata and controls
209 lines (186 loc) · 5.56 KB
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
package component
import (
"encoding/base64"
"encoding/json"
"encoding/xml"
"errors"
"log"
"strings"
"time"
"github.com/wei193/component/wechat"
)
//Component 第三平台信息
type Component struct {
ComponentAppid string
ComponentAppsecret string
ComponentToken string
ComponentAesKey string
ComponentVerifyTicket string
ComponentAccessToken string
AccessTokenExpires int64
AESKey []byte
}
// XEncryptMsg 消息
type XEncryptMsg struct {
AppID string `xml:"AppId"`
Encrypt string `xml:"Encrypt"`
}
//XCEvent ticket协议和推送授权相关通知
type XCEvent struct {
AppID string `xml:"AppId"`
CreateTime string `xml:"CreateTime"`
InfoType string `xml:"InfoType"`
ComponentVerifyTicket string `xml:"ComponentVerifyTicket"`
AuthorizerAppid string `xml:"AuthorizerAppid"`
AuthorizationCode string `xml:"AuthorizationCode"`
AuthorizationCodeExpiredTime int `xml:"AuthorizationCodeExpiredTime"`
PreAuthCode string `xml:"PreAuthCode"`
}
//JPreAuthCode 预授权码
type JPreAuthCode struct {
PreAuthCode string `json:"pre_auth_code"`
ExpiresIn int `json:"expires_in"`
}
//JComponenAccessToken JComponenAccessToken
type JComponenAccessToken struct {
ComponentAccessToken string `json:"component_access_token"`
ExpiresIn int `json:"expires_in"`
}
//NewComponent 新建第三方平台
func NewComponent(appid, appsecret, token, aeskey, verifyticket, accesstoken string, expires int64) (component *Component, err error) {
AESKey, err := base64.StdEncoding.DecodeString(aeskey + "=")
if err != nil {
return nil, err
}
component = &Component{
ComponentAppid: appid,
ComponentAppsecret: appsecret,
ComponentToken: token,
ComponentAesKey: aeskey,
ComponentVerifyTicket: verifyticket,
ComponentAccessToken: accesstoken,
AccessTokenExpires: expires,
AESKey: AESKey,
}
return component, nil
}
//GetPreAuthCode 获取预授权码
func (c *Component) GetPreAuthCode() (authcode JPreAuthCode, err error) {
type st struct {
ComponentAppid string `json:"component_appid"`
}
d := st{
ComponentAppid: c.ComponentAppid,
}
req, err := createRequset("https://api.weixin.qq.com/cgi-bin/component/api_create_preauthcode?component_access_token="+c.ComponentAccessToken,
"POST", nil, d)
if err != nil {
return authcode, err
}
res, err := requsetJosn(req)
if err != nil {
return authcode, err
}
log.Println(string(res))
err = json.Unmarshal(res, &authcode)
if err != nil {
return authcode, err
}
return
}
//AuthEventTicket 授权事件接收处理
func (c *Component) AuthEventTicket(msg, signature, timestamp, nonce string) (event *XCEvent, err error) {
isok := c.CheckSignature(signature, msg, timestamp, nonce)
if !isok {
return nil, errors.New("Check Signature Error")
}
if len(msg) == 0 {
return nil, errors.New("Msg Error")
}
result, err := c.MsgDecrypt(msg)
if err != nil {
return nil, errors.New("Msg Decrypt Error")
}
s := strings.Index(result, "<")
e := strings.LastIndex(result, ">")
if s == -1 || e == -1 {
return nil, errors.New("Msg Font Error")
}
event = new(XCEvent)
err = xml.Unmarshal([]byte(result[s:e+1]), event)
if err != nil {
return nil, errors.New("xml Unmarshal Error")
}
switch event.InfoType {
case "component_verify_ticket":
c.ComponentVerifyTicket = event.ComponentVerifyTicket
}
return event, nil
}
//GetComponentAccessToken 获取第三方AccessToken
func (c *Component) GetComponentAccessToken() (token *JComponenAccessToken, err error) {
type st struct {
ComponentAppid string `json:"component_appid"`
ComponentAppsecret string `json:"component_appsecret"`
ComponentVerifyTicket string `json:"component_verify_ticket"`
}
d := st{
ComponentAppid: c.ComponentAppid,
ComponentAppsecret: c.ComponentAppsecret,
ComponentVerifyTicket: c.ComponentVerifyTicket,
}
req, err := createRequset("https://api.weixin.qq.com/cgi-bin/component/api_component_token",
"POST", nil, d)
if err != nil {
return nil, err
}
res, err := requsetJosn(req)
if err != nil {
return nil, err
}
log.Println(string(res))
token = new(JComponenAccessToken)
err = json.Unmarshal(res, token)
if err != nil {
return nil, err
}
c.ComponentAccessToken = token.ComponentAccessToken
c.AccessTokenExpires = time.Now().Unix() + int64(token.ExpiresIn)
return token, nil
}
//QueryAuth 使用授权码换取公众号或小程序的接口调用凭据和授权信息
func (c *Component) QueryAuth(code string) (authorizer *Authorizer, err error) {
type st struct {
ComponentAppid string `json:"component_appid"`
AuthorizationCode string `json:"authorization_code"`
}
d := st{
ComponentAppid: c.ComponentAppid,
AuthorizationCode: code,
}
req, err := createRequset("https://api.weixin.qq.com/cgi-bin/component/api_query_auth?component_access_token="+c.ComponentAccessToken,
"POST", nil, d)
if err != nil {
return nil, err
}
res, err := requsetJosn(req)
if err != nil {
return nil, err
}
log.Println(string(res))
var auth JAuthorizer
err = json.Unmarshal(res, &auth)
if err != nil {
return nil, err
}
authorizer = &Authorizer{
Component: c,
Wechat: &wechat.Wechat{
Appid: auth.AuthorizationInfo.AuthorizerAppid,
AccessToken: auth.AuthorizationInfo.AuthorizerAccessToken,
AccessTokenExpires: time.Now().Unix() + int64(auth.AuthorizationInfo.ExpiresIn),
},
AuthorizerRefreshToken: auth.AuthorizationInfo.AuthorizerRefreshToken,
}
return authorizer, nil
}