package svc import ( "applet/app/db" "applet/app/db/model" "applet/app/e" "applet/app/enum" "applet/app/md" "applet/app/utils" "applet/app/utils/cache" "encoding/json" "errors" "fmt" "github.com/gin-gonic/gin" "github.com/jinzhu/copier" "github.com/tidwall/gjson" "strings" "time" ) func GetMenu(c *gin.Context) { sysCfgDb := db.SysCfgDb{} sysCfgDb.Set() one, _ := sysCfgDb.SysCfgGetOne("wechat_menu") var menuList = make([]md.WechatButton, 0) if one != nil && one.Val != "" { json.Unmarshal([]byte(one.Val), &menuList) } else { token, err := GetWechatToken() if err != nil { e.OutErr(c, 400, err.Error()) return } var offcialMenuList = make([]md.OffcialWechatButton, 0) menu, err := utils.GetWechatSelfMenu(token) fmt.Println(menu) menuStr := gjson.Get(menu, "selfmenu_info.button").String() json.Unmarshal([]byte(menuStr), &offcialMenuList) for _, v := range offcialMenuList { var tmp = md.WechatButton{ Name: v.Name, Type: v.Type, Url: v.Url, Pagepath: v.Pagepath, Appid: v.Appid, SubButton: []md.WechatSubButton{}, } for _, v1 := range v.SubButton.List { var tmpSub = md.WechatSubButton{ Type: v1.Type, Name: v1.Name, Url: "", Pagepath: "", Appid: "", } if v1.Type == "miniprogram" { tmpSub.Pagepath = v1.Pagepath tmpSub.Appid = v1.Appid tmpSub.Url = v1.Url } if v1.Type == "view" { tmpSub.Url = v1.Url } tmp.SubButton = append(tmp.SubButton, tmpSub) } menuList = append(menuList, tmp) } sysCfgDb.SysCfgUpdate("wechat_menu", utils.SerializeStr(menuList)) } for k, v := range menuList { menuList[k].Url = strings.ReplaceAll(v.Url, "\\u0026", "&") for k1, v1 := range v.SubButton { menuList[k].SubButton[k1].Url = strings.ReplaceAll(v1.Url, "\\u0026", "&") } } replyContentSet := []map[string]string{ {"msgType": "text", "name": "文本"}, {"msgType": "image", "name": "图片"}, } res := map[string]interface{}{ "button": menuList, "replyContentSet": replyContentSet, } e.OutSuc(c, res, nil) } func SetMenu(c *gin.Context) { var args md.WechatReq if err := c.ShouldBindJSON(&args); err != nil { e.OutErr(c, e.ERR_INVALID_ARGS, err) return } sysCfgDb := db.SysCfgDb{} sysCfgDb.Set() sysCfgDb.SysCfgUpdate("wechat_menu", utils.SerializeStr(args.Button)) token, err := GetWechatToken() if err != nil { e.OutErr(c, 400, err.Error()) return } var param md.WechatParam copier.Copy(¶m, &args) for k, v := range param.Button { if v.Type == "click" { param.Button[k].Key = commSetModule(utils.SerializeStr(args.Button[k].ReplyContent)) } for k1, v1 := range v.SubButton { if v1.Type == "click" { param.Button[k].SubButton[k1].Key = commSetModule(utils.SerializeStr(args.Button[k].SubButton[k1].ReplyContent)) } } } fmt.Println(utils.SerializeStr(param)) menu, err := utils.SetWechatSelfMenu(token, param) if err != nil { e.OutErr(c, 400, err.Error()) return } if gjson.Get(menu, "errcode").Int() != 0 { e.OutErr(c, 400, e.NewErr(400, gjson.Get(menu, "errmsg").String())) return } e.OutSuc(c, "success", nil) return } func commSetModule(modData string) string { mod := &model.SysModule{ ModName: "official_account_custom_reply", SkipIdentifier: "pub.flutter.official_account_custom_reply", Title: "公众号菜单点击事件回复消息", Data: modData, CreateAt: time.Now(), } insert, err := db.Db.Insert(mod) fmt.Println(insert) fmt.Println(err) return "official_account_custom_reply" + "_" + utils.IntToStr(mod.ModId) } func GetWechatToken() (string, error) { sysCfgDb := db.SysCfgDb{} sysCfgDb.Set() res := sysCfgDb.SysCfgFindWithDb(enum.WxOfficialAccountAppId, enum.WxOfficialAccountAppSecret) key := "wechat_token1" redisStr, err := cache.GetString(key) token := redisStr if redisStr == "" || err != nil { tokenStr, _ := utils.GetWechatToken(res[enum.WxOfficialAccountAppId], res[enum.WxOfficialAccountAppSecret]) token = gjson.Get(tokenStr, "access_token").String() if token == "" { return "", errors.New(gjson.Get(tokenStr, "errmsg").String()) } expiresIn := gjson.Get(tokenStr, "expires_in").Int() cache.SetEx(key, token, int(expiresIn)) } return token, nil }