Browse Source

Merge branch 'master' of http://git.ycjcjy.com/default/wechat-conf

胡轶钦 6 years ago
parent
commit
bc8469fa30
3 changed files with 86 additions and 13 deletions
  1. 71
    6
      controllers/component.go
  2. 7
    0
      models/wechat/wechat.go
  3. 8
    7
      service/wechat/wechat.go

+ 71
- 6
controllers/component.go View File

3
 import (
3
 import (
4
 	"encoding/base64"
4
 	"encoding/base64"
5
 	"encoding/json"
5
 	"encoding/json"
6
+	"encoding/xml"
6
 	"io/ioutil"
7
 	"io/ioutil"
7
 	"net/http"
8
 	"net/http"
9
+	"strconv"
8
 	"wechat-conf/models"
10
 	"wechat-conf/models"
9
 	"wechat-conf/models/model"
11
 	"wechat-conf/models/model"
10
 	"wechat-conf/service/autoreply"
12
 	"wechat-conf/service/autoreply"
150
 		// 删除wechatConf信息,同时将org解绑
152
 		// 删除wechatConf信息,同时将org解绑
151
 		appid := msg["AuthorizerAppid"]
153
 		appid := msg["AuthorizerAppid"]
152
 		c.wechatServ.UnAuthorized(appid)
154
 		c.wechatServ.UnAuthorized(appid)
155
+		// 删除第三方中的微信信息
156
+		utils.Component.DelWxClient(appid)
153
 		break
157
 		break
154
 	}
158
 	}
155
 	c.ResponseRaw([]byte("success"))
159
 	c.ResponseRaw([]byte("success"))
168
 
172
 
169
 // WxReceive 微信消息接收
173
 // WxReceive 微信消息接收
170
 func (c *WechatController) WxReceive() {
174
 func (c *WechatController) WxReceive() {
175
+	beego.Error("微信消息接入")
171
 	appid := c.GetString(":appid")
176
 	appid := c.GetString(":appid")
172
 	wechat, err := utils.Component.GetWxClient(appid)
177
 	wechat, err := utils.Component.GetWxClient(appid)
173
 	if err != nil {
178
 	if err != nil {
174
 		utils.LogError("获取微信失败: " + err.Error())
179
 		utils.LogError("获取微信失败: " + err.Error())
175
 	}
180
 	}
176
-	val, err := wechat.TransformMessage(string(c.Ctx.Input.RequestBody))
181
+	msg, err := wechat.TransformMessage(string(c.Ctx.Input.RequestBody))
177
 	if err != nil {
182
 	if err != nil {
178
 		utils.LogError("读取微信服务发送内容失败: " + err.Error())
183
 		utils.LogError("读取微信服务发送内容失败: " + err.Error())
179
 		c.ResponseRaw([]byte(""))
184
 		c.ResponseRaw([]byte(""))
180
 	}
185
 	}
186
+	xp := &core.XMLParse{}
187
+	beego.Error("消息:", msg)
188
+	encrypt := msg["Encrypt"]
189
+	conf, err := c.wechatServ.GetComponentInfo()
190
+	if err != nil || conf == nil || conf.Appid == "" {
191
+		utils.LogError("读取微信配置文件失败")
192
+		c.ResponseRaw([]byte("success"))
193
+	}
194
+	EncodingAESKey := conf.Aeskey
181
 
195
 
196
+	AESKey, err := base64.StdEncoding.DecodeString(EncodingAESKey + "=")
197
+	if err != nil {
198
+		utils.LogError("DecodeString失败:", err)
199
+		c.ResponseRaw([]byte("success"))
200
+	}
201
+	EncryptVal, err := base64.StdEncoding.DecodeString(encrypt)
202
+	if err != nil {
203
+		utils.LogError("密文base64解析", err)
204
+		c.ResponseRaw([]byte("success"))
205
+	}
206
+	msgbyte, err := utils.AesDecrypt(EncryptVal, AESKey)
207
+	if err != nil {
208
+		utils.LogError("解密失败:", err)
209
+		c.ResponseRaw([]byte("success"))
210
+	}
211
+	utils.LogError("解密成功")
212
+	// 解析xml
213
+	val, err := xp.Parse(string(msgbyte))
214
+	if err != nil {
215
+		utils.LogError("xml解析失败:", err)
216
+		c.ResponseRaw([]byte("success"))
217
+	}
218
+	utils.LogError("xml解析成功:", val)
182
 	var replay = new(model.TaAutoReply)
219
 	var replay = new(model.TaAutoReply)
183
 	switch val["MsgType"] {
220
 	switch val["MsgType"] {
184
 	case "text":
221
 	case "text":
196
 		utils.LogError("获取微信自动回复信息失败: " + err.Error())
233
 		utils.LogError("获取微信自动回复信息失败: " + err.Error())
197
 		c.ResponseRaw([]byte(""))
234
 		c.ResponseRaw([]byte(""))
198
 	}
235
 	}
199
-
200
 	if replay == nil {
236
 	if replay == nil {
201
 		c.ResponseRaw([]byte(""))
237
 		c.ResponseRaw([]byte(""))
202
 	}
238
 	}
203
 	openID := val["FromUserName"]
239
 	openID := val["FromUserName"]
204
-	message, err := c.getReplayMessage(replay, openID, wechat)
240
+	signature := c.GetString("msg_signature")
241
+	nonce := c.GetString("nonce")
242
+	timestamp, _ := strconv.Atoi(c.GetString("timestamp"))
243
+	beego.Error("signature:", signature, ",nonce:", nonce, ",timestamp:", timestamp)
244
+	message, err := c.getReplayMessage(replay, openID, AESKey, wechat)
205
 	if err != nil {
245
 	if err != nil {
206
 		utils.LogError("转换回复信息失败: " + err.Error())
246
 		utils.LogError("转换回复信息失败: " + err.Error())
207
 		c.ResponseRaw([]byte(""))
247
 		c.ResponseRaw([]byte(""))
208
 	}
248
 	}
209
-	c.ResponseRaw(message, false)
249
+	// message, err = utils.AesEncrypt(message, AESKey)
250
+	// if err != nil {
251
+	// 	utils.LogError("加密失败:", err)
252
+	// 	c.ResponseRaw([]byte(""))
253
+	// }
254
+	// beego.Error(string(message))
255
+	// data := PassiveMessage{
256
+	// 	Encrypt:      component.CDATA{string(message)},
257
+	// 	MsgSignature: component.CDATA{signature},
258
+	// 	TimeStamp:    int64(timestamp),
259
+	// 	Nonce:        component.CDATA{nonce},
260
+	// }
261
+	// beego.Error(data)
262
+	// res, err := xml.Marshal(data)
263
+	// beego.Error(err)
264
+	// beego.Error(string(res))
265
+	c.ResponseRaw(message)
210
 	c.DestroyContext()
266
 	c.DestroyContext()
211
 	c.StopRun()
267
 	c.StopRun()
212
 }
268
 }
