零java基础搞定微信Server_7_微信公众号的自定义菜单

本文作者twowinter,发布于2015年,如今整理重发。

前言

昨天玩了文本消息的接收,今天想试试自定义菜单。

转载请注明作者twowinter:http://blog.csdn.net/iotisan/

思路

微信开发文档告诉我们:

公众平台的接口分为两类:
1、 消息接口:公众平台将用户操作的信息发送给开发者配置的 URL,并接收回复。
2、 API 接口:由开发者主动调用的接口。

文档上也很清晰地梳理了接口,昨天的文本消息处理是属于消息接口,而今天的自定义菜单是属于API接口。

1.获取访问凭证 access_token

access_token 是公众号的全局唯一票据,公众号调用各接口时都需使用 access_token。获取访问凭证需要传入 appID 和 appsecret。

access_token 有效期目前为 2 个小时,需要定时刷新,且刷新后将导致上次获取的凭证失效。

由于获取访问凭证 API 接口有频率限制,频繁刷新可能导致超过限额,影响正常业务,因此需要对访问凭证进行缓存。  
所以需要对 access_token 的操作进行封装:  
1、 获取最新可用的 access_token  
2、 access_token 过期前需要有自动刷新机制  
3、 提供主动刷新接口给业务点调用,这是为了防止业务方的误刷新 access_token(如本地运行程序进行测试,导致服务器缓存的凭证失效),或者微信平台修改access_token 的策略导致access_token 提前过期  

Demo 中:  
AccessTokenUtil 类对 access_token 的访问进行了封装,使用定时任务进行刷新。  
HttpUtil 类负责替换 url 参数中 access_token,使用 httpclient 类库发起 https 请求。
并且在凭证无效时重新获取凭证并发起请求。  

2.创建自定义菜单

Demo 中创建“点灯” 、 “灭灯” 两个 CLICK 类型菜单。创建 CLICK菜单时,需要指定每个菜单对应的 key 值,用于在服务端收到消息时区分用户点击了哪个菜单。

代码见 Tools 类中 createMenu 方法。

创建自定义菜单后,由于微信客户端缓存,需要 24 小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。

代码处理

于是就移植AccessTokenUtil、HttpUtil、Tools这几个类就可以了。

在config.properties中设置appID、appsecret。然后再接收文本消息为“菜单”时就创建这个菜单。

    // 文本消息
    if (MsgType.TEXT.equals(msgType)) {
        // 可以在此处进行关键字自动回复
        String content = "收到文本消息: " + reqMap.get("Content");
        if (reqMap.get("Content").equals("菜单")) {           
            Tools.createMenu();
        }
        return XmlResp.buildText(fromUser, toUser, content);
    }

结果测试出现了如下错误:

菜单:{"button":[{"type":"click","name":"点灯","key":"V1001_LIGHT_ON"},{"type":"click","name":"灭灯","key":"V1002_LIGHT_OFF"}]}
refresh token...
result={"access_token":"yq9uUHzPF7Dhuw6CC3OcIvRs9v5j8h47QKItdFPRnQt5nqZd0d36oZZihniOlqzJznEd8MA21prq-rL3PWWN7BzerD7ceQ0lFdt3LCfjdcY","expires_in":7200}
result={"errcode":48001,"errmsg":"api unauthorized hint: [q3sRHa0075vr20]"}
创建菜单返回:{"errcode":48001,"errmsg":"api unauthorized hint: [q3sRHa0075vr20]"}
result={"errcode":48001,"errmsg":"api unauthorized hint: [ZpramA0076vr22]"}
查询菜单:{"errcode":48001,"errmsg":"api unauthorized hint: [ZpramA0076vr22]"}

原来是没有权限,仔细一看,自定义菜单确实是需要微信认证才行。

于是申请了测试帐号,重新输入了appID、appsecret。这才通过。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值