公司想要做一个微信公众号,经理叫我去研究怎么自动回复信息,自定义菜单。
弄了几天,功能基本上都实现了,下面就讲讲步骤吧。
首先当然是需要一个微信公众号啦,没有的话可以先去申请(个人订阅号不支持自定义菜单,这个挺坑的,最后还是拿公司的工作号做的测试)。申请完成后需要进行开发的基本配置。
URL需要一个外网能够访问的地址(最好是映射到自己本机方便调试),Token与你程序中定义的token变量需要一致,用于接入微信的接口。
微信服务器转发request数据包含下面信息(在CoreServlet中的doGet方法中处理)
// 微信加密签名
String signature = request.getParameter("signature");
// 时间戳
String timestamp = request.getParameter("timestamp");
// 随机数
String nonce = request.getParameter("nonce");
// 随机字符串
String echostr = request.getParameter("echostr");
String[] arr = new String[] { token, timestamp, nonce }; //此处token为网页上设置的token
// 将token、timestamp、nonce三个参数进行字典序排序加密后与signature比对,一致时表示请求来自微信服务器。
out.print(echostr);
这个时候就接入成功了。
在CoreServlet中的doPost方法中处理你要做的操作,也就是自动回复这些
request里面传递的格式是XML,需要进行解析
// 发送方帐号(open_id)
String fromUserName = requestMap.get("FromUserName");
// 公众帐号
String toUserName = requestMap.get("ToUserName");
// 消息类型
String msgType = requestMap.get("MsgType");
// 消息内容
String content= requestMap.get("Content");
// 事件类型
String eventType = requestMap.get("Event");
可以自己根据需要返回对应的消息,格式也是XML
自定义菜单就稍微麻烦一些
首先要请求这个接口
"https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET"(APPID是开发者帐号,APPSECRET是开发者密码,请求方式是GET)
返回一个json数组,其中“access_token”是创建自定义菜单的凭证,“expires_in”是过期时间(7200秒)
接着调用下面这个接口(ACCESS_TOKEN是上个接口返回的“access_token”值,请求方式是POST)
"https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
我们可以将菜单以json格式通过该接口传递(形式如下)
{
"button":[
{
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
},
{
"type":"click",
"name":"歌手简介",
"key":"V1001_TODAY_SINGER"
},
{
"name":"菜单",
"sub_button":[
{
"type":"click",
"name":"hello word",
"key":"V1001_HELLO_WORLD"
},
{
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
}]
}]
}
传递成功之后会创建自定义的菜单
// 事件KEY值,与创建自定义菜单时指定的KEY值对应
String eventKey = requestMap.get("EventKey");
获取事件的KEY值,与自己定义的KEY值一致时,表示点击了菜单,可以在CoreServlet类中的doPost方法中进行相应的处理
还有一种菜单是点击之后直接跳转网页的,只是和普通的菜单的json拼装的属性不一样
{ "type":"view", "name":"歌手简介", "url":"http://www.qq.com/" }
type改成“view”类型,url为要访问的路径,没有key属性,点击后自动跳转