213
 
269
 
214
-func (c *WechatController) getReplayMessage(replay *model.TaAutoReply, openid string, wx *component.WxClient) ([]byte, error) {
270
+// PassiveMessage 加密后的返回信息
271
+type PassiveMessage struct {
272
+	XMLName      xml.Name        `xml:"xml"`
273
+	Encrypt      component.CDATA `xml:"Encrypt"`
274
+	MsgSignature component.CDATA `xml:"MsgSignature"`
275
+	TimeStamp    int64           `xml:"TimeStamp"`
276
+	Nonce        component.CDATA `xml:"Nonce"`
277
+}
278
+
279
+func (c *WechatController) getReplayMessage(replay *model.TaAutoReply, openid string, Aeskey []byte, wx *component.WxClient) ([]byte, error) {
215
 	switch replay.MessageType {
280
 	switch replay.MessageType {
216
-	case models.MESSAGE_TYPE_CONTENT:
281
+	case models.MESSAGE_TYPE_PARAGRAPH:
217
 		msg, err := wx.ResponseMessageText(openid, replay.MessageParagraph)
282
 		msg, err := wx.ResponseMessageText(openid, replay.MessageParagraph)
218
 		return msg, err
283
 		return msg, err
219
 	case models.MESSAGE_TYPE_IMG:
284
 	case models.MESSAGE_TYPE_IMG:

+ 7
- 0
models/wechat/wechat.go View File

107
 	_, err := m.db.Where("conf_id=?", confid).And("status>?", models.STATUS_DEL).Get(&conf)
107
 	_, err := m.db.Where("conf_id=?", confid).And("status>?", models.STATUS_DEL).Get(&conf)
108
 	return &conf, err
108
 	return &conf, err
109
 }
109
 }
110
+
111
+// DelWechatConf 删除微信信息
112
+func (m *WechatDAO) DelWechatConf(confid string) error {
113
+	sql := `delete from sys_wechat_conf where conf_id=?`
114
+	_, err := m.db.Exec(sql, confid)
115
+	return err
116
+}

+ 8
- 7
service/wechat/wechat.go View File

76
 		utils.LogError("解绑获取微信信息为空")
76
 		utils.LogError("解绑获取微信信息为空")
77
 		return nil
77
 		return nil
78
 	}
78
 	}
79
-	var wxConf = model.SysWechatConf{
80
-		ConfId: conf.ConfId,
81
-		Status: models.STATUS_DEL,
82
-	}
83
-	err = s.dao.UpdateWechatConf(wxConf, []string{
84
-		"status",
85
-	})
79
+	// var wxConf = model.SysWechatConf{
80
+	// 	ConfId: conf.ConfId,
81
+	// 	Status: models.STATUS_DEL,
82
+	// }
83
+	// err = s.dao.UpdateWechatConf(wxConf, []string{
84
+	// 	"status",
85
+	// })
86
+	err = s.dao.DelWechatConf(conf.ConfId)
86
 	if err != nil {
87
 	if err != nil {
87
 		return err
88
 		return err
88
 	}
89
 	}