浏览代码

1112PM by wangfei

wangfei 6 年前
父节点
当前提交
c1e27af93f
共有 6 个文件被更改,包括 189 次插入8 次删除
  1. 0
    1
      conf/app.conf
  2. 2
    1
      conf/wechat.conf
  3. 90
    1
      controllers/component.go
  4. 66
    1
      models/autoreply/autoreply.go
  5. 20
    0
      service/autoreply/autoreply.go
  6. 11
    4
      utils/wechat.go

+ 0
- 1
conf/app.conf 查看文件

@@ -14,4 +14,3 @@ allowOrigin = http://localhost:9528
14 14
 # GET, POST etc
15 15
 allowMethods = *
16 16
 
17
-

+ 2
- 1
conf/wechat.conf 查看文件

@@ -1,2 +1,3 @@
1
-appid = test
1
+[wechat]
2
+appid = appid
2 3
 aeskey = aeskey

+ 90
- 1
controllers/component.go 查看文件

@@ -3,11 +3,30 @@ package controllers
3 3
 import (
4 4
 	"encoding/base64"
5 5
 	"io/ioutil"
6
+	"net/http"
7
+	"wechat-conf/models"
8
+	"wechat-conf/models/model"
9
+	"wechat-conf/service/autoreply"
6 10
 	"wechat-conf/utils"
7 11
 
12
+	"github.com/kinisky564477/wechat/component"
13
+
8 14
 	"github.com/zjxpcyc/wechat/core"
9 15
 )
10 16
 
17
+// WechatController 用户
18
+type WechatController struct {
19
+	BaseController
20
+	serv *autoreply.AutoreplyServ
21
+}
22
+
23
+// Constructor 初始化 Controller
24
+// @Title Constructor
25
+// @Description 初始化 Controller, 系统自动调用
26
+func (c *WechatController) Constructor() {
27
+	c.serv = autoreply.NewAutoreplyServ(c.Context)
28
+}
29
+
11 30
 const (
12 31
 	INFOTYPE_TICKET           = "component_verify_ticket"
13 32
 	INFOTYPE_AUTHORIZED       = "authorized"
@@ -16,7 +35,7 @@ const (
16 35
 )
17 36
 
18 37
 // ComponentPush 第三方平台推送
19
-func (c *BaseController) ComponentPush() {
38
+func (c *WechatController) ComponentPush() {
20 39
 	r := c.Ctx.Request
21 40
 	defer r.Body.Close()
22 41
 	con, _ := ioutil.ReadAll(r.Body)
@@ -70,5 +89,75 @@ func (c *BaseController) ComponentPush() {
70 89
 		// 取消授权
71 90
 		break
72 91
 	}
92
+}
93
+
94
+// WechatInfo 微信接入
95
+func (c *WechatController) WechatInfo() {
96
+	method := c.Ctx.Input.Method()
97
+	if method == http.MethodGet {
98
+		echostr := c.GetString("echostr")
99
+		c.ResponseRaw([]byte(echostr))
100
+	} else {
101
+		c.WxReceive()
102
+	}
103
+}
104
+
105
+// WxReceive 微信消息接收
106
+func (c *WechatController) WxReceive() {
107
+	appid := c.GetString(":appid")
108
+	wechat, err := utils.Component.GetWxClient(appid)
109
+	if err != nil {
110
+		utils.LogError("获取微信失败: " + err.Error())
111
+	}
112
+	val, err := wechat.TransformMessage(string(c.Ctx.Input.RequestBody))
113
+	if err != nil {
114
+		utils.LogError("读取微信服务发送内容失败: " + err.Error())
115
+		c.ResponseRaw([]byte(""))
116
+	}
73 117
 
118
+	var replay = new(model.TaAutoReply)
119
+	switch val["MsgType"] {
120
+	case "text":
121
+		content := val["Content"]
122
+		// 获取数据库存储返回类型
123
+		replay, err = c.serv.GetAutoReplayByAppID(appid, content)
124
+		break
125
+	case "event":
126
+		if val["Event"] == "subscribe" {
127
+			replay, err = c.serv.GetSubscribeByAppID(appid)
128
+		}
129
+		break
130
+	}
131
+	if err != nil {
132
+		utils.LogError("获取微信自动回复信息失败: " + err.Error())
133
+		c.ResponseRaw([]byte(""))
134
+	}
135
+
136
+	if replay == nil {
137
+		c.ResponseRaw([]byte(""))
138
+	}
139
+	openID := val["FromUserName"]
140
+	message, err := c.getReplayMessage(replay, openID, wechat)
141
+	if err != nil {
142
+		utils.LogError("转换回复信息失败: " + err.Error())
143
+		c.ResponseRaw([]byte(""))
144
+	}
145
+	c.ResponseRaw(message, false)
146
+	c.DestroyContext()
147
+	c.StopRun()
148
+}
149
+
150
+func (c *WechatController) getReplayMessage(replay *model.TaAutoReply, openid string, wx *component.WxClient) ([]byte, error) {
151
+	switch replay.MessageType {
152
+	case models.MESSAGE_TYPE_CONTENT:
153
+		msg, err := wx.ResponseMessageText(openid, replay.MessageParagraph)
154
+		return msg, err
155
+	case models.MESSAGE_TYPE_IMG:
156
+		msg, err := wx.ResponseMessageImage(openid, replay.MessageImg)
157
+		return msg, err
158
+		// case models.MESSAGE_TYPE_PARAGRAPH:
159
+		// 	msg, err := wx.ResponseMessageNews(openid, replay.MessageImg)
160
+		// 	return msg, err
161
+	}
162
+	return nil, nil
74 163
 }

+ 66
- 1
models/autoreply/autoreply.go 查看文件

@@ -32,7 +32,7 @@ FROM
32 32
 WHERE
33 33
 	org_id = '` + orgId + `'
34 34
 	AND auto_type = '` + autoType + `'
35
-	and status >`+ strconv.Itoa(models.STATUS_DEL)
35
+	and status >` + strconv.Itoa(models.STATUS_DEL)
36 36
 	sql += ` order by create_date desc limit ` + strconv.Itoa((page-1)*pagesize) + `, ` + strconv.Itoa(pagesize)
37 37
 	err := m.db.Sql(sql).Find(&autoreply)
38 38
 	return autoreply, err
@@ -105,3 +105,68 @@ WHERE
105 105
 	}
106 106
 	return nil, err
107 107
 }
