天天看點

微信公衆号之靈活自定義菜單顯示包含資料庫結構設計

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 "建立失敗";
    }
}