【微信开发第一章】SpringBoot实现微信公众号创建菜单,同步菜单功能

2023/11/30 8:18:55

前言

在进行微信公众号业务开发的时候,微信公众号的自定义菜单是非常重要的一环,该篇文章会先使用微信测试工具过一遍流程,再使用代码进行实现,争取看过的小伙伴都能够实现,创建公众号菜单和代码同步公众号菜单功能本文章在每一步都有记录,力争理解的同时各位小伙伴也能够实现功能

说明:因为开通微信服务号是需要营业执照和300元的,而个人号有些功能又没有,所以是比较不方便的,但是微信官方很贴心的为我们准备了测试公众号,所以我们在测试开发阶段均可以使用测试公众号来调试。

文章目录

  • 前言
  • 1、通过微信测试工具实现创建菜单
  • 2、通过Java代码实现同步微信公众号菜单
  • 总结


1、通过微信测试工具实现创建菜单

1、访问微信测试公众号地址:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

2、用微信扫码登录
3、在这里我们可以看到我们的测试号的APPId和和密钥(这个很重要)
在这里插入图片描述
相信对接过第三方接口的小伙伴并不陌生,几乎所有的第三方接口都有自己的ID和密钥。

4、使用微信公众号接口测试工具:https://mp.weixin.qq.com/debug/

在这里插入图片描述
第一步:使用appId和密钥获取:access_token,然后复制保存下来,这一步很关键
在这里插入图片描述

第二步:使用刚刚的accessToken请求创建菜单的接口

在这里插入图片描述
我使用的模板如下:

{
    "button": [
        {
            "type": "view", 
            "name": "公司简介", 
            "url": "http://kaifa.yuantiaokj.com/static/comProfile/"
        }, 
        {
            "name": "水务办理", 
            "sub_button": [
                {
                    "type": "view", 
                    "name": "业务申报", 
                    "url": "http://kaifa.xxx.com/static/wentifankui?activeIndex=0"
                }, 
                {
                    "type": "view", 
                    "name": "通知公告", 
                    "url": "http://kaifa.xxx.com/static/gonggao"
                }
            ]
        }, 
        {
            "name": "在线缴费", 
            "sub_button": [
                {
                    "type": "view", 
                    "name": "在线缴费", 
                    "url": "http://kaifa.xxxx.com/static?companyId=2"
                }, 
                {
                    "type": "view", 
                    "name": "缴费指南", 
                    "url": "http://kaifa.xxxx.com/static/jiaofeizhinan?activeIndex=0"
                }
            ]
        }
    ]
}

此时菜单创建成功,我们可以使用微信关注自己的测试公众号,还是在微信测试公众号这个链接:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index
在这里插入图片描述
用PC端或者手机端查看,发现菜单创建成功啦~
在这里插入图片描述

2、通过Java代码实现同步微信公众号菜单

1、引入依赖

    <dependencies>
        <dependency>
            <groupId>com.github.binarywang</groupId>
            <artifactId>weixin-java-mp</artifactId>
            <version>4.1.0</version>
        </dependency>
    </dependencies>

2、在配置文件中配置微信测试公众号的appId和密钥

#自己测试账号的AppID、密钥,可以用来接受消息
wechat.mpAppId: wxe789s8175911
wechat.mpAppSecret: c2c4f54qdcod665852w6270d

3、创建微信配置类

@Component
public class WeChatMpConfig {

    @Autowired
    private ConstantPropertiesUtil constantPropertiesUtil;

    @Bean
    public WxMpService wxMpService(){
        WxMpService wxMpService = new WxMpServiceImpl();
        wxMpService.setWxMpConfigStorage(wxMpConfigStorage());
        return wxMpService;
    }
    @Bean
    public WxMpConfigStorage wxMpConfigStorage(){
        WxMpDefaultConfigImpl wxMpConfigStorage = new WxMpDefaultConfigImpl();
        wxMpConfigStorage.setAppId(ConstantPropertiesUtil.ACCESS_KEY_ID);
        wxMpConfigStorage.setSecret(ConstantPropertiesUtil.ACCESS_KEY_SECRET);
        return wxMpConfigStorage;
    }
}

4、编写Service接口

public interface MenuService extends IService<Menu> {
    //同步微信公众号单
    void syncMenu();
}