108
+
109
+// GetAutoReplayByAppID 获取微信对应的自动回复信息
110
+func (m *AutoreplyDAO) GetAutoReplayByAppID(appid, val string) (*model.TaAutoReply, error) {
111
+	var reply []model.TaAutoReply
112
+	// 先查询精确查询
113
+	sql := `SELECT
114
+						a.*
115
+					FROM
116
+						ta_auto_reply a
117
+					INNER JOIN sys_org b ON a.org_id = b.org_id
118
+					INNER JOIN sys_wechat_conf c ON b.wechat_id = c.conf_id
119
+					INNER JOIN ta_auto_reply_keywords d ON a.auto_reply_id = d.auto_reply_id
120
+					WHERE
121
+						c.appid = ?
122
+					AND a.status > ?
123
+					AND b.status > ?
124
+					AND a.auto_type = ?
125
+					AND a.pair_type = ?
126
+					AND d.keywords = ? order by a.create_date desc`
127
+	err := m.db.Sql(sql, appid, models.STATUS_DEL, models.STATUS_DEL, models.AUTOREPLY_KEYWORDS, models.PAIR_TYPE_ACU, val).Find(&reply)
128
+	if err != nil {
129
+		return nil, err
130
+	}
131
+	if len(reply) > 0 {
132
+		return &reply[0], nil
133
+	}
134
+	// 模糊查询
135
+	sql = `SELECT
136
+						a.*
137
+					FROM
138
+						ta_auto_reply a
139
+					INNER JOIN sys_org b ON a.org_id = b.org_id
140
+					INNER JOIN sys_wechat_conf c ON b.wechat_id = c.conf_id
141
+					INNER JOIN ta_auto_reply_keywords d ON a.auto_reply_id = d.auto_reply_id
142
+					WHERE
143
+						c.appid = ?
144
+					AND a.status > ?
145
+					AND b.status > ?
146
+					AND a.auto_type = ?
147
+					AND a.pair_type = ?
148
+					AND ? like CONCAT('%', d.keywords, '%') order by a.create_date desc`
149
+	err = m.db.Sql(sql, appid, models.STATUS_DEL, models.STATUS_DEL, models.AUTOREPLY_KEYWORDS, models.PAIR_TYPE_BLUR, val).Find(&reply)
150
+	if err != nil {
151
+		return nil, err
152
+	}
153
+	if len(reply) > 0 {
154
+		return &reply[0], nil
155
+	}
156
+	return nil, nil
157
+}
158
+
159
+// GetSubscribeByAppID 获取微信关注自动回复
160
+func (m *AutoreplyDAO) GetSubscribeByAppID(appid string) (*model.TaAutoReply, error) {
161
+	var replys []model.TaAutoReply
162
+	sql := `select a.* from ta_auto_reply a inner join sys_org b on a.org_id=b.org_id
163
+	inner join sys_wechat_conf c on b.wechat_id = c.conf_id where c.appid=? and a.auto_type=? and a.status>? and b.status>? order by a.create_date desc`
164
+	err := m.db.Sql(sql, appid, models.AUTOREPLY_SUBSCRIBE, models.STATUS_DEL, models.STATUS_DEL).Find(&replys)
165
+	if err != nil {
166
+		return nil, err
167
+	}
168
+	if len(replys) > 0 {
169
+		return &replys[0], nil
170
+	}
171
+	return nil, nil
172
+}

