Browse Source

公众号菜单:上传微信公众号素材永久图片,图库

zhengchengwu 5 years ago
parent
commit
7a0df2f0cd

+ 76 - 13
controllers/mpwechat/material_controller.go View File

3
 import (
3
 import (
4
 	base_ctl "SCRM/controllers"
4
 	base_ctl "SCRM/controllers"
5
 	"SCRM/enums"
5
 	"SCRM/enums"
6
+	"SCRM/models"
6
 	"SCRM/service/wechat_service"
7
 	"SCRM/service/wechat_service"
7
-	"SCRM/utils"
8
 	"bytes"
8
 	"bytes"
9
+	"encoding/json"
9
 	"mime/multipart"
10
 	"mime/multipart"
10
 	"sync"
11
 	"sync"
12
+	"time"
11
 
13
 
12
 	"io"
14
 	"io"
15
+	"io/ioutil"
13
 
16
 
14
 	"github.com/astaxie/beego"
17
 	"github.com/astaxie/beego"
15
 	"github.com/astaxie/beego/httplib"
18
 	"github.com/astaxie/beego/httplib"
17
 
20
 
18
 func MpMaterialCtlRegistRouters() {
21
 func MpMaterialCtlRegistRouters() {
19
 	beego.Router("/api/mpwechat/media/add_material", &MpMaterialAPIController{}, "Post:AddMaterial")
22
 	beego.Router("/api/mpwechat/media/add_material", &MpMaterialAPIController{}, "Post:AddMaterial")
23
+	beego.Router("/api/mpwechat/media/material", &MpMaterialAPIController{}, "Get:GetMaterials")
20
 }
24
 }
21
 
25
 
22
 type MpMaterialAPIController struct {
26
 type MpMaterialAPIController struct {
46
 		return
50
 		return
47
 	}
51
 	}
48
 	if authorization == nil || authorization.AuthorizerStatus != 1 {
52
 	if authorization == nil || authorization.AuthorizerStatus != 1 {
49
-		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:(公众号未授权)")
53
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:(公众号未授权)")
50
 		return
54
 		return
51
 	}
55
 	}
52
 
56
 
53
 	file, head, err := c.GetFile("file")
57
 	file, head, err := c.GetFile("file")
54
 	if err != nil {
58
 	if err != nil {
55
-		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:("+err.Error()+")")
59
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err.Error()+")")
56
 		return
60
 		return
57
 	}
61
 	}
58
 	defer file.Close()
62
 	defer file.Close()
75
 		if field := &fields[i]; field.IsFile {
79
 		if field := &fields[i]; field.IsFile {
76
 			partWriter, err3 := multipartWriter.CreateFormFile(field.Name, field.FileName)
80
 			partWriter, err3 := multipartWriter.CreateFormFile(field.Name, field.FileName)
77
 			if err3 != nil {
81
 			if err3 != nil {
78
-				c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:("+err3.Error()+")")
82
+				c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err3.Error()+")")
79
 				return
83
 				return
80
 			}
84
 			}
81
 			if _, err3 = io.Copy(partWriter, field.Value); err3 != nil {
85
 			if _, err3 = io.Copy(partWriter, field.Value); err3 != nil {
82
-				c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:("+err3.Error()+")")
86
+				c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err3.Error()+")")
83
 				return
87
 				return
84
 			}
88
 			}
85
 		} else {
89
 		} else {
86
 			partWriter, err3 := multipartWriter.CreateFormField(field.Name)
90
 			partWriter, err3 := multipartWriter.CreateFormField(field.Name)
87
 			if err3 != nil {
91
 			if err3 != nil {
88
-				c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:("+err3.Error()+")")
92
+				c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err3.Error()+")")
89
 				return
93
 				return
90
 			}
94
 			}
91
 			if _, err3 = io.Copy(partWriter, field.Value); err3 != nil {
95
 			if _, err3 = io.Copy(partWriter, field.Value); err3 != nil {
92
-				c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:("+err3.Error()+")")
96
+				c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err3.Error()+")")
93
 				return
97
 				return
94
 			}
