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