+ 20
- 0
service/autoreply/autoreply.go 查看文件

@@ -87,3 +87,23 @@ func (s *AutoreplyServ) DeleteAutoReply(autoreplyId string) error {
87 87
 	}
88 88
 	return nil
89 89
 }
90
+
91
+// GetAutoReplayByAppID 获取自动回复消息
92
+func (s *AutoreplyServ) GetAutoReplayByAppID(appid, val string) (*model.TaAutoReply, error) {
93
+	autoReplay, err := s.dao.GetAutoReplayByAppID(appid, val)
94
+	if err != nil {
95
+		utils.LogError("获取自动回复消息失败: " + err.Error())
96
+		return nil, errors.New("获取自动回复消息失败")
97
+	}
98
+	return autoReplay, err
99
+}
100
+
101
+// GetSubscribeByAppID 获取关注回复消息
102
+func (s *AutoreplyServ) GetSubscribeByAppID(appid string) (*model.TaAutoReply, error) {
103
+	autoReplay, err := s.dao.GetSubscribeByAppID(appid)
104
+	if err != nil {
105
+		utils.LogError("获取关注回复消息失败: " + err.Error())
106
+		return nil, errors.New("获取关注回复消息失败")
107
+	}
108
+	return autoReplay, err
109
+}

+ 11
- 4
utils/wechat.go 查看文件

@@ -2,6 +2,7 @@ package utils
2 2
 
3 3
 import (
4 4
 	"github.com/astaxie/beego/config"
5
+	"github.com/astaxie/beego/logs"
5 6
 	"github.com/kinisky564477/wechat/component"
6 7
 )
7 8
 
@@ -11,10 +12,16 @@ var Component *component.ComponentClient
11 12
 // ComponentInit 第三方初始化
12 13
 func ComponentInit() {
13 14
 	// 初始化第三方
14
-	var cert map[string]string
15
-	wechat, _ := config.NewConfig("ini", appRoot+"/conf/db.conf")
16
-	cert["component_appid"] = wechat.String("appid")
17
-	cert["aeskey"] = wechat.String("aeskey")
15
+
16
+	// 读取配置文件
17
+	conf, err := config.NewConfig("ini", GetAppRoot()+"/conf/wechat.conf")
18
+	if err != nil {
19
+		logs.Error("读取微信配置文件失败")
20
+	}
21
+	var cert = map[string]string{
22
+		"component_appid": conf.String("wechat::appid"),
23
+		"aeskey":          conf.String("wechat::aeskey"),
24
+	}
18 25
 	Component = component.NewComponentClient(cert)
19 26
 }
20 27