98
 			}
95
 		}
99
 		}
96
 	}
100
 	}
97
 
101
 
98
 	if err = multipartWriter.Close(); err != nil {
102
 	if err = multipartWriter.Close(); err != nil {
99
-		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:("+err.Error()+")")
103
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err.Error()+")")
100
 		return
104
 		return
101
 	}
105
 	}
102
 	requestBodyBytes := buffer.Bytes()
106
 	requestBodyBytes := buffer.Bytes()
104
 	url := "https://api.weixin.qq.com/cgi-bin/material/add_material?type=image&access_token=" + authorization.AuthorizerAccessToken
108
 	url := "https://api.weixin.qq.com/cgi-bin/material/add_material?type=image&access_token=" + authorization.AuthorizerAccessToken
105
 	res := httplib.Post(url)
109
 	res := httplib.Post(url)
106
 	res.Header("Content-Type", requestBodyType)
110
 	res.Header("Content-Type", requestBodyType)
107
-	res.Body(requestBodyBytes)
108
-	response := make(map[string]interface{}, 0)
109
-	res.ToJSON(&response)
110
-	utils.InfoLog("%v", response)
111
+	response, err := res.Body(requestBodyBytes).Response()
112
+	if err != nil {
113
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err.Error()+")")
114
+		return
115
+	}
116
+	respBody, err := ioutil.ReadAll(response.Body)
117
+	if err != nil {
118
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err.Error()+")")
119
+		return
120
+	}
121
+
122
+	var resMaterial wechat_service.ResAddMaterial
123
+	err = json.Unmarshal(respBody, &resMaterial)
124
+	if err != nil {
125
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err.Error()+")")
126
+		return
127
+	}
128
+	if resMaterial.ErrCode != 0 {
129
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+resMaterial.ErrMsg+")")
130
+		return
131
+	}
132
+	mediaID := resMaterial.MediaID
133
+	mediaUrl := resMaterial.URL
134
+	var media models.WechatMedias
135
+	media.UserOrgId = adminUserInfo.CurrentOrgId
136
+	media.MediaId = mediaID
137
+	media.MediaUrl = mediaUrl
138
+	media.Msgtype = "image"
139
+	media.MediaTitle = head.Filename
140
+	media.CreatedTime = time.Now().Unix()
141
+	media.UpdatedTime = time.Now().Unix()
142
+	media.MediaStatus = 1
143
+
144
+	err = wechat_service.SaveMaterial(&media)
145
+	if err != nil {
146
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err.Error()+")")
147
+		return
148
+	}
149
+
150
+	returnData := make(map[string]interface{}, 0)
151
+	returnData["media"] = media
152
+	c.ServeSuccessJSON(returnData)
153
+	return
154
+}
155
+
156
+func (c *MpMaterialAPIController) GetMaterials() {
157
+	page, _ := c.GetInt64("page", 1)
158
+	limit, _ := c.GetInt64("limit", 10)
159
+	mediaType := c.GetString("media_type")
160
+	if page <= 0 {
161
+		page = 1
162
+	}
163
+	if limit <= 0 {
164
+		limit = 10
165
+	}
166
+
167
+	adminUserInfo := c.GetAdminUserInfo()
168
+	medias, total, err := wechat_service.GetPageMaterials(adminUserInfo.CurrentOrgId, page, limit, mediaType)
169
+	if err != nil {
170
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "拉取失败:("+err.Error()+")")
171
+		return
172
+	}
111
 
173
 
112
 	returnData := make(map[string]interface{}, 0)
174
 	returnData := make(map[string]interface{}, 0)
113
-	returnData["ok"] = "msg"
175
+	returnData["medias"] = medias
176
+	returnData["total"] = total
114
 	c.ServeSuccessJSON(returnData)
