一物一码
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

125 lines
3.2 KiB

  1. package svc
  2. import (
  3. "applet/app/db"
  4. "applet/app/e"
  5. "applet/app/enum"
  6. "applet/app/md"
  7. "applet/app/utils"
  8. "applet/app/utils/cache"
  9. "encoding/json"
  10. "errors"
  11. "fmt"
  12. "github.com/gin-gonic/gin"
  13. "github.com/tidwall/gjson"
  14. )
  15. func GetMenu(c *gin.Context) {
  16. sysCfgDb := db.SysCfgDb{}
  17. sysCfgDb.Set()
  18. one, _ := sysCfgDb.SysCfgGetOne("wechat_menu")
  19. var menuList = make([]md.WechatButton, 0)
  20. if one != nil && one.Val != "" {
  21. json.Unmarshal([]byte(one.Val), &menuList)
  22. } else {
  23. token, err := GetWechatToken()
  24. if err != nil {
  25. e.OutErr(c, 400, err.Error())
  26. return
  27. }
  28. var offcialMenuList = make([]md.OffcialWechatButton, 0)
  29. menu, err := utils.GetWechatSelfMenu(token)
  30. fmt.Println(menu)
  31. menuStr := gjson.Get(menu, "selfmenu_info.button").String()
  32. json.Unmarshal([]byte(menuStr), &offcialMenuList)
  33. for _, v := range offcialMenuList {
  34. var tmp = md.WechatButton{
  35. Name: v.Name,
  36. Type: v.Type,
  37. Url: v.Url,
  38. Pagepath: v.Pagepath,
  39. Appid: v.Appid,
  40. SubButton: []md.WechatSubButton{},
  41. }
  42. for _, v1 := range v.SubButton.List {
  43. var tmpSub = md.WechatSubButton{
  44. Type: v1.Type,
  45. Name: v1.Name,
  46. Url: "",
  47. Pagepath: "",
  48. Appid: "",
  49. }
  50. if v1.Type == "miniprogram" {
  51. tmpSub.Pagepath = v1.Pagepath
  52. tmpSub.Appid = v1.Appid
  53. tmpSub.Url = v1.Url
  54. }
  55. if v1.Type == "view" {
  56. tmpSub.Url = v1.Url
  57. }
  58. tmp.SubButton = append(tmp.SubButton, tmpSub)
  59. }
  60. menuList = append(menuList, tmp)
  61. }
  62. sysCfgDb.SysCfgUpdate("wechat_menu", utils.SerializeStr(menuList))
  63. }
  64. replyContentSet := []map[string]string{
  65. {"msgType": "text", "name": "文本"},
  66. {"msgType": "image", "name": "图片"},
  67. {"msgType": "video", "name": "视频"},
  68. {"msgType": "voice", "name": "语音"},
  69. {"msgType": "article", "name": "文章"},
  70. }
  71. res := map[string]interface{}{
  72. "button": menuList,
  73. "replyContentSet": replyContentSet,
  74. }
  75. e.OutSuc(c, res, nil)
  76. }
  77. func SetMenu(c *gin.Context) {
  78. var args md.WechatReq
  79. if err := c.ShouldBindJSON(&args); err != nil {
  80. e.OutErr(c, e.ERR_INVALID_ARGS, err)
  81. return
  82. }
  83. sysCfgDb := db.SysCfgDb{}
  84. sysCfgDb.Set()
  85. sysCfgDb.SysCfgUpdate("wechat_menu", utils.SerializeStr(args.Button))
  86. token, err := GetWechatToken()
  87. if err != nil {
  88. e.OutErr(c, 400, err.Error())
  89. return
  90. }
  91. menu, err := utils.SetWechatSelfMenu(token, args)
  92. if err != nil {
  93. e.OutErr(c, 400, err.Error())
  94. return
  95. }
  96. if gjson.Get(menu, "errcode").Int() != 0 {
  97. e.OutErr(c, 400, e.NewErr(400, gjson.Get(menu, "errmsg").String()))
  98. return
  99. }
  100. e.OutSuc(c, "success", nil)
  101. return
  102. }
  103. func GetWechatToken() (string, error) {
  104. sysCfgDb := db.SysCfgDb{}
  105. sysCfgDb.Set()
  106. res := sysCfgDb.SysCfgFindWithDb(enum.WxOfficialAccountAppId, enum.WxOfficialAccountAppSecret)
  107. key := "wechat_token"
  108. redisStr, err := cache.GetString(key)
  109. token := redisStr
  110. if redisStr == "" || err != nil {
  111. tokenStr, _ := utils.GetWechatToken(res[enum.WxOfficialAccountAppId], res[enum.WxOfficialAccountAppSecret])
  112. token = gjson.Get(tokenStr, "access_token").String()
  113. if token == "" {
  114. return "", errors.New(gjson.Get(tokenStr, "errmsg").String())
  115. }
  116. expiresIn := gjson.Get(tokenStr, "expires_in").Int()
  117. cache.SetEx(key, token, int(expiresIn))
  118. }
  119. return token, nil
  120. }