|
@@ -0,0 +1,318 @@
|
|
|
|
+package com.caimei365.manager.service.impl;
|
|
|
|
+
|
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
|
+import com.caimei365.manager.dao.SysUserDao;
|
|
|
|
+import com.caimei365.manager.dao.WeChatDao;
|
|
|
|
+import com.caimei365.manager.entity.ResponseJson;
|
|
|
|
+import com.caimei365.manager.entity.wechat.WechatMenu;
|
|
|
|
+import com.caimei365.manager.service.WeChatService;
|
|
|
|
+import com.caimei365.manager.utils.HttpUtil;
|
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
|
+import org.springframework.beans.factory.annotation.Value;
|
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
|
+
|
|
|
|
+import javax.annotation.Resource;
|
|
|
|
+import java.util.ArrayList;
|
|
|
|
+import java.util.HashMap;
|
|
|
|
+import java.util.List;
|
|
|
|
+import java.util.Map;
|
|
|
|
+
|
|
|
|
+/**
|
|
|
|
+ * Description
|
|
|
|
+ *
|
|
|
|
+ * @author : Charles
|
|
|
|
+ * @date : 2022/1/5
|
|
|
|
+ */
|
|
|
|
+@Slf4j
|
|
|
|
+@Service
|
|
|
|
+public class WeChatServiceImpl implements WeChatService {
|
|
|
|
+
|
|
|
|
+ @Value("${wechat.publicUrl}")
|
|
|
|
+ private String publicUrl;
|
|
|
|
+ @Value("${wechat.getTokenUrl}")
|
|
|
|
+ private String getTokenUrl;
|
|
|
|
+ @Value("${wechat.createMenuUrl}")
|
|
|
|
+ private String createMenuUrl;
|
|
|
|
+
|
|
|
|
+ @Value("${wechat.caimei.id}")
|
|
|
|
+ private String caimeiId;
|
|
|
|
+ @Value("${wechat.caimei.appid}")
|
|
|
|
+ private String caimeiAppid;
|
|
|
|
+ @Value("${wechat.caimei.secret}")
|
|
|
|
+ private String caimeiSecret;
|
|
|
|
+
|
|
|
|
+ @Value("${wechat.hehe.id}")
|
|
|
|
+ private String heheId;
|
|
|
|
+ @Value("${wechat.hehe.appid}")
|
|
|
|
+ private String heheAppid;
|
|
|
|
+ @Value("${wechat.hehe.secret}")
|
|
|
|
+ private String heheSecret;
|
|
|
|
+
|
|
|
|
+ @Resource
|
|
|
|
+ private WeChatDao weChatDao;
|
|
|
|
+ @Resource
|
|
|
|
+ private SysUserDao sysUserDao;
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 获取微信公众号菜单列表
|
|
|
|
+ *
|
|
|
|
+ * @param type 类型: 1采美,2呵呵商城
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<List<WechatMenu>> getWechatMenuList(Integer type) {
|
|
|
|
+ String wxType = "";
|
|
|
|
+ if (null != type && 1 == type) {
|
|
|
|
+ wxType = caimeiId;
|
|
|
|
+ } else if (null != type && 2 == type) {
|
|
|
|
+ wxType = heheId;
|
|
|
|
+ } else {
|
|
|
|
+ return ResponseJson.error("菜单类型不能为空", null);
|
|
|
|
+ }
|
|
|
|
+ List<WechatMenu> list = weChatDao.getWechatMenuList(type, wxType);
|
|
|
|
+ // 获取子菜单
|
|
|
|
+ for (WechatMenu menu : list) {
|
|
|
|
+ List<WechatMenu> subList = weChatDao.getWechatMenuList(menu.getId(), wxType);
|
|
|
|
+ menu.setChildren(subList);
|
|
|
|
+ }
|
|
|
|
+ return ResponseJson.success(list);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据ID获取微信公众号菜单
|
|
|
|
+ *
|
|
|
|
+ * @param id 菜单Id
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<WechatMenu> getWechatMenu(Integer id) {
|
|
|
|
+ WechatMenu menu = weChatDao.getWechatMenu(id);
|
|
|
|
+ return ResponseJson.success(menu);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据ID更新微信公众号菜单
|
|
|
|
+ *
|
|
|
|
+ * @param id 菜单Id
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<Void> updateWechatMenu(Integer id, WechatMenu menu, String username) {
|
|
|
|
+ WechatMenu dbMenu = weChatDao.getWechatMenu(id);
|
|
|
|
+ if (null == dbMenu) {
|
|
|
|
+ return ResponseJson.error("当前菜单异常!", null);
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.hasLength(menu.getName())){
|
|
|
|
+ dbMenu.setName(menu.getName());
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.hasLength(menu.getType())){
|
|
|
|
+ dbMenu.setType(menu.getType());
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.hasLength(menu.getKey())){
|
|
|
|
+ dbMenu.setKey(menu.getKey());
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.hasLength(menu.getUrl())){
|
|
|
|
+ dbMenu.setUrl(menu.getUrl());
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.hasLength(menu.getMediaId())){
|
|
|
|
+ dbMenu.setMediaId(menu.getMediaId());
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.hasLength(menu.getAppid())){
|
|
|
|
+ dbMenu.setAppid(menu.getAppid());
|
|
|
|
+ }
|
|
|
|
+ if (StringUtils.hasLength(menu.getPagePath())){
|
|
|
|
+ dbMenu.setPagePath(menu.getPagePath());
|
|
|
|
+ }
|
|
|
|
+ if (null != menu.getSort()){
|
|
|
|
+ dbMenu.setSort(menu.getSort());
|
|
|
|
+ }
|
|
|
|
+ WechatMenu parentMenu = weChatDao.getWechatMenu(dbMenu.getParentId());
|
|
|
|
+ setParentIds(dbMenu, parentMenu, username);
|
|
|
|
+ // 更新
|
|
|
|
+ weChatDao.updateWechatMenu(dbMenu);
|
|
|
|
+ return ResponseJson.success();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 添加微信公众号菜单
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<Void> addWechatMenu(WechatMenu menu, String username) {
|
|
|
|
+ if (!StringUtils.hasLength(menu.getName())) {
|
|
|
|
+ return ResponseJson.error("菜单标题不能为空!", null);
|
|
|
|
+ }
|
|
|
|
+ if (null != menu.getParentId()) {
|
|
|
|
+ return ResponseJson.error("父级菜单Id不能为空!", null);
|
|
|
|
+ }
|
|
|
|
+ WechatMenu parentMenu = weChatDao.getWechatMenu(menu.getParentId());
|
|
|
|
+ if (null == parentMenu) {
|
|
|
|
+ return ResponseJson.error("父级菜单异常!", null);
|
|
|
|
+ }
|
|
|
|
+ menu.setWxType(parentMenu.getWxType());
|
|
|
|
+ // 根据父级Id统计同级别菜单数量
|
|
|
|
+ Integer count = weChatDao.countChildByParentId(menu.getParentId());
|
|
|
|
+ // 一级菜单
|
|
|
|
+ if (menu.getParentId() == 1 || menu.getParentId() == 2) {
|
|
|
|
+ if (count >= 3) {
|
|
|
|
+ return ResponseJson.error("最多包括3个一级菜单!", null);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ if (count >= 3) {
|
|
|
|
+ return ResponseJson.error("每个一级菜单最多包含5个二级菜单!", null);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ setParentIds(menu, parentMenu, username);
|
|
|
|
+ // 新增
|
|
|
|
+ weChatDao.insertWechatMenu(menu);
|
|
|
|
+ return ResponseJson.success();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 设置操作人与父级ID串
|
|
|
|
+ * @param menu 待更新菜单
|
|
|
|
+ * @param username 操作人登录名
|
|
|
|
+ */
|
|
|
|
+ private void setParentIds(WechatMenu menu, WechatMenu parentMenu, String username) {
|
|
|
|
+ Integer userId = sysUserDao.getUserIdByUsername(username);
|
|
|
|
+ menu.setUserId(userId);
|
|
|
|
+ String parentIds = "0,";
|
|
|
|
+ if (null != parentMenu && StringUtils.hasLength(parentMenu.getParentIds())) {
|
|
|
|
+ parentIds = parentMenu.getParentIds() + parentMenu.getId() + ",";
|
|
|
|
+ }
|
|
|
|
+ menu.setParentIds(parentIds);
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 根据ID删除微信公众号菜单
|
|
|
|
+ *
|
|
|
|
+ * @param id 菜单Id
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<Void> deleteWechatMenu(Integer id) {
|
|
|
|
+ weChatDao.deleteWechatMenu(id);
|
|
|
|
+ return ResponseJson.success();
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 微信公众号菜单发布
|
|
|
|
+ *
|
|
|
|
+ * @param type 类型: 1采美,2呵呵商城
|
|
|
|
+ */
|
|
|
|
+ @Override
|
|
|
|
+ public ResponseJson<Void> pushWechatMenu(Integer type) {
|
|
|
|
+ String wxType = "";
|
|
|
|
+ if (null != type && 1 == type) {
|
|
|
|
+ wxType = caimeiId;
|
|
|
|
+ } else if (null != type && 2 == type) {
|
|
|
|
+ wxType = heheId;
|
|
|
|
+ } else {
|
|
|
|
+ return ResponseJson.error("菜单类型不正确!", null);
|
|
|
|
+ }
|
|
|
|
+ // 一级菜单
|
|
|
|
+ List<WechatMenu> buttons = weChatDao.getWechatMenuList(type, wxType);
|
|
|
|
+ if (buttons.size() >= 3) {
|
|
|
|
+ return ResponseJson.error("最多包括3个一级菜单!", null);
|
|
|
|
+ }
|
|
|
|
+ // 组装请求数据
|
|
|
|
+ List<Map<String,Object>> buttonMapList = new ArrayList<>();
|
|
|
|
+ for (WechatMenu button : buttons) {
|
|
|
|
+ Map<String,Object> buttonMap = new HashMap();
|
|
|
|
+ buttonMap.put("name", button.getName());
|
|
|
|
+ if (StringUtils.hasLength(button.getType())) {
|
|
|
|
+ // type不为空,则只有一级菜单
|
|
|
|
+ buttonMap.put("type", button.getType());
|
|
|
|
+ setTypeValue(button, buttonMap);
|
|
|
|
+ } else {
|
|
|
|
+ // 二级菜单
|
|
|
|
+ List<WechatMenu> subList = weChatDao.getWechatMenuList(button.getId(), wxType);
|
|
|
|
+ if (subList.size() >= 5) {
|
|
|
|
+ return ResponseJson.error("每个一级菜单最多包含5个二级菜单!", null);
|
|
|
|
+ }
|
|
|
|
+ List<Map<String,Object>> menuMapList = new ArrayList<>();
|
|
|
|
+ for (WechatMenu menu : subList) {
|
|
|
|
+ Map<String,Object> menuMap = new HashMap();
|
|
|
|
+ menuMap.put("name", menu.getName());
|
|
|
|
+ menuMap.put("type", menu.getType());
|
|
|
|
+ setTypeValue(menu, menuMap);
|
|
|
|
+ menuMapList.add(menuMap);
|
|
|
|
+ }
|
|
|
|
+ // 把二级菜单放入上级菜单的集合中
|
|
|
|
+ buttonMap.put("sub_button", menuMapList);
|
|
|
|
+ }
|
|
|
|
+ buttonMapList.add(buttonMap);
|
|
|
|
+ }
|
|
|
|
+ Map<String,Object> map = new HashMap();
|
|
|
|
+ map.put("button", buttonMapList);
|
|
|
|
+ // json 字符串
|
|
|
|
+ String jsonString = JSON.toJSONString(map);
|
|
|
|
+ log.info("》》》微信公众号菜单发布,发布数据:" + jsonString);
|
|
|
|
+ // 组装请求链接
|
|
|
|
+ String url = createMenuUrl + "?access_token=";
|
|
|
|
+ if (1 == type) {
|
|
|
|
+ // 采美微信公众号
|
|
|
|
+ url += getAccessToken(caimeiAppid, caimeiSecret);
|
|
|
|
+ } else if (2 == type) {
|
|
|
|
+ // 呵呵商城公众号
|
|
|
|
+ url += getAccessToken(heheAppid, heheSecret);
|
|
|
|
+ }
|
|
|
|
+ // 得到结果String
|
|
|
|
+ String jsonResult = null;
|
|
|
|
+ try {
|
|
|
|
+ jsonResult = HttpUtil.httpRequest(url, "POST", jsonString);
|
|
|
|
+ } catch (Exception e) {
|
|
|
|
+ log.error("发布微信公众号菜单失败:", e);
|
|
|
|
+ return ResponseJson.error("微信接口请求失败,请联系管理员!", null);
|
|
|
|
+ }
|
|
|
|
+ if(StringUtils.hasLength(jsonResult)){
|
|
|
|
+ JSONObject jsonObject = JSON.parseObject(jsonResult);
|
|
|
|
+ if("0".equals(jsonObject.getString("errcode"))){
|
|
|
|
+ return ResponseJson.success("发布成功!", null);
|
|
|
|
+ }else{
|
|
|
|
+ log.info(jsonResult);
|
|
|
|
+ return ResponseJson.error(jsonObject.getString("errmsg"), null);
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ return ResponseJson.error("发布失败,请联系管理员!", null);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 组装菜单数据
|
|
|
|
+ */
|
|
|
|
+ private void setTypeValue(WechatMenu menu, Map<String, Object> map) {
|
|
|
|
+ if ("view".equals(menu.getType())) {
|
|
|
|
+ map.put("url", menu.getUrl());
|
|
|
|
+ } else if ("miniprogram".equals(menu.getType())) {
|
|
|
|
+ // 小程序跳转
|
|
|
|
+ map.put("url", publicUrl);
|
|
|
|
+ map.put("appid", menu.getAppid());
|
|
|
|
+ map.put("pagepath", menu.getPagePath());
|
|
|
|
+ } else if ("media_id".equals(menu.getType()) || "view_limited".equals(menu.getType())) {
|
|
|
|
+ map.put("media_id", menu.getMediaId());
|
|
|
|
+ } else {
|
|
|
|
+ map.put("key", menu.getKey());
|
|
|
|
+ if(!"click".equals(menu.getType())) {
|
|
|
|
+ map.put("sub_button", new ArrayList());
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ /**
|
|
|
|
+ * 换取 access_token
|
|
|
|
+ */
|
|
|
|
+ public String getAccessToken(String appid, String secret){
|
|
|
|
+ String url = getTokenUrl + "?grant_type=client_credential&appid=" + appid + "&secret=" + secret;
|
|
|
|
+ try {
|
|
|
|
+ String jsonResult = HttpUtil.httpRequest(url, "GET", null);
|
|
|
|
+ if(StringUtils.hasLength(jsonResult)){
|
|
|
|
+ JSONObject jsonObject = JSON.parseObject(jsonResult);
|
|
|
|
+ String accessToken = jsonObject.getString("access_token");
|
|
|
|
+ if(StringUtils.hasLength(accessToken)){
|
|
|
|
+ return accessToken;
|
|
|
|
+ }else{
|
|
|
|
+ log.info(jsonResult);
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ } catch (Exception ignored) {}
|
|
|
|
+ return "";
|
|
|
|
+ }
|
|
|
|
+}
|