177
 	c.ServeSuccessJSON(returnData)
115
 	return
178
 	return
116
 }
179
 }

+ 36 - 0
controllers/mpwechat/menu_controller.go View File

35
 		buttons = nil
35
 		buttons = nil
36
 	}
36
 	}
37
 
37
 
38
+	mediaIDs := make([]string, 0)
38
 	var menus wechat_service.SelfMenuInfo
39
 	var menus wechat_service.SelfMenuInfo
39
 	if buttons != nil {
40
 	if buttons != nil {
40
 		err = json.Unmarshal([]byte(buttons.ButtonFileds), &menus)
41
 		err = json.Unmarshal([]byte(buttons.ButtonFileds), &menus)
49
 		}
50
 		}
50
 
51
 
51
 		for index, menu := range menus.Button {
52
 		for index, menu := range menus.Button {
53
+			if menu.Type == "media_id" && len(menu.MediaId) > 0 {
54
+				mediaIDs = append(mediaIDs, menu.MediaId)
55
+			}
52
 			if _, exist := msgMap[menu.Key]; exist {
56
 			if _, exist := msgMap[menu.Key]; exist {
53
 				menus.Button[index].Message = msgMap[menu.Key]
57
 				menus.Button[index].Message = msgMap[menu.Key]
54
 			}
58
 			}
55
 			for sindex, sub := range menus.Button[index].SubButton {
59
 			for sindex, sub := range menus.Button[index].SubButton {
60
+				if sub.Type == "media_id" && len(sub.MediaId) > 0 {
61
+					mediaIDs = append(mediaIDs, sub.MediaId)
62
+				}
63
+
56
 				if _, exist := msgMap[sub.Key]; exist {
64
 				if _, exist := msgMap[sub.Key]; exist {
57
 					menus.Button[index].SubButton[sindex].Message = msgMap[sub.Key]
65
 					menus.Button[index].SubButton[sindex].Message = msgMap[sub.Key]
58
 				}
66
 				}
59
 			}
67
 			}
60
 		}
68
 		}
69
+		if len(mediaIDs) > 0 {
70
+			medias, err := wechat_service.FindMeterialsByMediaIDs(adminUserInfo.CurrentOrgId, "image", mediaIDs)
71
+			if err != nil {
72
+				c.ServeFailJsonSend(enums.ErrorCodeDataException, "获取菜单信息失败:("+err.Error()+")")
73
+				return
74
+			}
75
+			if len(medias) > 0 {
76
+				mediaMap := make(map[string]string, 0)
77
+				for _, media := range medias {
78
+					mediaMap[media.MediaId] = media.MediaUrl
79
+				}
80
+				for index, menu := range menus.Button {
81
+					if menu.Type == "media_id" && len(menu.MediaId) > 0 {
82
+						if _, exist := mediaMap[menu.MediaId]; exist {
83
+							menus.Button[index].MediaUrl = mediaMap[menu.MediaId]
84
+						}
85
+					}
86
+					for sindex, sub := range menus.Button[index].SubButton {
87
+						if sub.Type == "media_id" && len(sub.MediaId) > 0 {
88
+							if _, exist := mediaMap[sub.MediaId]; exist {
89
+								menus.Button[index].SubButton[sindex].MediaUrl = mediaMap[sub.MediaId]
90
+							}
91
+						}
92
+					}
93
+				}
94
+			}
95
+
96
+		}
61
 
97
 
62
 	}
98
 	}
63
 
99
 

+ 6 - 6
jobcron/open_wechat_job.go View File

155
 		var responseBytes []byte
155
 		var responseBytes []byte
156
 		responseBytes, err = util.PostJSON(uri, ReqRefreshToken)
156
 		responseBytes, err = util.PostJSON(uri, ReqRefreshToken)
157
 		if err != nil {
157
 		if err != nil {
158
-			utils.ErrorLog(" error: %s", err)
158
+			utils.ErrorLog("error: %s", err)
159
 			continue
159
 			continue
160
 		}
160
 		}