5、编写ServiceImpl实现类

    @Autowired
    private WxMpService wxMpService;
   
    @Override
    public void syncMenu() {
        List<MenuVo> menuVoList = this.findMenuInfo();
        //菜单
        JSONArray buttonList = new JSONArray();
        for(MenuVo oneMenuVo : menuVoList) {
            JSONObject one = new JSONObject();
            one.put("name", oneMenuVo.getName());
            JSONArray subButton = new JSONArray();
            for(MenuVo twoMenuVo : oneMenuVo.getChildren()) {
                JSONObject view = new JSONObject();
                view.put("type", twoMenuVo.getType());
                if(twoMenuVo.getType().equals("view")) {
                    view.put("name", twoMenuVo.getName());
                    view.put("url", "http://ggkt2.vipgz1.91tunnel.com/#"
                            +twoMenuVo.getUrl());
                } else {
                    view.put("name", twoMenuVo.getName());
                    view.put("key", twoMenuVo.getMeunKey());
                }
                subButton.add(view);
            }
            one.put("sub_button", subButton);
            buttonList.add(one);
        }
        //菜单
        JSONObject button = new JSONObject();
        button.put("button", buttonList);
        this.wxMpService.getMenuService().menuCreate(button.toJSONString());
    }

6、Controller实现

@ApiOperation(value = "同步菜单")
@GetMapping("syncMenu")
public Result createMenu() throws WxErrorException {
    menuService.syncMenu();
    return Result.ok(null);
}

7、测试,因为我们使用的是get请求,所以可以直接使用浏览器访问接口测试:localhost:8080/api/wechat/menu/syncMenu


总结

怎么样,先用测试工具走一遍流程,再使用代码实现功能,看完是不是觉得特别简单呢~

【微信开发第一章】SpringBoot实现微信公众号创建菜单,同步菜单功能:https://blog.csdn.net/weixin_47316183/article/details/127821095?spm=1001.2014.3001.5502

【微信开发第二章】SpringBoot实现微信公众号普通消息和模板消息回复:https://blog.csdn.net/weixin_47316183/article/details/127821653?spm=1001.2014.3001.5502


http://www.jnnr.cn/a/124355.html

相关文章

【MySql】mysql 锁机制与原理详解

前言 不管是数据库&#xff0c;还是很多后端编程语言&#xff0c;都存在锁的机制&#xff0c;锁的存在有效解决了并发情况下对共同资源的抢占&#xff0c;保证了数据的稳定性和一致性&#xff0c;在mysql中&#xff0c;锁是如何工作的呢&#xff1f;其底层的工作原理是怎样的呢…

C/C++ Qt 标准Dialog对话框组件应用

在Qt中对话框分为两种形式&#xff0c;一种是标准对话框&#xff0c;另一种则是自定义对话框&#xff0c;在一般开发过程中标准对话框使用是最多的了&#xff0c;标准对话框一般包括 QMessageBox,QInputDialog,QFileDialog 这几种&#xff0c;这里我将总结本人在开发过程中常用…

使用 TF-IDF 算法将文本向量化

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 TF-IDF 算法前言一、TF-IDF 是什么&#xff1f;含义理解&#xff1a;二、算法步骤1.统计每一篇文档中词的出现次数2.计算词频(TF)3.计算逆文档频率(IDF)4.计算TF-IDF总结前言…

C++程序的内存分区

栈区&#xff08;stack&#xff09;&#xff1a;由编译器自动分配释放&#xff0c;存放函数的参数值&#xff0c;局部变量值等。堆区&#xff08;heap&#xff09;&#xff1a;一般由程序员分配释放&#xff0c;随叫随到&#xff0c;挥之即走。全局/静态区&#xff08;static&a…

堆--TopK问题

题目要求&#xff1a; 输入整数数组 arr &#xff0c;找出其中最小的 k 个数。例如&#xff0c;输入4、5、1、6、2、7、3、8这8个数字&#xff0c;则最小的4个数字是1、2、3、4。 示例 1&#xff1a; 输入&#xff1a;arr [3,2,1], k 2 输出&#xff1a;[1,2] 或者 [2,1]示例…

对象的比较(上)PriorityQueue中的底层源码解析

作者&#xff1a;~小明学编程 文章专栏&#xff1a;Java数据结构 格言&#xff1a;目之所及皆为回忆&#xff0c;心之所想皆为过往 目录 问题引入 offer() 扩容 构造方法 grow() siftUp() siftUpComparable&#xff08;&#xff09; 问题引入 问题是这样的&#xff0c…

【十问十答】回归模型知识点

1. 线性回归的假设是什么 线性回归有四个假设&#xff1a; 线性&#xff1a;自变量&#xff08;x&#xff09;和因变量&#xff08;y&#xff09;之间应该存在线性关系&#xff0c;这意味着x值的变化也应该在相同方向上改变y值。 独立性&#xff1a;特征应该相互独立&#xf…

