微信公众号自定义菜单和推送模板消息

  1. Java代码: 准备工作: (1)填写JS接口安全域名 (2)填写接口配置信息: (2)java的Token验证接口
@RequestMapping(value = "/verifier",method = {
          
   RequestMethod.GET})
    public void processGet(HttpServletRequest request, HttpServletResponse response) throws Exception{
          
   
        System.out.println("验证接口消息");
        String signature = request.getParameter("signature");
        String timestamp = request.getParameter("timestamp");
        String nonce = request.getParameter("nonce");
        String echostr = request.getParameter("echostr");
        //校验证签名
        boolean check = wxService.check(signature, timestamp, nonce);
        if (check){
          
   
            System.out.println("接入成功");
            PrintWriter writerOut = response.getWriter();
            writerOut.print(echostr);
            writerOut.flush();
            writerOut.close();
        }else {
          
   
            System.out.println("接入失败");
        }
    }
验证签名:
public boolean check(String signature, String timestamp, String nonce){
          
   
        //字典排序
        String token = "自定义的Token值";
        String[] wxStrArr = {
          
   token, timestamp, nonce};
        Arrays.sort(wxStrArr);
        //进行sha1加密
        String wxString = wxStrArr[0]+wxStrArr[1]+wxStrArr[2];
        String wxSha1 = sha1(wxString);
        //加密后的数据和signature进行对比
       return StringUtils.equalsIgnoreCase(wxSha1,signature);
    }
private static String sha1(String wxString) {
          
   
        try {
          
   
            //获取加密对象
            MessageDigest sha1 = MessageDigest.getInstance("sha1");
            byte[] digest = sha1.digest(wxString.getBytes());
            StringBuilder sb = new StringBuilder();
            char[] chars = {
          
   0,1,2,3,4,5,6,7,8,9,a,b,c,d,e,f};
            //处理加密结果
            for (byte b : digest) {
          
   
                sb.append(chars[(b>>4)&15]);
                sb.append(chars[b&15]);
            }
            return sb.toString();
        } catch (Exception e) {
          
   
            e.printStackTrace();
        }
        return null;
    }

###创建菜单;

(1)抽象的菜单类

public class AbstractButton {
          
   
    private String name;

    public String getName() {
          
   
        return name;
    }

    public void setName(String name) {
          
   
        this.name = name;
    }

    public AbstractButton(String name) {
          
   
        super();
        this.name = name;
    }
}

(2)view菜单

public class ViewButton extends AbstractButton {
          
   
    private String type = "view";

    private String url;

    public String getType() {
          
   
        return type;
    }

    public void setType(String type) {
          
   
        this.type = type;
    }

    public String getUrl() {
          
   
        return url;
    }

    public void setUrl(String url) {
          
   
        this.url = url;
    }

    public ViewButton(String name, String url) {
          
   
        super(name);
        this.url = url;
    }
}

###获取Token

Token的有效时间为2小时,创建一个保存Token值和判断Token是否过期的类;
public class WxAccessToken {
          
   
    private String accessToken;

    private long expiresTime;
    public String getAccessToken() {
          
   
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
          
   
        this.accessToken = accessToken;
    }

    public long getExpiresTime() {
          
   
        return expiresTime;
    }

    public void setExpiresTime(long expiresTime) {
          
   
        this.expiresTime = expiresTime;
    }

    public WxAccessToken(String accessToken, String expiresIn) {
          
   
        super();
        this.accessToken = accessToken;
        expiresTime = System.currentTimeMillis()+Integer.parseInt(expiresIn)*1000;
    }
    /**
     *判断 accessToken是否过期
     */
    public boolean isExpires(){
          
   
        return System.currentTimeMillis()>expiresTime;
    }
}
向外暴露 获取Token方法
/**
     *向外暴露 获取Token方法
     *
     */
    public String getAccessToken(){
          
   
        if (wxAccessToken == null || wxAccessToken.isExpires()){
          
   
            getToken();
        }
        return wxAccessToken.getAccessToken();
    }
//1,推送消息
        JSONObject templateMessage = disposeTemInfo("用户的openId");
        //3,如果是正式版发送模版消息,这里需要配置你的信息
        JSONObject msgJsonObject = disposePushInfoList();
        JSONObject jsonObject = JSONObject.fromObject(templateMessage);
        jsonObject.put("data",msgJsonObject);
        //发起推送
        try {
          
   
            sendTemplateMsg(jsonObject);
            System.out.println("推送成功");
        } catch (Exception e) {
          
   
            System.out.println("推送失败:" + e.getMessage());
            e.printStackTrace();
        }
经验分享 程序员 微信小程序 职场和发展