161
 
161
 
162
 		var res wechat_service.MPResult
162
 		var res wechat_service.MPResult
163
 		err = json.Unmarshal(responseBytes, &res)
163
 		err = json.Unmarshal(responseBytes, &res)
164
 		if err != nil {
164
 		if err != nil {
165
-			utils.ErrorLog(" error: %s", err)
165
+			utils.ErrorLog("%s, error: %s", item.AuthorizerAppid, err)
166
 			continue
166
 			continue
167
 		}
167
 		}
168
 
168
 
169
 		if res.ErrCode > 0 {
169
 		if res.ErrCode > 0 {
170
-			utils.ErrorLog(" error: %s", res.ErrMsg)
170
+			utils.ErrorLog("%s, error: %s", item.AuthorizerAppid, res.ErrMsg)
171
 			continue
171
 			continue
172
 		}
172
 		}
173
 
173
 
174
 		var accessToken wechat_service.RefreshToken
174
 		var accessToken wechat_service.RefreshToken
175
 		err = json.Unmarshal(responseBytes, &accessToken)
175
 		err = json.Unmarshal(responseBytes, &accessToken)
176
 		if err != nil {
176
 		if err != nil {
177
-			utils.ErrorLog("Unmarshal error: %s", err)
177
+			utils.ErrorLog("%s, Unmarshal error: %s", item.AuthorizerAppid, err)
178
 			continue
178
 			continue
179
 		}
179
 		}
180
 
180
 
184
 		info.UpdatedTime = time.Now().Unix()
184
 		info.UpdatedTime = time.Now().Unix()
185
 		err = wechat_service.SaveAuthorizationInfo(&info)
185
 		err = wechat_service.SaveAuthorizationInfo(&info)
186
 		if err != nil {
186
 		if err != nil {
187
-			utils.ErrorLog("Save error: %s", err)
187
+			utils.ErrorLog("%s,Save error: %s", item.AuthorizerAppid, err)
188
 			continue
188
 			continue
189
 		}
189
 		}
190
 
190
 
191
 		atKey := fmt.Sprintf("Patient:AccessToken[%s]", item.AuthorizerAppid)
191
 		atKey := fmt.Sprintf("Patient:AccessToken[%s]", item.AuthorizerAppid)
192
 		_, err = redisClient.Set(atKey, accessToken.AuthorizerAccessToken, 0).Result()
192
 		_, err = redisClient.Set(atKey, accessToken.AuthorizerAccessToken, 0).Result()
193
 		if err != nil {
193
 		if err != nil {
194
-			utils.ErrorLog("Save redis error: %s", err)
194
+			utils.ErrorLog("%s,Save redis error: %s", item.AuthorizerAppid, err)
195
 			continue
195
 			continue
196
 		}
196
 		}
197
 	}
197
 	}

+ 1 - 1
main.go View File

18
 
18
 
19
 	//微信开放平台
19
 	//微信开放平台
20
 	go func() {
20
 	go func() {
21
-		jobcron.RequestComponentAccessToken()
21
+		// jobcron.RequestComponentAccessToken()
22
 		jobcron.RequestMpWechatAccessToken()
22
 		jobcron.RequestMpWechatAccessToken()
23
 		// jobcron.ReqJsapiTicket()
23
 		// jobcron.ReqJsapiTicket()
24
 	}()
24
 	}()

+ 17 - 0
models/wechat_models.go View File

72
 func (AuthorizationButtons) TableName() string {
72
 func (AuthorizationButtons) TableName() string {
73
 	return "sgj_patient_authorization_buttons"
73
 	return "sgj_patient_authorization_buttons"
74
 }
74
 }
