微信公众号--创建菜单JAVA--SSM

本文以SSM框架示例(研究中 欢迎探讨)

如果是自己开发着玩或者试试可以看本文 公司或者工作的请去其他处

SSM框架这里就不说了 我是以Tomcat+SSM+花生壳+微信公众号做了一个简单的具有菜单功能的公众号

微信公众号--创建菜单JAVA--SSM

下面是controller 程序入口:::


@Controller
@RequestMapping("/*")
public class createMenuController {


private String Token="****************";//token微信公证号上面找
@RequestMapping(value="/createMenu")
public void createMenu(HttpServletRequest request, HttpServletResponse response){
access(request, response);
//调用UTI执行创建菜单的动作
    int status = MenuUtil.createMenu(MenuUtil.initMenu());
    if(status==0){
    System.out.println("菜单创建成功!");
    }else{
    System.out.println("菜单创建失败!");
    }
}
private String access(HttpServletRequest request, HttpServletResponse response) {  
        // 验证URL真实性  
        System.out.println("进入验证access");  
        String signature = request.getParameter("signature");// 微信加密签名  
        String timestamp = request.getParameter("timestamp");// 时间戳  
        String nonce = request.getParameter("nonce");// 随机数  
        String echostr = request.getParameter("echostr");// 随机字符串  
        List<String> params = new ArrayList<String>();  
        params.add(Token);  
        params.add(timestamp);  
        params.add(nonce);  
        // 1. 将token、timestamp、nonce三个参数进行字典序排序  
        Collections.sort(params, new Comparator<String>() {  
            public int compare(String o1, String o2) {  
                return o1.compareTo(o2);  
            }  
        });  
        // 2. 将三个参数字符串拼接成一个字符串进行sha1加密  
        String temp = SHA1.encode(params.get(0) + params.get(1) + params.get(2));  
        if (temp.equals(signature)) {  
            try {  
                response.getWriter().write(echostr);  
                System.out.println("成功返回 echostr:" + echostr);  
                return echostr;  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
        }  
        System.out.println("失败 认证");  
        return null;  
    } 
}

下面是MenuUtil类::

public class MenuUtil {


public static Menu initMenu(){
//首先创建二级菜单
CommonButton cb1=new CommonButton();
cb1.setKey("key1");
cb1.setName("推送菜单");
cb1.setType("click");


CommonButton cb2=new CommonButton();
cb2.setKey("key2");
cb2.setName("今日音乐");
cb2.setType("click");

CommonButton cb5=new CommonButton();
cb5.setKey("key5");
cb5.setName("今日天气");
cb5.setType("click");

//创建第一个一级菜单
ComplexButton cx1=new ComplexButton();
cx1.setName("功能菜单");
cx1.setSub_button(new Button[]{cb1,cb2,cb5});
//继续创建二级菜单
ViewButton vb1=new ViewButton();
vb1.setName("百度");
vb1.setType("view");
vb1.setUrl("http://www.baidu.com");


ViewButton vb2=new ViewButton();
vb2.setName("搜狐");
vb2.setType("view");
vb2.setUrl("http://www.souhu.com");


//创建第二个一级菜单
ComplexButton cx2=new ComplexButton();
cx2.setName("进入网站");
cx2.setSub_button(new Button[]{vb1,vb2});

//继续创建二级菜单
CommonButton cb3=new CommonButton();
cb3.setKey("key3");
cb3.setName("位置");
cb3.setType("location_select");

CommonButton cb4=new CommonButton();
cb4.setKey("key4");
cb4.setName("扫码");
cb4.setType("scancode_push");


//创建第三个一级菜单
ComplexButton cx3=new ComplexButton();
cx3.setName("外连功能");
cx3.setSub_button(new Button[]{cb3,cb4});

//封装菜单数据
Menu menu=new Menu();
menu.setButton(new ComplexButton[]{cx1,cx2,cx3});
System.out.println(menu);
return menu;
}



/**
* 创建自定义菜单(每天限制1000次)
* */
public static int createMenu(Menu menu){
String jsonMenu=JSONObject.fromObject(menu).toString();


int status=0;


System.out.println("菜单:"+jsonMenu);
String path="https://api.weixin.qq.com/cgi-bin/menu/create?access_token="+TokenThread.access_token.getAccess_token();
try {
URL url=new URL(path);
HttpURLConnection http = (HttpURLConnection)url.openConnection();
http.setDoOutput(true);
http.setDoInput(true);
http.setRequestMethod("POST");
http.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
http.connect();
OutputStream os = http.getOutputStream();
os.write(jsonMenu.getBytes("UTF-8"));
os.close();

InputStream is = http.getInputStream();
int size = is.available();
byte[] bt = new byte[size];
is.read(bt);
String message=new String(bt,"UTF-8");
JSONObject jsonMsg = JSONObject.fromObject(message);
status = Integer.parseInt(jsonMsg.getString("errcode"));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return status;
}

下面是TokenThread类:::

public class TokenThread implements Runnable{


//微信公众号的凭证和秘钥
public static final String appID = "******************";
public static final String appScret = "********************************";
public static AccessToken access_token=null;
@Override
public void run() {
while(true){
try {
//调用工具类获取access_token(每日最多获取100000次,每次获取的有效期为7200秒)
access_token=AccessTokenUtil.getAccessToken(appID, appScret);
if(null!=access_token){
System.out.println("accessToken获取成功:"+access_token.getExpires_in());
//7000秒之后重新进行获取
Thread.sleep((access_token.getExpires_in()-200)*1000);
}else{
//获取失败时,60秒之后尝试重新获取
Thread.sleep(60*1000);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}

}


}