xiaoyong931011
2023-07-15 217882984233d0541de9a9cd99b6a97eb22b2fe9
服务号菜单
5 files added
2 files modified
173 ■■■■■ changed files
src/main/java/cc/mrbird/febs/mall/quartz/WxxcxJob.java 1 ●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/model/Button.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/model/CommonButton.java 13 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/model/ComplexButton.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/model/Menu.java 11 ●●●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/util/WechatConfigure.java 2 ●●● patch | view | raw | blame | history
src/main/java/cc/mrbird/febs/pay/util/WechatMenuUtil.java 122 ●●●●● patch | view | raw | blame | history
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();
src/main/java/cc/mrbird/febs/pay/model/Button.java
New file
@@ -0,0 +1,13 @@
package cc.mrbird.febs.pay.model;
import lombok.Data;
/**
 * 菜单项的基类,所有一级菜单、二级菜单都共有一个相同的属性,那就是name
 */
@Data
public class Button {
    private String name;
}
src/main/java/cc/mrbird/febs/pay/model/CommonButton.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/pay/model/ComplexButton.java
New file
@@ -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;
}
src/main/java/cc/mrbird/febs/pay/model/Menu.java
New file
@@ -0,0 +1,11 @@
package cc.mrbird.febs.pay.model;
import lombok.Data;
/**
 * 整个菜单对象的封装,菜单对象包含多个菜单项(最多只能有3个),这些菜单项即可以是子菜单项(不含二级菜单的一级菜单),也可以是父菜单项(包含二级菜单的菜单项)
 */
@Data
public class Menu {
    private Button[] button;
}
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";
src/main/java/cc/mrbird/febs/pay/util/WechatMenuUtil.java
New file
@@ -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;
    }
}