ソースを参照

自定义菜单接口

zhengchengwu 5 年 前
コミット
c92aca6295

+ 143 - 1
controllers/mpwechat/menu_controller.go ファイルの表示

@@ -3,7 +3,9 @@ package mpwechat
3 3
 import (
4 4
 	base_ctl "SCRM/controllers"
5 5
 	"SCRM/enums"
6
+	"SCRM/models"
6 7
 	"SCRM/service/wechat_service"
8
+	"time"
7 9
 
8 10
 	"encoding/json"
9 11
 
@@ -12,6 +14,7 @@ import (
12 14
 
13 15
 func MpMenusCtlRegistRouters() {
14 16
 	beego.Router("/api/mpwechat/menus", &MpMenusAPIController{}, "Get:GetMenus")
17
+	beego.Router("/api/mpwechat/savemenus", &MpMenusAPIController{}, "Put:SaveMenus")
15 18
 }
16 19
 
17 20
 type MpMenusAPIController struct {
@@ -22,7 +25,7 @@ func (c *MpMenusAPIController) GetMenus() {
22 25
 
23 26
 	adminUserInfo := c.GetAdminUserInfo()
24 27
 
25
-	buttons, err := wechat_service.GetMenusByOrgID(adminUserInfo.CurrentOrgId)
28
+	buttons, err := wechat_service.GetOrgMenusWithMsgs(adminUserInfo.CurrentOrgId)
26 29
 	if err != nil {
27 30
 		c.ServeFailJsonSend(enums.ErrorCodeDataException, "读取菜单配置信息失败:("+err.Error()+")")
28 31
 		return
@@ -38,6 +41,23 @@ func (c *MpMenusAPIController) GetMenus() {
38 41
 			c.ServeFailJsonSend(enums.ErrorCodeDataException, "解析菜单配置信息失败:("+err.Error()+")")
39 42
 			return
40 43
 		}
44
+
45
+		msgMap := make(map[string]string, 0)
46
+		for _, msg := range buttons.Messages {
47
+			msgMap[msg.MessageKeyName] = msg.MessageContent
48
+		}
49
+
50
+		for index, menu := range menus.Button {
51
+			if _, exist := msgMap[menu.Key]; exist {
52
+				menus.Button[index].Message = msgMap[menu.Key]
53
+			}
54
+			for sindex, sub := range menus.Button[index].SubButton {
55
+				if _, exist := msgMap[sub.Key]; exist {
56
+					menus.Button[index].SubButton[sindex].Message = msgMap[sub.Key]
57
+				}
58
+			}
59
+		}
60
+
41 61
 	}
42 62
 
43 63
 	returnData := make(map[string]interface{}, 0)
@@ -46,3 +66,125 @@ func (c *MpMenusAPIController) GetMenus() {
46 66
 	c.ServeSuccessJSON(returnData)
47 67
 	return
48 68
 }
69
+
70
+func (c *MpMenusAPIController) SaveMenus() {
71
+	adminUserInfo := c.GetAdminUserInfo()
72
+	authorization, err := wechat_service.GetAuthorizationByOrgID(adminUserInfo.CurrentOrgId)
73
+	if err != nil {
74
+		c.ServeFailJsonSend(enums.ErrorCodeDataException, "保存菜单失败:("+err.Error()+")")
75
+		return
76
+	}
77
+	if authorization == nil || authorization.AuthorizerStatus != 1 {
78
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "保存菜单失败:(未授权)")
79
+		return
80
+	}
81
+
82
+	// 授权方公众号类型,0代表订阅号,1代表由历史老帐号升级后的订阅号,2代表服务号
83
+	// 授权方认证类型,-1代表未认证,0代表微信认证,1代表新浪微博认证,2代表腾讯微博认证,3代表已资质认证通过但还未通过名称认证,4代表已资质认证通过、还未通过名称认证,但通过了新浪微博认证,5代表已资质认证通过、还未通过名称认证,但通过了腾讯微博认证
84
+	if (authorization.AuthorizerServiceTypeInfo == 0 || authorization.AuthorizerServiceTypeInfo == 1) && authorization.AuthorizerVerifyTypeInfo == -1 {
85
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "保存菜单失败:(未认证的订阅号没有自定义菜单的接口权限)")
86
+		return
87
+	}
88
+	var buttons wechat_service.SelfMenuInfo
89
+
90
+	err = json.Unmarshal(c.Ctx.Input.RequestBody, &buttons)
91
+	if err != nil {
92
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "解析菜单失败:("+err.Error()+")")
93
+		return
94
+	}
95
+
96
+	clickMap := make(map[string]string, 0)
97
+	for pindex, button := range buttons.Button {
98
+		if button.Type == "click" && len(button.Key) > 0 && len(button.SubButton) == 0 {
99
+			clickMap[button.Key] = button.Message
100
+		}
101
+		if button.Type != "click" {
102
+			buttons.Button[pindex].Key = ""
103
+		}
104
+		if len(button.SubButton) > 0 {
105
+			for sindex, child := range button.SubButton {
106
+				if child.Type == "click" && len(child.Key) > 0 {
107
+					clickMap[child.Key] = child.Message
108
+				}
109
+				buttons.Button[pindex].SubButton[sindex].Message = ""
110
+
111
+				if child.Type != "click" {
112
+					buttons.Button[pindex].SubButton[sindex].Key = ""
113
+				}
114
+			}
115
+		}
116
+		buttons.Button[pindex].Message = ""
117
+	}
118
+	messages, err := wechat_service.GetOrgAllClickMessages(adminUserInfo.CurrentOrgId)
119
+	if err != nil {
120
+		c.ServeFailJsonSend(enums.ErrorCodeDataException, "保存菜单失败:("+err.Error()+")")
121
+		return
122
+	}
123
+	oldMsgs := make(map[string]models.AuthorizationMessageManagements)
124
+	for _, message := range messages {
125
+		if _, exist := clickMap[message.MessageKeyName]; exist {
126
+			msg := *message
127
+			oldMsgs[message.MessageKeyName] = msg
128
+		}
129
+	}
130
+
131
+	buttonFileds, err := json.Marshal(buttons)
132
+	if err != nil {
133
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "解析菜单失败:("+err.Error()+")")
134
+		return
135
+	}
136
+
137
+	timeNow := time.Now().Unix()
138
+	var saveButton wechat_service.Buttons
139
+	saveButton.UserOrgID = adminUserInfo.CurrentOrgId
140
+	saveButton.UpdatedTime = timeNow
141
+	saveButton.ButtonStatus = 1
142
+	saveButton.SendStatus = 0
143
+	saveButton.ButtonFileds = string(buttonFileds)
144
+
145
+	button, err := wechat_service.GetMenusByOrgID(adminUserInfo.CurrentOrgId)
146
+	if err != nil {
147
+		c.ServeFailJsonSend(enums.ErrorCodeDataException, "保存菜单失败:("+err.Error()+")")
148
+		return
149
+	}
150
+	if button != nil {
151
+		saveButton.ID = button.ID
152
+		saveButton.CreatedTime = button.CreatedTime
153
+	}
154
+
155
+	saveButton.Messages = make([]*models.AuthorizationMessageManagements, 0)
156
+	for keyName, Content := range clickMap {
157
+		var msg models.AuthorizationMessageManagements
158
+		msg.MessageMsgType = "event"
159
+		msg.MessageMsgEvent = "click"
160
+		msg.MessageContent = Content
161
+		msg.UpdatedTime = timeNow
162
+		msg.MessageStatus = 1
163
+		msg.MessageKeyName = keyName
164
+		msg.UserOrgId = adminUserInfo.CurrentOrgId
165
+
166
+		if _, exist := oldMsgs[keyName]; exist {
167
+			msg.ID = oldMsgs[keyName].ID
168
+			msg.CreatedTime = oldMsgs[keyName].CreatedTime
169
+		} else {
170
+			msg.CreatedTime = timeNow
171
+		}
172
+		saveButton.Messages = append(saveButton.Messages, &msg)
173
+	}
174
+
175
+	err = wechat_service.SaveButtons(&saveButton)
176
+	if err != nil {
177
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "保存菜单失败:("+err.Error()+")")
178
+		return
179
+	}
180
+	err = wechat_service.SendMpWechatMenus(authorization.AuthorizerAccessToken, buttonFileds)
181
+	if err != nil {
182
+		c.ServeFailJsonSend(enums.ErrorCodeDBUpdate, "保存菜单成功,但发布菜单到公众号失败:("+err.Error()+")")
183
+		return
184
+	}
185
+
186
+	returnData := make(map[string]interface{}, 0)
187
+	returnData["buttons"] = buttons
188
+	c.ServeSuccessJSON(returnData)
189
+	return
190
+}

