最近弄了几天微信自定义菜单的开发,对比着接口文档写了一段时间,但是一直都有错误,我用了接口在线调试工具https://mp.weixin.qq.com/debug/看到了一个菜单的初级效果,在实现自定义菜单的开发中主要参考了这篇博客http://blog.csdn.net/lyq8479/article/details/9841371非常感谢柳峰老师的博客。接下来讲一下我怎么实现的。
实现这些的基础:公网IP(将服务器打开,其他任意网络能够访问你的服务器)
接入验证的代码(这一部分也可以参考柳峰老师的博客)
http://blog.csdn.net/lyq8479/article/details/8944988
首先你需要找到你的appId和appSecret,我是申请了微信开发测试号
http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login测试号有很多功能权限。看看我的测试号截图:
这里有appId和appSecret,接下来进行第2步,获取access_token,这个需要我们自己拼接URL。
最后也没有什么问题。
来看第一段代码:这是验证接口文件的一部分,在doget里面对验证接口的时候,若通过验证,则生成菜单。MenuManager.createMenu();
/**
* 确认请求来自微信服务器
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// TODO Auto-generated method stub
//微信加密签名
String signature = request.getParameter("signature");
//时间戳
String timestamp = request.getParameter("timestamp");
//随机数
String nonce = request.getParameter("nonce");
//随机字符串
String echostr = request.getParameter("echostr");
PrintWriter out = response.getWriter();
//通过检验signature 对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败
if(SignUtil.checkSignature(signature,timestamp,nonce))
{
out.print(echostr);
***
MenuManager.createMenu();
-------------------------
***
}
out.close();
out = null;
}
再来看第二段代码:这就是上面生成菜单的方法,在程序中可以写一些输出语句便于自己的理解,以及运行到某个地方出错的时候可以方便查找。关于下面代码的部分实现可以参考柳峰老师博客。
package com.**.Menu;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.**.pojo.AccessToken;
import com.**.pojo.Button;
import com.**.pojo.CommonButton;
import com.**.pojo.ComplexButton;
import com.**.pojo.Menu;
import com.**.util.WeixinUtil;
/**
* 菜单管理器
* @author ***
*
*/
public class MenuManager {
private static Logger log = LoggerFactory.getLogger(MenuManager.class);
public static void createMenu()
{
//第三方用户唯一凭证
String appId ="****************";\\这里换成上面说的Appid
String appSecret ="*********************";\\这里换成上面说的appSecret
//调用接口获取access_token
AccessToken at = WeixinUtil.getAccessToken(appId, appSecret);
System.out.println("接口凭证"+at);
if(null!=at)
{
//调用接口创建菜单
int result = WeixinUtil.createMenu(getMenu(), at.getToken());
//判断菜单创建结果
if(0==result)
log.info("菜单创建成功");
else
log.info("菜单创建失败,错误码"+result);
}
}
/**
* 组装菜单
* @return
*/
private static Menu getMenu() {
// TODO Auto-generated method stub
CommonButton btn11 = new CommonButton();
btn11.setName("悄悄话1");
btn11.setType("click");
btn11.setKey("11");
CommonButton btn12 = new CommonButton();
btn12.setName("悄悄话2");
btn12.setType("click");
btn12.setKey("12");
CommonButton btn21 = new CommonButton();
btn21.setName("搞笑1");
btn21.setType("click");
btn21.setKey("21");
CommonButton btn22 = new CommonButton();
btn22.setName("搞笑2");
btn22.setType("click");
btn22.setKey("22");
CommonButton btn23 = new CommonButton();
btn23.setName("搞笑3");
btn23.setType("click");
btn23.setKey("23");
CommonButton btn31 = new CommonButton();
btn31.setName("订座1");
btn31.setType("click");
btn31.setKey("31");
ComplexButton mainBtn1 = new ComplexButton();
mainBtn1.setName("悄悄话");
mainBtn1.setSub_button(new CommonButton[] {btn11,btn12});
ComplexButton mainBtn2 = new ComplexButton();
mainBtn2.setName("笑话");
mainBtn2.setSub_button(new CommonButton[] {btn21,btn22,btn23});
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;
}
}
当你的代码没有问题时,你可以打印出来一些信息,如果有问题也可以通过打印出来的信息判断出现了什么问题。希望你也能和我一样实现自定义菜单哦!加油