package com.java110.api.listener.smallWeChat; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.java110.api.bmo.smallWeChat.IWechatMenuBMO; import com.java110.api.listener.AbstractServiceApiPlusListener; import com.java110.core.annotation.Java110Listener; import com.java110.core.context.DataFlowContext; import com.java110.core.event.service.api.ServiceDataFlowEvent; import com.java110.core.factory.WechatFactory; import com.java110.intf.store.ISmallWeChatInnerServiceSMO; import com.java110.intf.store.IWechatMenuInnerServiceSMO; import com.java110.dto.smallWeChat.SmallWeChatDto; import com.java110.dto.wechatMenu.WechatMenuDto; import com.java110.utils.constant.ServiceCodeWechatMenuConstant; import com.java110.utils.constant.WechatConstant; import com.java110.utils.util.Assert; import com.java110.utils.util.BeanConvertUtil; import com.java110.vo.ResultVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpMethod; import org.springframework.http.ResponseEntity; import org.springframework.web.client.RestTemplate; import java.util.List; /** * 保存商户侦听 * add by wuxw 2019-06-30 */ @Java110Listener("publishWechatMenuListener") public class PublishWechatMenuListener extends AbstractServiceApiPlusListener { @Autowired private IWechatMenuBMO wechatMenuBMOImpl; @Autowired private RestTemplate outRestTemplate; @Autowired private IWechatMenuInnerServiceSMO wechatMenuInnerServiceSMOImpl; @Autowired private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl; @Override protected void validate(ServiceDataFlowEvent event, JSONObject reqJson) { //Assert.hasKeyAndValue(reqJson, "xxx", "xxx"); Assert.hasKeyAndValue(reqJson, "communityId", "请求报文中未包含communityId"); } /** * { * "button":[ * { * "type":"click", * "name":"今日歌曲", * "key":"V1001_TODAY_MUSIC" * }, * { * "name":"菜单", * "sub_button":[ * { * "type":"view", * "name":"搜索", * "url":"http://www.soso.com/" * }, * { * "type":"miniprogram", * "name":"wxa", * "url":"http://mp.weixin.qq.com", * "appid":"wx286b93c14bbf93aa", * "pagepath":"pages/lunar/index" * }, * { * "type":"click", * "name":"赞一下我们", * "key":"V1001_GOOD" * }] * }] * } * * @param event 事件对象 * @param context 数据上文对象 * @param reqJson 请求报文 */ @Override protected void doSoService(ServiceDataFlowEvent event, DataFlowContext context, JSONObject reqJson) { //查询一级菜单 WechatMenuDto wechatMenuDto = BeanConvertUtil.covertBean(reqJson, WechatMenuDto.class); wechatMenuDto.setMenuLevel(WechatMenuDto.MENU_LEVEL_ONE); List wechatMenuDtos = wechatMenuInnerServiceSMOImpl.queryWechatMenus(wechatMenuDto); if (wechatMenuDtos == null || wechatMenuDtos.size() < 1 || wechatMenuDtos.size() > 3) { throw new IllegalArgumentException("一级菜单数量为" + wechatMenuDtos.size() + "不符合公众号菜单数量要求"); } JSONObject wechatMenuObj = new JSONObject(); JSONArray button = new JSONArray(); for (WechatMenuDto tmpWechatMenuDto : wechatMenuDtos) { wechatMenuDto = new WechatMenuDto(); wechatMenuDto.setMenuLevel(WechatMenuDto.MENU_LEVEL_TWO); wechatMenuDto.setCommunityId(tmpWechatMenuDto.getCommunityId()); wechatMenuDto.setParentMenuId(tmpWechatMenuDto.getWechatMenuId()); List tmpWechatMenuDtos = wechatMenuInnerServiceSMOImpl.queryWechatMenus(wechatMenuDto); JSONObject menuButton = new JSONObject(); menuButton.put("name", tmpWechatMenuDto.getMenuName()); if (tmpWechatMenuDtos != null && tmpWechatMenuDtos.size() > 0) { addSubMenu(menuButton, tmpWechatMenuDtos); button.add(menuButton); continue; } menuButton.put("type", tmpWechatMenuDto.getMenuType()); if (WechatMenuDto.MENU_TYPE_VIEW.equals(tmpWechatMenuDto.getMenuType())) { menuButton.put("url", tmpWechatMenuDto.getMenuValue()); } else if (WechatMenuDto.MENU_TYPE_MINIPROGRAM.equals(tmpWechatMenuDto.getMenuType())) { menuButton.put("url", tmpWechatMenuDto.getMenuValue()); menuButton.put("appid", tmpWechatMenuDto.getAppId()); menuButton.put("pagepath", tmpWechatMenuDto.getPagepath()); } button.add(menuButton); } wechatMenuObj.put("button", button); SmallWeChatDto smallWeChatDto = new SmallWeChatDto(); smallWeChatDto.setObjType(SmallWeChatDto.OBJ_TYPE_COMMUNITY); smallWeChatDto.setObjId(reqJson.getString("communityId")); List smallWeChatDtos = smallWeChatInnerServiceSMOImpl.querySmallWeChats(smallWeChatDto); if (smallWeChatDtos == null || smallWeChatDtos.size() < 1) { throw new IllegalArgumentException("当前小区未配置公众号 请先配置"); } String token = WechatFactory.getAccessToken(smallWeChatDtos.get(0).getAppId(), smallWeChatDtos.get(0).getAppSecret()); String url = WechatConstant.CREATE_MENU.replace("ACCESS_TOKEN", token); ResponseEntity responseEntity = outRestTemplate.postForEntity(url, wechatMenuObj.toJSONString(), String.class); JSONObject wechatOutObj = JSONObject.parseObject(responseEntity.getBody()); context.setResponseEntity(ResultVo.createResponseEntity(wechatOutObj.getInteger("errcode"), wechatOutObj.getString("errmsg"))); } private void addSubMenu(JSONObject wechatMenuObj, List wechatMenuDtos) { JSONArray subButtons = new JSONArray(); JSONObject subButton = null; for (WechatMenuDto wechatMenuDto : wechatMenuDtos) { subButton = new JSONObject(); subButton.put("name", wechatMenuDto.getMenuName()); subButton.put("type", wechatMenuDto.getMenuType()); if (WechatMenuDto.MENU_TYPE_VIEW.equals(wechatMenuDto.getMenuType())) { subButton.put("url", wechatMenuDto.getMenuValue()); } else if (WechatMenuDto.MENU_TYPE_MINIPROGRAM.equals(wechatMenuDto.getMenuType())) { subButton.put("url", wechatMenuDto.getMenuValue()); subButton.put("appid", wechatMenuDto.getAppId()); subButton.put("pagepath", wechatMenuDto.getPagepath()); } subButtons.add(subButton); } wechatMenuObj.put("sub_button", subButtons); } @Override public String getServiceCode() { return ServiceCodeWechatMenuConstant.PUBLIC_WECHATMENU; } @Override public HttpMethod getHttpMethod() { return HttpMethod.POST; } }