+ 84 - 0
jobcron/open_wechat_job.go ファイルの表示

@@ -24,6 +24,13 @@ func init() {
24 24
 			RequestComponentAccessToken()
25 25
 		}()
26 26
 	})
27
+
28
+	openWechatCron.AddFunc("@every 1h30m", func() {
29
+		go func() {
30
+			RequestMpWechatAccessToken()
31
+		}()
32
+	})
33
+
27 34
 }
28 35
 
29 36
 func StartOpenWechatCron() {
@@ -114,3 +121,80 @@ func RequestComponentAccessToken() {
114 121
 
115 122
 	utils.InfoLog("Request ComponentAccessToken Finish.")
116 123
 }
124
+
125
+type ReqRefreshTokenStruct struct {
126
+	ComponentAppid         string `json:"component_appid"`
127
+	AuthorizerAppid        string `json:"authorizer_appid"`
128
+	AuthorizerRefreshToken string `json:"authorizer_refresh_token"`
129
+}
130
+
131
+func RequestMpWechatAccessToken() {
132
+	utils.InfoLog("Request MpWechatAccessToken start...")
133
+	mps, err := wechat_service.GetAuthorizations()
134
+	if err != nil {
135
+		utils.ErrorLog("get mps error: %s", err)
136
+		return
137
+	}
138
+
139
+	redisClient := service.RedisClient()
140
+	defer redisClient.Close()
141
+
142
+	componentAccessToken, err := redisClient.Get("sgj_patient:component_access_token").Result()
143
+	if err != nil {
144
+		utils.ErrorLog("get component_access_token error: %s", err)
145
+		return
146
+	}
147
+
148
+	for _, item := range mps {
149
+		var ReqRefreshToken ReqRefreshTokenStruct
150
+		ReqRefreshToken.ComponentAppid = appID
151
+		ReqRefreshToken.AuthorizerAppid = item.AuthorizerAppid
152
+		ReqRefreshToken.AuthorizerRefreshToken = item.AuthorizerRefreshToken
153
+
154
+		uri := fmt.Sprintf("%s?component_access_token=%s", "https://api.weixin.qq.com/cgi-bin/component/api_authorizer_token", componentAccessToken)
155
+		var responseBytes []byte
156
+		responseBytes, err = util.PostJSON(uri, ReqRefreshToken)
157
+		if err != nil {
158
+			utils.ErrorLog(" error: %s", err)
159
+			return
160
+		}
161
+
162
+		var res wechat_service.MPResult
163
+		err = json.Unmarshal(responseBytes, &res)
164
+		if err != nil {
165
+			utils.ErrorLog(" error: %s", err)
166
+			return
167
+		}
168
+
169
+		if res.ErrCode > 0 {
170
+			utils.ErrorLog(" error: %s", res.ErrMsg)
171
+			return
172
+		}
173
+
174
+		var accessToken wechat_service.RefreshToken
175
+		err = json.Unmarshal(responseBytes, &accessToken)
176
+		if err != nil {
177
+			utils.ErrorLog("Unmarshal error: %s", err)
178
+			continue
179
+		}
180
+
181
+		info := *item
182
+		info.AuthorizerAccessToken = accessToken.AuthorizerAccessToken
183
+		info.AuthorizerRefreshToken = accessToken.AuthorizerRefreshToken
184
+		info.UpdatedTime = time.Now().Unix()
185
+		err = wechat_service.SaveAuthorizationInfo(&info)
186
+		if err != nil {
187
+			utils.ErrorLog("Save error: %s", err)
188
+			continue
189
+		}
190
+
191
+		atKey := fmt.Sprintf("Patient:AccessToken[%s]", item.AuthorizerAppid)
192
+		_, err = redisClient.Set(atKey, accessToken.AuthorizerAccessToken, 0).Result()
193
+		if err != nil {
194
+			utils.ErrorLog("Save redis error: %s", err)
195
+			continue
196
+		}
197
+	}
198
+	utils.InfoLog("Request MpWechatAccessToken END")
199
+
200
+}

+ 3 - 2
main.go ファイルの表示

@@ -1,6 +1,7 @@
1 1
 package main
2 2
 
3 3
 import (
4
+	"SCRM/jobcron"
4 5
 	_ "SCRM/routers"
5 6
 	"SCRM/service"
6 7
 
@@ -18,10 +19,10 @@ func main() {
18 19
 	//微信开放平台
19 20
 	go func() {
20 21
 		// jobcron.RequestComponentAccessToken()
21
-		// jobcron.ReqRefreshToken()
22
+		// jobcron.RequestMpWechatAccessToken()
22 23
 		// jobcron.ReqJsapiTicket()
23 24
 	}()
24
-	// jobcron.StartOpenWechatCron()
25
+	jobcron.StartOpenWechatCron()
25 26
 
26 27
 	beego.Run()
27 28
 }

+ 2 - 40
service/wechat_service/authorization_service.go ファイルの表示

@@ -69,45 +69,7 @@ func SaveAuthorizationInfo(authorization *models.PatientAuthorizations) (err err
69 69
 	return
70 70
 }
71 71
 
72
-//GetTextReplyMessagesByKey 通过关键词搜索 user_org_id(机构ID)取信息
73
-func GetTextReplyMessagesByKey(userOrgID int64, keywrods string) (messages []*models.AuthorizationMessageManagements, err error) {
74
-	if len(keywrods) == 0 {
75
-		return
76
-	}
77
-
78
-	likekey := "%" + keywrods + "%"
79
-	err = service.PatientReadDB().Where("user_org_id=? AND message_msg_type='text' AND message_status=1 AND ((message_key_name LIKE ? AND message_key_type=1) OR (message_key_name = ? AND message_key_type=2))", userOrgID, likekey, keywrods).Order("id desc").Find(&messages).Error
72
+func GetAuthorizations() (mps []*models.PatientAuthorizations, err error) {
73
+	err = service.PatientReadDB().Where("authorizer_status = 1").Find(&mps).Error
80 74
 	return
81 75
 }
82
-
83
-//GetSubscribeReplyMessagesByOrgID 通过user_org_id(机构ID)取信息
84
-func GetSubscribeReplyMessagesByOrgID(orgID int64) (*models.AuthorizationMessageManagements, error) {
85
-
86
-	var message models.AuthorizationMessageManagements
87
-
88
-	err := service.PatientReadDB().Where("user_org_id=? AND message_msg_type='event' AND message_msg_event='subscribe' AND message_status=1", orgID).First(&message).Error
89
-	if err == gorm.ErrRecordNotFound {
90
-		return nil, nil
91
-	}
92
-	if err != nil {
93
-		return nil, err
94
-	}
95
-	return &message, nil
96
-
97
-}
98
-
99
-//GetClickButtonReplyMessagesByOrgID 通过user_org_id(机构ID)取信息
100
-func GetClickButtonReplyMessagesByOrgID(orgID int64, key string) (*models.AuthorizationMessageManagements, error) {
101
-
102
-	var message models.AuthorizationMessageManagements
103
-
104
-	err := service.PatientReadDB().Where("user_org_id=? AND message_msg_type='event' AND message_msg_event='click' AND message_key_name=? AND message_status=1", orgID, key).First(&message).Error
105
-	if err == gorm.ErrRecordNotFound {
106
-		return nil, nil
107
-	}
108
-	if err != nil {
109
-		return nil, err
110
-	}
111
-	return &message, nil
112
-
113
-}

+ 42 - 0
service/wechat_service/menu_service.go ファイルの表示

@@ -3,6 +3,7 @@ package wechat_service
3 3
 import (
4 4
 	"SCRM/models"
5 5
 	"SCRM/service"
6
+	"time"
6 7
 
7 8
 	"github.com/jinzhu/gorm"
8 9
 )
@@ -19,3 +20,44 @@ func GetMenusByOrgID(orgID int64) (*models.AuthorizationButtons, error) {
19 20
 	}
20 21
 	return &button, nil
21 22
 }
23
+
24
+func GetOrgMenusWithMsgs(orgID int64) (*Buttons, error) {
25
+	var button Buttons
26
+	err := service.PatientReadDB().Where("user_org_id=?", orgID).Order("id desc").Preload("Messages", "user_org_id=? AND message_msg_type='event' AND message_msg_event='click' AND message_status=1", orgID).First(&button).Error
27
+	if err == gorm.ErrRecordNotFound {
28
+		return nil, nil
29
+	}
30
+	if err != nil {
31
+		return nil, err
32
+	}
33
+	return &button, nil
34
+}
35
+
36
+type Buttons struct {
37
+	ID           int64  `gorm:"column:id" json:"id"`
38
+	UserOrgID    int64  `gorm:"column:user_org_id" json:"user_org_id"`
39
+	ButtonFileds string `gorm:"column:button_fileds" json:"button_fileds"`
40
+	CreatedTime  int64  `gorm:"column:created_time" json:"created_time"`
41
+	UpdatedTime  int64  `gorm:"column:updated_time" json:"updated_time"`
42
+	ButtonStatus int64  `gorm:"column:button_status" json:"button_status"`
43
+	SendStatus   int64  `gorm:"column:send_status" json:"send_status"`
44
+
45
+	Messages []*models.AuthorizationMessageManagements `gorm:"ForeignKey:user_org_id;association_foreignkey:user_org_id" json:"messages"`
46
+}
47
+
48
+func (Buttons) TableName() string {
49
+	return "sgj_patient_authorization_buttons"
50
+}
51
+
52
+func SaveButtons(menu *Buttons) (err error) {
53
+	tx := service.PatientWriteDB().Begin()
54
+
55
+	err = tx.Model(&models.AuthorizationMessageManagements{}).Where("user_org_id=? AND message_msg_type='event' AND message_msg_event='click'", menu.UserOrgID).Update(map[string]interface{}{"MessageStatus": 2, "UpdatedTime": time.Now().Unix()}).Error
56
+	if err != nil {
57
+		tx.Rollback()
58
+		return
59
+	}
60
+	err = tx.Save(menu).Error
61
+	tx.Commit()
62
+	return
63
+}

+ 53 - 0
service/wechat_service/messages_service.go ファイルの表示

@@ -0,0 +1,53 @@
1
+package wechat_service
2
+
3
+import (
4
+	"SCRM/models"
5
+	"SCRM/service"
6
+
7
+	"github.com/jinzhu/gorm"
8
+)
9
+
10
+//GetTextReplyMessagesByKey 通过关键词搜索 user_org_id(机构ID)取信息
11
+func GetTextReplyMessagesByKey(userOrgID int64, keywrods string) (messages []*models.AuthorizationMessageManagements, err error) {
12
+	if len(keywrods) == 0 {
13
+		return
14
+	}
15
+
16
+	likekey := "%" + keywrods + "%"
17
+	err = service.PatientReadDB().Where("user_org_id=? AND message_msg_type='text' AND message_status=1 AND ((message_key_name LIKE ? AND message_key_type=1) OR (message_key_name = ? AND message_key_type=2))", userOrgID, likekey, keywrods).Order("id desc").Find(&messages).Error
18
+	return
19
+}
20
+
21
+//GetSubscribeReplyMessagesByOrgID 通过user_org_id(机构ID)取信息
22
+func GetSubscribeReplyMessagesByOrgID(orgID int64) (*models.AuthorizationMessageManagements, error) {
23
+
24
+	var message models.AuthorizationMessageManagements
25
+
26
+	err := service.PatientReadDB().Where("user_org_id=? AND message_msg_type='event' AND message_msg_event='subscribe' AND message_status=1", orgID).First(&message).Error
27
+	if err == gorm.ErrRecordNotFound {
28
+		return nil, nil
29
+	}
30
+	if err != nil {
31
+		return nil, err
32
+	}
33
+	return &message, nil
34
+
35
+}
36
+
37
+//GetClickButtonReplyMessagesByOrgID 通过user_org_id(机构ID)取信息
38
+func GetClickButtonReplyMessagesByOrgID(orgID int64, key string) (*models.AuthorizationMessageManagements, error) {
39
+	var message models.AuthorizationMessageManagements
40
+	err := service.PatientReadDB().Where("user_org_id=? AND message_msg_type='event' AND message_msg_event='click' AND message_key_name=? AND message_status=1", orgID, key).First(&message).Error
41
+	if err == gorm.ErrRecordNotFound {
42
+		return nil, nil
43
+	}
44
+	if err != nil {
45
+		return nil, err
46
+	}
47
+	return &message, nil
48
+}
49
+
50
+func GetOrgAllClickMessages(orgID int64) (messages []*models.AuthorizationMessageManagements, err error) {
51
+	err = service.PatientReadDB().Where("user_org_id=? AND message_msg_type='event' AND message_msg_event='click'", orgID).Find(&messages).Error
52
+	return
53
+}

+ 13 - 5
service/wechat_service/open_wechat_model.go ファイルの表示

@@ -122,6 +122,7 @@ type AuthorizerInfo struct {
122 122
 		QrcodeURL       string                 `json:"qrcode_url"`
123 123
 		PrincipalName   string                 `json:"principal_name"`
124 124
 		BusinessInfo    BusinessInfo           `json:"business_info"`
125
+		FuncInfo        []FuncInfoItems        `json:"func_info"`
125 126
 	} `json:"authorizer_info"`
126 127
 }
127 128
 
@@ -150,12 +151,19 @@ type RRreqMenu struct {
150 151
 
151 152
 //SelfMenuButton 自定义菜单配置详情
152 153
 type SelfMenuButton struct {
153
-	Type      string           `json:"type"`
154 154
 	Name      string           `json:"name"`
155
-	Key       string           `json:"key"`
155
+	Type      string           `json:"type,omitempty"`
156
+	Key       string           `json:"key,omitempty"`
157
+	AppID     string           `json:"appid,omitempty"`
158
+	PagePath  string           `json:"pagepath,omitempty"`
159
+	Message   string           `json:"message,omitempty"`
156 160
 	URL       string           `json:"url,omitempty"`
157
-	Value     string           `json:"value,omitempty"`
158
-	Act       string           `json:"act,omitempty"`
159 161
 	MediaId   string           `json:"media_id,omitempty"`
160
-	SubButton []SelfMenuButton `json:"sub_button"`
162
+	SubButton []SelfMenuButton `json:"sub_button,omitempty"`
163
+}
164
+
165
+type RefreshToken struct {
166
+	AuthorizerAccessToken  string `json:"authorizer_access_token"`
167
+	ExpiresIn              int64  `json:"expires_in"`
168
+	AuthorizerRefreshToken string `json:"authorizer_refresh_token"`
161 169
 }

+ 59 - 0
service/wechat_service/open_wechat_service.go ファイルの表示

@@ -25,6 +25,7 @@ import (
25 25
 
26 26
 	"github.com/astaxie/beego"
27 27
 	"github.com/astaxie/beego/context"
28
+	"github.com/astaxie/beego/httplib"
28 29
 	"github.com/silenceper/wechat/util"
29 30
 )
30 31
 
@@ -434,3 +435,61 @@ func ComponentAPIGetAuthorizerInfo(AuthorizerAppid string, ComponentAccessToken
434 435
 	resp.Body.Close()
435 436
 	return body, nil
436 437
 }
438
+
439
+func PostJSON(uri string, jsonData []byte) ([]byte, error) {
440
+	// jsonData, err := json.Marshal(obj)
441
+	// if err != nil {
442
+	// 	return nil, err
443
+	// }
444
+
445
+	jsonData = bytes.Replace(jsonData, []byte("\\u003c"), []byte("<"), -1)
446
+	jsonData = bytes.Replace(jsonData, []byte("\\u003e"), []byte(">"), -1)
447
+	jsonData = bytes.Replace(jsonData, []byte("\\u0026"), []byte("&"), -1)
448
+
449
+	body := bytes.NewBuffer(jsonData)
450
+	response, err := http.Post(uri, "application/json;charset=utf-8", body)
451
+	if err != nil {
452
+		return nil, err
453
+	}
454
+	defer response.Body.Close()
455
+
456
+	if response.StatusCode != http.StatusOK {
457
+		return nil, fmt.Errorf("http get error : uri=%v , statusCode=%v", uri, response.StatusCode)
458
+	}
459
+	return ioutil.ReadAll(response.Body)
460
+}
461
+
462
+func SendMpWechatMenus(AuthorizerAccessToken string, jsonData []byte) (err error) {
463
+	//读取响应
464
+	body, err := PostJSON("https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+AuthorizerAccessToken, jsonData)
465
+	if err != nil {
466
+		return
467
+	}
468
+	var result MPResult
469
+	err = json.Unmarshal([]byte(body), &result)
470
+	if err != nil {
471
+		return
472
+	}
473
+	if result.ErrCode > 0 {
474
+		utils.ErrorLog("MPResult ERROR:%v", result)
475
+		err = errors.New(result.ErrMsg)
476
+		return
477
+	}
478
+	return
479
+
480
+}
481
+
482
+func DeleteMpWechatMenus(AuthorizerAccessToken string) (bool, error) {
483
+	uri := fmt.Sprintf("https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=%s", AuthorizerAccessToken)
484
+
485
+	b := httplib.Get(uri)
486
+	var result MPResult
487
+	err := b.ToJSON(&result)
488
+	if err != nil {
489
+		return false, err
490
+	}
491
+	if result.ErrCode > 0 {
492
+		return false, errors.New(result.ErrMsg)
493
+	}
494
+	return true, nil
495
+}