LeetCode ——160. 相交链表,142. 环形链表 II

✅<1>主页&#xff1a;C语言的前男友 &#x1f4c3;<2>知识讲解&#xff1a;LeetCode经典链表笔试题目 &#x1f525;<3>创作者&#xff1a;C语言的前男友 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f3e1;<5>系统环境&#xff1a;…

OneNet一次上传多个数据,在可视化页面解析显示

一、OneNet是什么&#xff1f; OneNET-中国移动物联网开放平台是由中国移动打造的PaaS物联网开放平台。平台能够帮助开发者轻松实现设备接入与设备连接&#xff0c;提供综合性的物联网解决方案&#xff0c;实现物联网设备的数据获取&#xff0c;数据存储&#xff0c;数据展现。…

APS计划排程在半导体行业的应用

自疫情爆发以来&#xff0c;经济迅速发展&#xff0c;5G、人工智能、电动汽车市场快速扩张&#xff0c;芯片需求进一步猛涨。诸多市场将半导体短缺视为限制增长及供应的主要原因&#xff0c;半导体行业也因此受到制造商、政府乃至消费者的广泛关注。 半导体行业处于产品研发的前…

【JavaSE】封装与继承,访问限定符的总结

文章目录前言封装包的封装如何创建包导包private类的封装继承super子类的构造方法子类继承父类时的内存分配访问限定符的总结前言 终于经历了漫长的前期学习的铺垫&#xff0c;我们终于见到了面向对象程序的三大特性&#xff1a;封装&#xff0c;继承&#xff0c;多态。今天我…

[ Linux ] 重定向的再理解,以及文件系统的理解、inode和软硬链接

在上篇文章我们了解了Linux中文件描述符和重定向以及缓冲区的理解&#xff0c;本篇文章我们要对了解一下重定向的再理解、文件系统以及引出inode的意义和软硬链接。 目录 0.重定向 0.1标准输出 标准错误 为什么perror2后面跟了一个success 1.inode 1.1 inode理解 一个in…

【Unity】Entities 1.0 学习(一):Aspect

Unity在 2022年下半年&#xff08;我印象是9月份左右&#xff09;推出了 Entities 1.0 &#xff0c;可以在 2022.2.0b8 以上的版本使用。当时我粗略地看了一下&#xff0c;但是没有深入学习。最近空闲时间稍多&#xff0c;就认真来学习一下 Entities 1.0有啥新的东西。 1.0 毕竟…

0092 图

import java.util.ArrayList; import java.util.Arrays; import java.util.LinkedList; /* * 图 * 图是一种数据结构&#xff0c;其中节点可以具有零个或多个相邻元素。 * 两个节点之间的连接称为边&#xff0c;结点也成为顶点 * * 常用概念 * 1.顶点 * 2.边 * 3.路径…

javaweb eclipse项目环境问题

javaweb 项目环境问题一、jar包1.1 jar包下载路径1.2 导入jar包的方法二、eclipse环境2.1 eclipse字体大小设置/编码设置2.2 关于eclipse无法执行java程序的解决方法2.3 eclipse run as 没有出现on server三、html、css问题3.1 html、css注释快捷键3.2 常用css样式大全以及css属…

处理一对多映射关系的两种方式

一对多关系实例&#xff1a; 员工表&#xff1a; 部门表&#xff1a; 员工-部门关系表中&#xff0c;一个部门对应多个员工&#xff0c;想要在部门表中查询出对应的员工信息&#xff0c;就要解决一对多映射关系。 解决方法&#xff1a;在Dept实体类中添加员工的LIst集合 pub…

大学生HTML个人网页作业作品:基于html css实现围棋网页(带报告4800字)

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

beamManagement(一)idle初始接入过程

微信同步更新欢迎关注同名modem协议笔记 NR中所有的上下行信道的发送和接收都是基于波束。基站通过对信道质量的测量来动态选择UE和基站之间波束的方向和频率&#xff0c;进而完成通信。NR使用的频率信号是高频信号&#xff0c;高频意味着波长越短&#xff0c;天线也就越短。当…

[附源码]java毕业设计大学生学业预警系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

青少年python系列 42.面向对象-继承

青少年python系列目录_老程序员115的博客-CSDN博客 青少年python教学视频ppt源码 继承&#xff1f;继承啥&#xff1f;提起继承这两个字&#xff0c;最先能够联想到的应该就是子继父业这个成语。还记得之前在我们的课程中提及过&#xff0c;在面向对象编程时&#xff0c;是可以…
最新文章