天天看点

微信公众号之灵活自定义菜单显示包含数据库结构设计

1、数据库表

package com.ihaidou.entity.db.wechat;

import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import org.hibernate.annotations.UpdateTimestamp;

import javax.persistence.*;
import java.util.Date;

/**
 * @Desc: 子菜单Url
 * @Author HealerJean
 * @Date 2018/6/1  下午5:45.
 */
@Entity
@Table(name="wechat_menu_url")
@Data
@Accessors(chain = true)
public class WeChatMenu {


    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @ApiModelProperty(value = "微信公众号 主键")
    private Long wechatBusinessNoId ;

    @ApiModelProperty(value = "菜单对应的eventkey")
    private String eventkey ;

    @ApiModelProperty(value = "view菜单对应的url或者是图片对应的url")
    private String url;

    @ApiModelProperty("菜单的名字")
    private String name; //菜单名字

    @ApiModelProperty(value = "包含图片和media以及返回菜单的文字内容")
    private String value ; //菜单内容

    @Temporal(TemporalType.TIMESTAMP)
    @Column(columnDefinition="TIMESTAMP DEFAULT CURRENT_TIMESTAMP",insertable = true,updatable = false)
    private Date cdate;

    @UpdateTimestamp
    @Temporal(TemporalType.TIMESTAMP)
    private Date udate;

    @ApiModelProperty(value = "从左到右顺序 , 1 2 3")
    private Integer wOrder;

    @ApiModelProperty(value = "从上到下顺序")
    private Integer hOrder;

    @ApiModelProperty(value = "是否底部菜单")
    private boolean footMenu;

    @ApiModelProperty(value = "菜单类型 1 url类型  ,2 回复文字类型,3 回复图片类型")
    private Integer type ;

    @ApiModelProperty(value = "1表示作为子菜单,2表示作为其他选项")
    private Integer useType ;

    @ApiModelProperty(value = "菜单是否删除")
    private Integer status ;


}


/**
 

 create table wechat_menu(
 id BIGINT(20) not null auto_increment,
 wechatBusinessNoId BIGINT(20) default null ,
 url varchar(500) default null,
 eventkey varchar(100) default null,
 name varchar(50) default null,
 value varchar(1000) default '',
 wOrder int(11) default 0,
 hOrder int(11) default 0,
 footMenu int(11) default 0 ,
 status int(11) default 0,
 type int(11) default 0,
 useType int(11) default  1 comment '1表示作为子菜单,2表示作为其他选项',
 cdate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
 udate timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,

 PRIMARY key (id));



 */      

2、开始创建自定义菜单

@Slf4j
@Service
public class MenuServiceImpl  implements MenuService{

    @Resource
    private WeChatMenuRepository weChatMenuRepository;

    @Override
    public String byControllerSetMenu(WeChatBusinessNo weChatBusinessNo) {


        List<WeChatMenu> weChatMenus = weChatMenuRepository.findByWechatBusinessNoIdAndStatusAndUseType(weChatBusinessNo.getId(),1, 1);

        Menu menu = new Menu();
        List<BasicButton> menuBasicButton = new ArrayList<>(); //底部菜单

        Map<Integer, List<WeChatMenu>> weightMenu = weChatMenus.stream().sorted(Comparator.comparing(WeChatMenu::getWOrder)).collect(Collectors.groupingBy(WeChatMenu::getWOrder));
        for(Integer wOrder:weightMenu.keySet()){


            BasicButton basicButton = new BasicButton(); //纵向菜单
            List<BasicButton> basicButtons = new ArrayList<>();

            boolean isOnlyOne = false ; //底部菜单是不是只有一个,false表示不是只有一个 true表示底部菜单只有一个
            if(weightMenu.get(wOrder).size()==1){
                isOnlyOne = true ;
            }

            boolean finalIsOnlyOne = isOnlyOne;
            weightMenu.get(wOrder).stream().sorted(Comparator.comparing(WeChatMenu::getHOrder)).forEach(
                    weChatMenu -> {
                        switch (weChatMenu.getType()){
                            case 1://1 url类型
                                ViewButton viewButton = new ViewButton();
                                viewButton.setName(weChatMenu.getName());
                                viewButton.setUrl(weChatMenu.getUrl());
                                viewButton.setType(WechatMenuParams.VIEW);
                                if(finalIsOnlyOne ==false){
                                    basicButtons.add(viewButton);
                                }else {
                                    menuBasicButton.add(viewButton);
                                    break; //直接进入下一个
                                }
                                break;
                            case 2://2 回复文字类型
                            case 3://3 回复图片类型
                                ClickButton clickButton = new ClickButton();
                                clickButton.setName(weChatMenu.getName());
                                clickButton.setKey(weChatMenu.getEventkey());
                                clickButton.setType(WechatMenuParams.CLICK);
                                if(finalIsOnlyOne ==false){
                                    basicButtons.add(clickButton);
                                }else {
                                    menuBasicButton.add(clickButton);
                                    break; //直接进入下一个
                                }                                 break;
                            default:
                                break;
                        }
                        //必须保证底部菜单是多个的情况
                        if(weChatMenu.isFootMenu()==true){
                            basicButton.setName(weChatMenu.getName());
                        }

                    }
            );

            if(finalIsOnlyOne==false){
                basicButton.setSub_button( basicButtons.stream().toArray(BasicButton[]::new));
                menuBasicButton.add(basicButton);
            }
        }
        menu.setButton(menuBasicButton.stream().toArray(BasicButton[]::new));


        String menuJson = JSONObject.fromObject(menu).toString();
        log.info(menuJson);

        //此处改为自己想要的结构体,替换即可

        String access_token= AccessToakeUtil.getAccessToaken(weChatBusinessNo);
        String createMenuUrl = WechatMenuParams.CREATE_MENU_URL+access_token;

        String body =    SdkHttpHelper.doJsonPost(createMenuUrl,menuJson);
        log.info("创建自定义菜单 返回结果"+body);

        String result = JSONObject.fromObject(body).getString("errmsg");
        if(StringUtils.equals(result,"ok")){
            log.info("创建自定义菜单成功");
            return  result;
        }else{
            log.error("创建创建自定义菜单失败自定义菜单失败");
        }

        return "创建失败";
    }
}