Selaa lähdekoodia

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

zhengchengwu 4 vuotta sitten
vanhempi
commit
7a0df2f0cd

+ 76 - 13
controllers/mpwechat/material_controller.go Näytä tiedosto

@@ -3,13 +3,16 @@ package mpwechat
3 3
 import (
4 4
 	base_ctl "SCRM/controllers"
5 5
 	"SCRM/enums"
6
+	"SCRM/models"
6 7
 	"SCRM/service/wechat_service"
7
-	"SCRM/utils"
8 8
 	"bytes"
9
+	"encoding/json"
9 10
 	"mime/multipart"
10 11
 	"sync"
12
+	"time"
11 13
 
12 14
 	"io"
15
+	"io/ioutil"
13 16
 
14 17
 	"github.com/astaxie/beego"
15 18
 	"github.com/astaxie/beego/httplib"
@@ -17,6 +20,7 @@ import (
17 20
 
18 21
 func MpMaterialCtlRegistRouters() {
19 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 26
 type MpMaterialAPIController struct {
@@ -46,13 +50,13 @@ func (c MpMaterialAPIController) AddMaterial() {
46 50
 		return
47 51
 	}
48 52
 	if authorization == nil || authorization.AuthorizerStatus != 1 {
49
-		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:(公众号未授权)")
53
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:(公众号未授权)")
50 54
 		return
51 55
 	}
52 56
 
53 57
 	file, head, err := c.GetFile("file")
54 58
 	if err != nil {
55
-		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:("+err.Error()+")")
59
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err.Error()+")")
56 60
 		return
57 61
 	}
58 62
 	defer file.Close()
@@ -75,28 +79,28 @@ func (c MpMaterialAPIController) AddMaterial() {
75 79
 		if field := &fields[i]; field.IsFile {
76 80
 			partWriter, err3 := multipartWriter.CreateFormFile(field.Name, field.FileName)
77 81
 			if err3 != nil {
78
-				c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:("+err3.Error()+")")
82
+				c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err3.Error()+")")
79 83
 				return
80 84
 			}
81 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 87
 				return
84 88
 			}
85 89
 		} else {
86 90
 			partWriter, err3 := multipartWriter.CreateFormField(field.Name)
87 91
 			if err3 != nil {
88
-				c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:("+err3.Error()+")")
92
+				c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err3.Error()+")")
89 93
 				return
90 94
 			}
91 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 97
 				return
94 98
 			}
95 99
 		}
96 100
 	}
97 101
 
98 102
 	if err = multipartWriter.Close(); err != nil {
99
-		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "上传失败:("+err.Error()+")")
103
+		c.ServeFailJsonSend(enums.ErrorCodeDBCreate, "上传失败:("+err.Error()+")")
100 104
 		return
101 105
 	}
102 106
 	requestBodyBytes := buffer.Bytes()
@@ -104,13 +108,72 @@ func (c MpMaterialAPIController) AddMaterial() {
104 108
 	url := "https://api.weixin.qq.com/cgi-bin/material/add_material?type=image&access_token=" + authorization.AuthorizerAccessToken
105 109
 	res := httplib.Post(url)
106 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 174
 	returnData := make(map[string]interface{}, 0)
113
-	returnData["ok"] = "msg"
175
+	returnData["medias"] = medias
176
+	returnData["total"] = total
114 177
 	c.ServeSuccessJSON(returnData)
115 178
 	return
116 179
 }

+ 36 - 0
controllers/mpwechat/menu_controller.go Näytä tiedosto

@@ -35,6 +35,7 @@ func (c *MpMenusAPIController) GetMenus() {
35 35
 		buttons = nil
36 36
 	}
37 37
 
38
+	mediaIDs := make([]string, 0)
38 39
 	var menus wechat_service.SelfMenuInfo
39 40
 	if buttons != nil {
40 41
 		err = json.Unmarshal([]byte(buttons.ButtonFileds), &menus)
@@ -49,15 +50,50 @@ func (c *MpMenusAPIController) GetMenus() {
49 50
 		}
50 51
 
51 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 56
 			if _, exist := msgMap[menu.Key]; exist {
53 57
 				menus.Button[index].Message = msgMap[menu.Key]
54 58
 			}
55 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 64
 				if _, exist := msgMap[sub.Key]; exist {
57 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 Näytä tiedosto

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

+ 1 - 1
main.go Näytä tiedosto

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

+ 17 - 0
models/wechat_models.go Näytä tiedosto

@@ -72,3 +72,20 @@ type AuthorizationButtons struct {
72 72
 func (AuthorizationButtons) TableName() string {
73 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 Näytä tiedosto

@@ -0,0 +1,26 @@
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 Näytä tiedosto

@@ -82,6 +82,14 @@ type MPResult struct {
82 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 93
 //ComponentAccessToken 第三方平台主动向微信服务器请求第三方平台自己的component_access_token返回的数据结构
86 94
 type ComponentAccessToken struct {
87 95
 	ComponentAccessToken string `json:"component_access_token"`
@@ -159,6 +167,7 @@ type SelfMenuButton struct {
159 167
 	Message   string           `json:"message,omitempty"`
160 168
 	URL       string           `json:"url,omitempty"`
161 169
 	MediaId   string           `json:"media_id,omitempty"`
170
+	MediaUrl  string           `json:"media_url,omitempty"`
162 171
 	SubButton []SelfMenuButton `json:"sub_button,omitempty"`
163 172
 }
164 173