Ver código fonte

公众号菜单接口

wwl 3 anos atrás
pai
commit
46f4d69e82

+ 1 - 28
twzd-admin/src/main/java/com/miaxis/system/controller/wx/WxgzhController.java → twzd-admin/src/main/java/com/miaxis/app/controller/wx/WxgzhController.java

@@ -1,20 +1,13 @@
-package com.miaxis.system.controller.wx;
+package com.miaxis.app.controller.wx;
 
-import com.alibaba.fastjson.JSONObject;
 import com.miaxis.common.constant.Constants;
-import com.miaxis.common.core.domain.Response;
-import com.miaxis.common.exception.CustomException;
 import com.miaxis.common.utils.wx.SignUtil;
-import com.miaxis.feign.service.IWxMpService;
-import com.miaxis.feign.service.IWxSendService;
 import com.miaxis.wx.service.IWxGzhService;
-import com.qcloud.cos.COSClient;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Value;
-import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestMethod;
 import org.springframework.web.bind.annotation.RestController;
@@ -35,8 +28,6 @@ import javax.servlet.http.HttpServletResponse;
 @Slf4j
 public class WxgzhController {
 
-    private final IWxSendService wxSendService;
-
     private final IWxGzhService wxGzhService;
 
     private final HttpServletRequest request;
@@ -49,24 +40,6 @@ public class WxgzhController {
     private String preffix;
 
 
-    /**{"errcode":40017,"errmsg":"invalid button type rid: 61777f8d-226e0008-464b894c"}
-     * 获取微信公众号菜单
-     * @return
-     */
-    @GetMapping(value = "sendWxGzptMenu")
-    @ApiOperation("获取微信公众号菜单")
-    public Response sendWxGzptMenu(){
-        try{
-            String token = wxGzhService.getGzhToken();
-            JSONObject wxMenuJson = wxGzhService.getWxMenuJson();
-            log.info("--------"+wxMenuJson);
-            String result = wxSendService.createMenu(token,wxMenuJson);
-            return Response.success(result);
-        }catch (Exception e){
-            throw new CustomException("系统异常");
-        }
-    }
-
 
     /**
      * 处理服务器推送消息

+ 93 - 0
twzd-admin/src/main/java/com/miaxis/pc/controller/WxMenuController.java

@@ -0,0 +1,93 @@
+package com.miaxis.pc.controller;
+
+import com.miaxis.common.annotation.Log;
+import com.miaxis.common.constant.Constants;
+import com.miaxis.common.core.controller.BaseController;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.core.page.ResponsePageInfo;
+import com.miaxis.common.enums.BusinessTypeEnum;
+import com.miaxis.wx.domain.WxMenu;
+import com.miaxis.wx.service.IWxMenuService;
+import com.miaxis.wx.vo.WxMenuVo;
+import io.swagger.annotations.*;
+import lombok.AllArgsConstructor;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * @author wwl
+ * @version 1.0
+ * @date 2021/11/3 9:18
+ */
+@RestController
+@RequestMapping("/pc/menu")
+@Api(tags={"【H5-微信公众号菜单】"})
+@AllArgsConstructor
+public class WxMenuController extends BaseController {
+
+    private final IWxMenuService wxMenuService;
+
+
+    /**
+     * 查询微信公众号菜单列表
+     */
+    @PreAuthorize("@ss.hasPermi('menu:info:list')")
+    @GetMapping("/list")
+    @ApiOperation("查询微信公众号菜单列表")
+    public Response<List<WxMenuVo>> list(){
+        return wxMenuService.selectWxMenuTreeList();
+    }
+
+
+    /**
+     * 获取微信公众号菜单详细信息
+     */
+    @PreAuthorize("@ss.hasPermi('menu:info:query')")
+    @GetMapping(value = "/{id}")
+    @ApiOperation("获取微信公众号菜单详细信息")
+    public Response<WxMenu> getInfo(
+            @ApiParam(name = "id", value = "微信公众号菜单参数", required = true)
+            @PathVariable("id") Long id
+    ){
+        return Response.success(wxMenuService.getById(id));
+    }
+
+    /**
+     * 新增微信公众号菜单
+     */
+    @PreAuthorize("@ss.hasPermi('menu:info:add')")
+    @Log(title = "微信公众号菜单", businessType = BusinessTypeEnum.INSERT)
+    @PostMapping
+    @ApiOperation("新增微信公众号菜单")
+    public Response add(@RequestBody WxMenu wxMenu){
+        return wxMenuService.saveMenu(wxMenu);
+    }
+
+    /**
+     * 修改微信公众号菜单
+     */
+    @PreAuthorize("@ss.hasPermi('menu:info:edit')")
+    @Log(title = "微信公众号菜单", businessType = BusinessTypeEnum.UPDATE)
+    @PutMapping
+    @ApiOperation("修改微信公众号菜单")
+    public Response edit(@RequestBody WxMenu wxMenu){
+        return wxMenuService.updateMenuById(wxMenu);
+    }
+
+    /**
+     * 删除微信公众号菜单
+     */
+    @PreAuthorize("@ss.hasPermi('menu:info:remove')")
+    @Log(title = "微信公众号菜单", businessType = BusinessTypeEnum.DELETE)
+    @DeleteMapping("/{ids}")
+    @ApiOperation("删除微信公众号菜单")
+    public  Response remove(
+            @ApiParam(name = "ids", value = "微信公众号菜单ids参数", required = true)
+            @PathVariable Long[] ids
+    ){
+        return wxMenuService.removeMenuByIds(ids);
+    }
+
+}

+ 10 - 0
twzd-service/src/main/java/com/miaxis/wx/mapper/WxMenuMapper.java

@@ -2,6 +2,9 @@ package com.miaxis.wx.mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.miaxis.wx.domain.WxMenu;
+import com.miaxis.wx.vo.WxMenuVo;
+
+import java.util.List;
 
 /**
  * 微信公众号菜单Mapper接口
@@ -10,4 +13,11 @@ import com.miaxis.wx.domain.WxMenu;
  * @date 2021/10/26 10:12
  */
 public interface WxMenuMapper extends BaseMapper<WxMenu> {
+
+    /**
+     * 查询微信公众号菜单列表
+     * @return 微信公众号菜单集合
+     */
+    List<WxMenuVo> selectWxMenuList();
+
 }

+ 0 - 6
twzd-service/src/main/java/com/miaxis/wx/service/IWxGzhService.java

@@ -18,12 +18,6 @@ public interface IWxGzhService {
      */
     String getGzhToken();
 
-    /**
-     * 查询微信菜单数据
-     * @return
-     */
-    JSONObject getWxMenuJson();
-
 
     /**
      * 微信推送消息处理

+ 48 - 0
twzd-service/src/main/java/com/miaxis/wx/service/IWxMenuService.java

@@ -0,0 +1,48 @@
+package com.miaxis.wx.service;
+
+import cn.hutool.core.lang.tree.Tree;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.wx.domain.WxMenu;
+import com.miaxis.wx.vo.WxMenuVo;
+
+import java.util.List;
+
+/**
+ * 微信公众号菜单Service接口
+ * @author wwl
+ * @version 1.0
+ * @date 2021/11/3 9:23
+ */
+public interface IWxMenuService extends IService<WxMenu> {
+
+    /**
+     * 查询微信公众号菜单列表
+     *
+     * @return 微信公众号菜单集合
+     */
+    Response<List<WxMenuVo>> selectWxMenuTreeList();
+
+    /**
+     * 新增微信公众号菜单
+     * @param wxMenu
+     * @return
+     */
+    Response saveMenu(WxMenu wxMenu);
+
+
+    /**
+     * 修改微信公众号菜单
+     * @param wxMenu
+     * @return
+     */
+    Response updateMenuById(WxMenu wxMenu);
+
+    /**
+     * 删除微信公众号菜单
+     * @param ids
+     * @return
+     */
+    Response removeMenuByIds(Long[] ids);
+}

+ 0 - 61
twzd-service/src/main/java/com/miaxis/wx/service/impl/WxGzhServiceImpl.java

@@ -1,15 +1,11 @@
 package com.miaxis.wx.service.impl;
 
 import cn.hutool.json.XML;
-import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.miaxis.common.constant.Constants;
-import com.miaxis.common.sign.VerifyUtil;
 import com.miaxis.common.utils.StringUtils;
 import com.miaxis.common.utils.wx.MessageUtil;
-import com.miaxis.feign.service.IWxMpService;
 import com.miaxis.feign.service.IWxSendService;
-import com.miaxis.wx.domain.WxMenu;
 import com.miaxis.wx.mapper.WxMenuMapper;
 import com.miaxis.wx.service.IWxGzhService;
 import com.miaxis.wx.service.IWxMessageEvenService;
@@ -22,8 +18,6 @@ import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.servlet.http.HttpServletRequest;
-import java.util.HashMap;
-import java.util.List;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -81,60 +75,6 @@ public class WxGzhServiceImpl implements IWxGzhService {
     }
 
 
-    /**
-     * 查询微信菜单数据
-     * @return
-     */
-    @Override
-    public JSONObject getWxMenuJson() {
-
-        JSONObject menuJson = new JSONObject();
-        //获取父类
-        List<WxMenu> menuList = wxMenuMapper.selectByMap(new HashMap<String,Object>(){{
-            put("parent_id",0);
-        }});
-        JSONArray button=new JSONArray();
-        for(WxMenu menu : menuList){
-            if(!VerifyUtil.verifyString(menu.getType())){
-                JSONObject childButton = new JSONObject();
-                childButton.put("name", menu.getMenuName());
-                //父类
-                JSONArray sub_button = new JSONArray();
-                List<WxMenu> childMenuList = wxMenuMapper.selectByMap(new HashMap<String,Object>(){{
-                    put("parent_id",menu.getId());
-                }});
-
-                for (WxMenu childMenu : childMenuList) {
-                    sub_button.add(getChildMenuJson(childMenu));
-                }
-                childButton.put("sub_button", sub_button);
-                button.add(childButton);
-            }else{
-                button.add(getChildMenuJson(menu));
-            }
-        }
-
-        menuJson.put("button", button);
-        return menuJson;
-    }
-
-    private JSONObject getChildMenuJson(WxMenu menu){
-        JSONObject menuJson = new JSONObject();
-        menuJson.put("type", menu.getType());
-        menuJson.put("name", menu.getMenuName());
-        if(menu.getType().equals("view")){
-            menuJson.put("url", menu.getUrl());
-        }else if(menu.getType().equals("click")){
-            menuJson.put("key", menu.getClickKey());
-        }else if(menu.getType().equals("miniprogram")){
-            menuJson.put("url", menu.getUrl());
-            menuJson.put("key", menu.getClickKey());
-            menuJson.put("appid", menu.getAppid());
-            menuJson.put("pagepath", menu.getPagePath());
-        }
-        return menuJson;
-    }
-
 
     /**
      * 微信推送消息处理
@@ -181,7 +121,6 @@ public class WxGzhServiceImpl implements IWxGzhService {
                     if (org.apache.commons.lang3.StringUtils.isNotEmpty(jsonObjectData.getStr("Ticket"))){
                         log.info("3.1.2..");
                         //根据Ticket  推送绑定信息到上级用户
-                        //从缓存中获取Ticket用户信息
                         String subscribeEvent = wxMessageEvenService.scanSubscribeEvent(fromUserName, jsonObjectData.getStr("Ticket"));
                         return MessageUtil.initText(fromUserName,toUserName,subscribeEvent);
 

+ 197 - 0
twzd-service/src/main/java/com/miaxis/wx/service/impl/WxMenuServiceImpl.java

@@ -0,0 +1,197 @@
+package com.miaxis.wx.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.miaxis.common.core.domain.Response;
+import com.miaxis.common.exception.CustomException;
+import com.miaxis.common.sign.VerifyUtil;
+import com.miaxis.feign.service.IWxSendService;
+import com.miaxis.wx.domain.WxMenu;
+import com.miaxis.wx.mapper.WxMenuMapper;
+import com.miaxis.wx.service.IWxGzhService;
+import com.miaxis.wx.service.IWxMenuService;
+import com.miaxis.wx.vo.WxMenuVo;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+
+/**
+ * 微信公众号菜单Service业务层处理
+ * @author wwl
+ * @version 1.0
+ * @date 2021/11/3 9:24
+ */
+@Service
+@AllArgsConstructor
+@Slf4j
+public class WxMenuServiceImpl extends ServiceImpl<WxMenuMapper, WxMenu> implements IWxMenuService {
+
+    private final WxMenuMapper wxMenuMapper;
+
+    private final IWxGzhService wxGzhService;
+
+    private final IWxSendService wxSendService;
+
+    /**
+     * 查询微信公众号菜单列表
+     *
+     * @return 微信公众号菜单
+     */
+    @Override
+    public Response<List<WxMenuVo>> selectWxMenuTreeList(){
+        List<WxMenuVo> menuList = wxMenuMapper.selectWxMenuList();
+        return Response.success(builTree(menuList));
+    }
+
+    //建立树形结构
+    public List<WxMenuVo> builTree(List<WxMenuVo> menuList){
+        List<WxMenuVo> infoVos =new ArrayList<>();
+        //获取根节点
+        List<WxMenuVo> rootMenuLists =new  ArrayList<>();
+        for(WxMenuVo menuVo : menuList) {
+            if(menuVo.getParentId().toString().equals("0")) {
+                rootMenuLists.add(menuVo);
+            }
+        }
+        for(WxMenuVo wxMenuVo : rootMenuLists) {
+            wxMenuVo=getTree(wxMenuVo,menuList);
+            infoVos.add(wxMenuVo);
+        }
+        return infoVos;
+    }
+    //递归,建立子树形结构
+    private WxMenuVo getTree(WxMenuVo wxMenuVo,List<WxMenuVo> menuList){
+        List<WxMenuVo> infoVos = new ArrayList<>();
+        for (WxMenuVo menuVo : menuList) {
+            if (menuVo.getParentId().toString().equals(wxMenuVo.getId().toString())){
+                infoVos.add(getTree(menuVo,menuList));
+            }
+        }
+        wxMenuVo.setChildren(infoVos);
+        return wxMenuVo;
+    }
+
+
+    /**
+     * 新增微信公众号菜单
+     * @param wxMenu
+     * @return
+     */
+    @Override
+    public Response saveMenu(WxMenu wxMenu) {
+        try {
+            wxMenuMapper.insert(wxMenu);
+            sendMenu();
+            return Response.success();
+        }catch (Exception e){
+            throw new CustomException("系统异常");
+        }
+    }
+
+    /**
+     * 修改微信公众号菜单
+     * @param wxMenu
+     * @return
+     */
+    @Override
+    public Response updateMenuById(WxMenu wxMenu) {
+        try {
+            wxMenuMapper.updateById(wxMenu);
+            sendMenu();
+            return Response.success();
+        }catch (Exception e){
+            throw new CustomException("系统异常");
+        }
+    }
+
+    /**
+     * 删除微信公众号菜单
+     * @param ids
+     * @return
+     */
+    @Override
+    public Response removeMenuByIds(Long[] ids) {
+        try {
+            this.removeByIds(Arrays.asList(ids));
+            sendMenu();
+            return Response.success();
+        }catch (Exception e){
+            throw new CustomException("系统异常");
+        }
+    }
+
+
+    /**
+     * 发送菜单至微信
+     * @return
+     */
+    private String sendMenu(){
+        JSONObject wxMenuJson = getWxMenuJson();
+        String token = wxGzhService.getGzhToken();
+        String result = wxSendService.createMenu(token,wxMenuJson);
+        log.info("-----sendMenu-----"+ result);
+        return result;
+    }
+
+
+    /**
+     * 查询微信菜单数据
+     * @return
+     */
+    private JSONObject getWxMenuJson() {
+
+        JSONObject menuJson = new JSONObject();
+        //获取父类
+        List<WxMenu> menuList = wxMenuMapper.selectByMap(new HashMap<String,Object>(){{
+            put("parent_id",0);
+        }});
+        JSONArray button=new JSONArray();
+        for(WxMenu menu : menuList){
+            if(!VerifyUtil.verifyString(menu.getType())){
+                JSONObject childButton = new JSONObject();
+                childButton.put("name", menu.getMenuName());
+                //父类
+                JSONArray sub_button = new JSONArray();
+                List<WxMenu> childMenuList = wxMenuMapper.selectList(new QueryWrapper<WxMenu>().eq("parent_id", menu.getId()).orderByAsc("sort"));
+
+                for (WxMenu childMenu : childMenuList) {
+                    sub_button.add(getChildMenuJson(childMenu));
+                }
+                childButton.put("sub_button", sub_button);
+                button.add(childButton);
+            }else{
+                button.add(getChildMenuJson(menu));
+            }
+        }
+
+        menuJson.put("button", button);
+        return menuJson;
+    }
+
+
+    private JSONObject getChildMenuJson(WxMenu menu){
+        JSONObject menuJson = new JSONObject();
+        menuJson.put("type", menu.getType());
+        menuJson.put("name", menu.getMenuName());
+        if(menu.getType().equals("view")){
+            menuJson.put("url", menu.getUrl());
+        }else if(menu.getType().equals("click")){
+            menuJson.put("key", menu.getClickKey());
+        }else if(menu.getType().equals("miniprogram")){
+            menuJson.put("url", menu.getUrl());
+            menuJson.put("key", menu.getClickKey());
+            menuJson.put("appid", menu.getAppid());
+            menuJson.put("pagepath", menu.getPagePath());
+        }
+        return menuJson;
+    }
+
+
+}

+ 0 - 1
twzd-service/src/main/java/com/miaxis/wx/service/impl/WxMessageEvenServiceImpl.java

@@ -161,7 +161,6 @@ public class WxMessageEvenServiceImpl implements IWxMessageEvenService {
             //上传素材
             String path = mediaUpload + token + "&type=image";
             String result = HttpUtils.connectHttpsByPost(path,textFile);
-            log.info("------:" + mediaUpload + "-------"+result);
             result = result.replaceAll("[\\\\]", "");
             JSONObject resultJSON = JSONObject.parseObject(result);
             log.info("------result:" + resultJSON);

+ 73 - 0
twzd-service/src/main/java/com/miaxis/wx/vo/WxMenuVo.java

@@ -0,0 +1,73 @@
+package com.miaxis.wx.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.miaxis.common.core.domain.BaseBusinessEntity;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.List;
+
+/**
+ * 微信公众号菜单返回参 WxMenuVo
+ * @author wwl
+ * @version 1.0
+ * @date 2021/10/26 10:06
+ */
+@Data
+@ApiModel(value = "WxMenuVo", description = "微信公众号菜单对象 WxMenuVo")
+public class WxMenuVo {
+
+    private static final long serialVersionUID = 1L;
+
+    /** 主键 */
+    @TableId(value = "id")
+    @ApiModelProperty(value = "主键")
+    private Long id;
+
+    @TableField("parent_id")
+    @ApiModelProperty(value = "父节点")
+    private Integer parentId;
+
+    @TableField("type")
+    @ApiModelProperty(value = "菜单的响应动作类型,view表示网页类型,click表示点击类型,miniprogram表示小程序类型")
+    private String type;
+
+    @TableField("menu_name")
+    @ApiModelProperty(value = "菜单标题")
+    private String menuName;
+
+    @TableField("click_key")
+    @ApiModelProperty(value = "click等点击类型必须,菜单KEY值,用于消息接口推送,不超过128字节")
+    private String clickKey;
+
+    @TableField("url")
+    @ApiModelProperty(value = "view、miniprogram类型必须,网页 链接,用户点击菜单可打开链接,不超过1024字节。 type为miniprogram时,不支持小程序的老版本客户端将打开本url。")
+    private String url;
+
+    @TableField("media_id")
+    @ApiModelProperty(value = "media_id类型和view_limited类型必须,调用新增永久素材接口返回的合法media_id")
+    private String mediaId;
+
+    @TableField("appid")
+    @ApiModelProperty(value = "miniprogram类型必须,小程序的appid(仅认证公众号可配置)")
+    private String appid;
+
+    @TableField("page_path")
+    @ApiModelProperty(value = "miniprogram类型必须,小程序的页面路径")
+    private String pagePath;
+
+    @TableField("article_id")
+    @ApiModelProperty(value = "发布后获得的合法 article_id")
+    private String articleId;
+
+    @TableField("sort")
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    @ApiModelProperty(value = "子节点分类")
+    private List<WxMenuVo> children;
+
+}

+ 32 - 0
twzd-service/src/main/resources/mapper/wx/WxMenuMapper.xml

@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE mapper
+        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.miaxis.wx.mapper.WxMenuMapper">
+
+    <resultMap type="WxMenu" id="WxMenuResult">
+        <result property="id"    column="id"    />
+        <result property="parentId"    column="parent_id"    />
+        <result property="type"    column="type"    />
+        <result property="menuName"    column="menu_name"    />
+        <result property="clickKey"    column="click_key"    />
+        <result property="url"    column="url"    />
+        <result property="mediaId"    column="media_id"    />
+        <result property="appid"    column="appid"    />
+        <result property="pagePath"    column="page_path"    />
+        <result property="articleId"    column="article_id"    />
+        <result property="sort"    column="sort"    />
+        <result property="createTime"    column="create_time"    />
+        <result property="updateTime"    column="update_time"    />
+    </resultMap>
+
+    <sql id="selectWxMenuVo">
+        select * from wx_menu
+    </sql>
+
+    <select id="selectWxMenuList" resultType="com.miaxis.wx.vo.WxMenuVo">
+        <include refid="selectWxMenuVo"/>
+        ORDER BY sort
+    </select>
+
+</mapper>