From 217882984233d0541de9a9cd99b6a97eb22b2fe9 Mon Sep 17 00:00:00 2001
From: xiaoyong931011 <15274802129@163.com>
Date: Sat, 15 Jul 2023 10:07:24 +0800
Subject: [PATCH] 服务号菜单

---
 src/main/java/cc/mrbird/febs/pay/model/ComplexButton.java  |   11 +++
 src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java     |    1 
 src/main/java/cc/mrbird/febs/pay/model/Menu.java           |   11 +++
 src/main/java/cc/mrbird/febs/pay/util/WechatMenuUtil.java  |  122 ++++++++++++++++++++++++++++++++++++++++
 src/main/java/cc/mrbird/febs/pay/model/CommonButton.java   |   13 ++++
 src/main/java/cc/mrbird/febs/pay/model/Button.java         |   13 ++++
 src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java |    2 
 7 files changed, 172 insertions(+), 1 deletions(-)

diff --git a/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java b/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java
index d731967..803c177 100644
--- a/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java
+++ b/src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java
@@ -39,6 +39,7 @@
      * 有效期两小时
      */
     @Scheduled(cron = "0 0 0/1 * * ? ")
+//    @Scheduled(cron = "0 0/1 * * * ? ")
     public void getAccessToken() throws IOException {
         String appId = xcxProperties.getXcxAppid();
         String appSecret = xcxProperties.getXcxSecret();
diff --git a/src/main/java/cc/mrbird/febs/pay/model/Button.java b/src/main/java/cc/mrbird/febs/pay/model/Button.java
new file mode 100644
index 0000000..e63cf15
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/model/Button.java
@@ -0,0 +1,13 @@
+package cc.mrbird.febs.pay.model;
+
+import lombok.Data;
+
+/**
+ * 菜单项的基类,所有一级菜单、二级菜单都共有一个相同的属性,那就是name
+ */
+@Data
+public class Button {
+
+    private String name;
+
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/model/CommonButton.java b/src/main/java/cc/mrbird/febs/pay/model/CommonButton.java
new file mode 100644
index 0000000..a119d59
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/model/CommonButton.java
@@ -0,0 +1,13 @@
+package cc.mrbird.febs.pay.model;
+
+import lombok.Data;
+
+/**
+ * 子菜单项 :没有子菜单的菜单项,有可能是二级菜单项,也有可能是不含二级菜单的一级菜单
+ */
+@Data
+public class CommonButton extends Button {
+    private String type;
+    private String key;
+    private String url;
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/model/ComplexButton.java b/src/main/java/cc/mrbird/febs/pay/model/ComplexButton.java
new file mode 100644
index 0000000..7466dfb
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/model/ComplexButton.java
@@ -0,0 +1,11 @@
+package cc.mrbird.febs.pay.model;
+
+import lombok.Data;
+
+/**
+ * 父菜单项 :包含有二级菜单项的一级菜单。这类菜单项包含有二个属性:name和sub_button,而sub_button以是一个子菜单项数组
+ */
+@Data
+public class ComplexButton extends Button {
+    private Button[] sub_button;
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/model/Menu.java b/src/main/java/cc/mrbird/febs/pay/model/Menu.java
new file mode 100644
index 0000000..86da9ea
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/model/Menu.java
@@ -0,0 +1,11 @@
+package cc.mrbird.febs.pay.model;
+
+import lombok.Data;
+
+/**
+ * 整个菜单对象的封装,菜单对象包含多个菜单项(最多只能有3个),这些菜单项即可以是子菜单项(不含二级菜单的一级菜单),也可以是父菜单项(包含二级菜单的菜单项)
+ */
+@Data
+public class Menu {
+    private Button[] button;
+}
diff --git a/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java b/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java
index be0a26a..4c940c8 100644
--- a/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java
+++ b/src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java
@@ -6,7 +6,7 @@
 
     public static final String SEND_INFO_URL = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=";
 
-    public static final String WX_ACCESS_TOKEN_REDIS_KEY = "ywgpz_access_token";
+    public static final String WX_ACCESS_TOKEN_REDIS_KEY = "access_token";
     public static final String BAIDU_ACCESS_TOKEN_REDIS_KEY = "bd_access_token";
 
     public static final String UNIFIEDORDER = "https://api.mch.weixin.qq.com/pay/unifiedorder";
diff --git a/src/main/java/cc/mrbird/febs/pay/util/WechatMenuUtil.java b/src/main/java/cc/mrbird/febs/pay/util/WechatMenuUtil.java
new file mode 100644
index 0000000..b44c818
--- /dev/null
+++ b/src/main/java/cc/mrbird/febs/pay/util/WechatMenuUtil.java
@@ -0,0 +1,122 @@
+package cc.mrbird.febs.pay.util;
+
+import cc.mrbird.febs.pay.model.Button;
+import cc.mrbird.febs.pay.model.CommonButton;
+import cc.mrbird.febs.pay.model.ComplexButton;
+import cc.mrbird.febs.pay.model.Menu;
+import cn.hutool.json.JSONUtil;
+import lombok.extern.slf4j.Slf4j;
+import net.sf.json.JSONObject;
+import org.springframework.http.converter.StringHttpMessageConverter;
+import org.springframework.web.client.RestTemplate;
+
+import java.nio.charset.Charset;
+
+/**
+ * 菜单初始化
+ */
+@Slf4j
+public class WechatMenuUtil {
+
+    public static void main(String[] args) {
+        // 第三方用户唯一凭证
+        String appId = "wx052716b1a388b13c";
+        // 第三方用户唯一凭证密钥
+        String appSecret = "e7cf355e7234f035d8fea6a3a19513b9";
+        String accessToken = "70_VnGMZaIo0pkY7WJOfGVnRlqUGC8UQPu0eN4L8Hc9PearLQgIAtWOC2UCaErhctjI7ORBk_aeBg3QudsLWi5z5_lIPd_zwMCf7E4g8rHkqvArD-N8jyKOKJfzNGsGWJeAFAKAN";
+
+        // 调用接口创建菜单
+        String result = createMenu(getMenu(), accessToken);
+
+        // 判断菜单创建结果
+        if ("0".equals(result))
+            log.info("菜单创建成功!");
+        else
+            log.info("菜单创建失败,错误码:" + result);
+    }
+
+    // 菜单创建(POST) 限100(次/天)
+    public static String menu_create_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
+
+    /**
+     * 创建菜单
+     *
+     * @param menu 菜单实例
+     * @param accessToken 有效的access_token
+     * @return 0表示成功,其他值表示失败
+     */
+    public static String createMenu(Menu menu, String accessToken) {
+        RestTemplate restTemplate = new RestTemplate();
+        restTemplate.getMessageConverters().stream().filter(converter -> converter instanceof StringHttpMessageConverter).forEach(converter -> ((StringHttpMessageConverter) converter).setDefaultCharset(Charset.forName("UTF-8")));
+        String result = "0";
+        // 拼装创建菜单的url
+        String url = menu_create_url.replace("ACCESS_TOKEN", accessToken);
+        // 将菜单对象转换成json字符串
+        String jsonMenu = JSONObject.fromObject(menu).toString();
+
+        System.out.println(result);
+        // 调用接口创建菜单
+        try {
+            // 发送post请求,并打印结果,以String类型接收响应结果JSON字符串
+            String jsonObject = restTemplate.postForObject(url, jsonMenu, String.class);
+            if (null != jsonObject) {
+                cn.hutool.json.JSONObject parseObj = JSONUtil.parseObj(jsonObject);
+                if (!"0".equals(parseObj.getStr("errcode"))) {
+                    result = parseObj.getStr("errcode");
+                    log.error("创建菜单失败 errcode:{} errmsg:{}", result, parseObj.getStr("errmsg"));
+                }
+            }
+        } catch (Exception e) {
+            log.error("创建菜单失败",e);
+        }
+        return result;
+    }
+
+    /**
+     * 组装菜单数据
+     *
+     * @return
+     */
+    private static Menu getMenu() {
+        CommonButton btn11 = new CommonButton();
+        btn11.setName("商城");
+        btn11.setType("view");
+        btn11.setKey("11");
+        btn11.setUrl("https://www.baidu.com/");
+
+        CommonButton btn24 = new CommonButton();
+        btn24.setName("公司简介");
+        btn24.setType("click");
+        btn24.setKey("24");
+
+        CommonButton btn31 = new CommonButton();
+        btn31.setName("我的分享码");
+        btn31.setType("click");
+        btn31.setKey("31");
+
+        /**
+         * 微信:  mainBtn1,mainBtn2,mainBtn3底部的三个一级菜单。
+         */
+
+        ComplexButton mainBtn1 = new ComplexButton();
+        mainBtn1.setName("药王谷铺子");
+        mainBtn1.setSub_button(new CommonButton[] { btn11});
+
+        ComplexButton mainBtn2 = new ComplexButton();
+        mainBtn2.setName("公司简介");
+        mainBtn2.setSub_button(new CommonButton[] { btn24 });
+
+        ComplexButton mainBtn3 = new ComplexButton();
+        mainBtn3.setName("我的分享码");
+        mainBtn3.setSub_button(new CommonButton[] { btn31 });
+
+
+        /**
+         * 封装整个菜单
+         */
+        Menu menu = new Menu();
+        menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });
+
+        return menu;
+    }
+}

--
Gitblit v1.9.1