昨天运营同事又在催公众号菜单改版的事儿,搞得我头大。说是要加个新活动入口,还得把旧菜单重新分组。我寻思这不就是个后台配置嘛结果点开微信后台一看——好家伙!想加个跳转网页的菜单项,居然要填带公众号AppSecret的URL!这玩意儿能随便写进前端?吓得我赶紧关了网页。
开干前的折腾
翻完微信开发文档更懵了,全是access_token、JSON数据结构这些词儿。我端着枸杞茶琢磨了半天,决定用Java硬刚。先打开IDE新建了个SpringBoot项目,噼里啪敲了仨依赖:
- spring-boot-starter-web(没这玩意儿连HTTP请求都发不出去)
- lombok(省得写getter setter手抽筋)
- hutool-all(国产工具包,能少写八行代码)
接着在*里塞配置:
wechat:
appid: 你猜我会不会写在这儿
secret: 更不可能告诉你
跟access_token死磕
文档说调菜单接口得先搞令牌。吭哧吭哧写了个TokenUtil类,主要就干两件事:
- 用Hutool的HttpUtil往微信服务器发请求
- 把返回的JSON里那串长得像乱码的access_token抠出来
还加了本地缓存,省得每次调接口都要重新要令牌。测试的时候手抖把AppSecret输错一位,返回{"errcode":40001,"errmsg":"invalid credential"}——好家伙,这错误码查得我差点把枸杞茶打翻。
菜单JSON劝退现场
最坑的来了!微信要求的菜单JSON结构跟俄罗斯套娃似的:
"button": [
"type": "view",
"name": "吐槽通道",
"url": "https://.../oauth?appid=xxxx"
"name": "暴打产品经理",
"sub_button": [
{"type": "click", "name": "拳击模式", "key": "PUNCH_MODE"},
{"type": "click", "name": "嘴炮模式", "key": "KEYBOARD_MODE"}
光写这个嵌套结构就废了半小时。好不容易封装成Java对象,用转字符串时,又因为字段名不对报错。气得我直接把类里的subButton改成sub_button才搞定。
临门一脚
调创建菜单接口的代码反而简单:
- 拼URL:字符串拼接把access_token塞进去
- 用*发送菜单JSON
- 盯着返回的{"errcode":0,"errmsg":"ok"}傻笑
结果手机点开公众号菜单——新菜单闪亮登场!运营同事发来个表情包:"技术哥哥最帅"。我反手就把调试用的JSON配置文件锁进了保险柜,这玩意儿要是泄露了可比删库跑路还刺激。
今早隔壁组老王还跑来问:“听说你三行代码搞定微信菜单?” 我默默打开Git提交记录给他看——整整12个commit,5次JSON解析失败,3次令牌过期!他端着保温杯的手都在抖:“告辞,我还是去用第三方平台...”