75
+
76
+type WechatMedias struct {
77
+	ID               int64  `gorm:"column:id" json:"id" form:"id"`
78
+	UserOrgId        int64  `gorm:"column:user_org_id" json:"user_org_id" form:"user_org_id"`
79
+	Msgtype          string `gorm:"column:msgtype" json:"msgtype" form:"msgtype"`
80
+	MediaId          string `gorm:"column:media_id" json:"media_id" form:"media_id"`
81
+	MediaTitle       string `gorm:"column:media_title" json:"media_title" form:"media_title"`
82
+	MediaDescription string `gorm:"column:media_description" json:"media_description" form:"media_description"`
83
+	MediaUrl         string `gorm:"column:media_url" json:"media_url" form:"media_url"`
84
+	UpdatedTime      int64  `gorm:"column:updated_time" json:"updated_time" form:"updated_time"`
85
+	MediaStatus      int64  `gorm:"column:media_status" json:"media_status" form:"media_status"`
86
+	CreatedTime      int64  `gorm:"column:created_time" json:"created_time" form:"created_time"`
87
+}
88
+
89
+func (WechatMedias) TableName() string {
90
+	return "sgj_patient_wechat_medias"
91
+}

+ 26 - 0
service/wechat_service/material_service.go View File

1
+package wechat_service
2
+
3
+import (
4
+	"SCRM/models"
5
+	"SCRM/service"
6
+)
7
+
8
+func SaveMaterial(m *models.WechatMedias) (err error) {
9
+	err = service.PatientWriteDB().Save(m).Error
10
+	return err
11
+}
12
+
13
+func FindMeterialsByMediaIDs(orgID int64, mediaType string, mediaIDs []string) (medias []models.WechatMedias, err error) {
14
+	err = service.PatientReadDB().Model(&models.WechatMedias{}).Where("media_id IN (?) and user_org_id=? AND msgtype=? and media_status=1", mediaIDs, orgID, mediaType).Limit(len(mediaIDs)).Find(&medias).Error
15
+	return
16
+}
17
+
18
+func GetPageMaterials(orgID, page, limit int64, mediaType string) (medias []*models.WechatMedias, total int64, err error) {
19
+	db := service.PatientReadDB().Model(&models.WechatMedias{}).Where("user_org_id=? and msgtype=? and media_status=1", orgID, mediaType)
20
+
21
+	offset := (page - 1) * limit
22
+
23
+	err = db.Count(&total).Order("id desc").Offset(offset).Limit(limit).Find(&medias).Error
24
+
25
+	return
26
+}

+ 9 - 0
service/wechat_service/open_wechat_model.go View File

82
 	ErrMsg  string `json:"errmsg"`
82
 	ErrMsg  string `json:"errmsg"`
83
 }
83
 }
84
 
84
 
85
+//ResAddMaterial 永久性素材上传返回的结果
86
+type ResAddMaterial struct {
87
+	MPResult
88
+
89
+	MediaID string `json:"media_id"`
90
+	URL     string `json:"url"`
91
+}
92
+
85
 //ComponentAccessToken 第三方平台主动向微信服务器请求第三方平台自己的component_access_token返回的数据结构
93
 //ComponentAccessToken 第三方平台主动向微信服务器请求第三方平台自己的component_access_token返回的数据结构
86
 type ComponentAccessToken struct {
94
 type ComponentAccessToken struct {
87
 	ComponentAccessToken string `json:"component_access_token"`
95
 	ComponentAccessToken string `json:"component_access_token"`
159
 	Message   string           `json:"message,omitempty"`
167
 	Message   string           `json:"message,omitempty"`
160
 	URL       string           `json:"url,omitempty"`
168
 	URL       string           `json:"url,omitempty"`
161
 	MediaId   string           `json:"media_id,omitempty"`
169
 	MediaId   string           `json:"media_id,omitempty"`
170
+	MediaUrl  string           `json:"media_url,omitempty"`
162
 	SubButton []SelfMenuButton `json:"sub_button,omitempty"`
171
 	SubButton []SelfMenuButton `json:"sub_button,omitempty"`
163
 }
172
 }
164
 
173