使用JAVA开发微信公众平台接口

简介: 研究了下微信公众平台接口开发,可回复用户发来的请求由于腾讯限制不能每天自动群发送信息

研究了下微信公众平台接口开发,可回复用户发来的请求

由于腾讯限制不能每天自动群发送信息

WeChatServlet 类:

1.
package com.wechat.servlet;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.Arrays;
import java.util.Map;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.wechat.utils.EncryptUtil;
import com.wechat.utils.XmlUtil;
public class WeChatServlet extends HttpServlet {
  private static final long serialVersionUID = 1L;
  //微信平台上填的Token和这里需要一致
  public static final String Token = "loveplat";
  /**
   * 微信公众平台验证调用方法
   */
  @Override
  protected void doGet(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    String signature = request.getParameter("signature");
    String timestamp = request.getParameter("timestamp");
    String nonce = request.getParameter("nonce");
    String[] ArrTmp = { Token, timestamp, nonce };
    Arrays.sort(ArrTmp);
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < ArrTmp.length; i++) {
      sb.append(ArrTmp[i]);
    }
    String pwd = EncryptUtil.Encrypt(sb.toString());
    String echostr = request.getParameter("echostr");
    System.out.println("pwd=="+pwd);
    System.out.println("echostr=="+echostr);
    if(pwd.equals(signature)){
      if(!"".equals(echostr) && echostr != null){
        response.getWriter().print(echostr);
      }
    }
  }
  /**
   * 用户向公众平台发信息并自动返回信息
   */
  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    StringBuffer sb = new StringBuffer();
    String line;
    Map<String, String> map = null;
    try {
      request.setCharacterEncoding("UTF-8");
      BufferedReader reader = request.getReader();
      while ((line = reader.readLine()) != null) {
        sb.append(line);
      }
      map = XmlUtil.xml2Map(sb.toString());
    } catch (Exception e) {
      e.printStackTrace();
    }
    sb = new StringBuffer();
    sb.append("<xml><ToUserName><![CDATA[").append(
        map.get("xml.FromUserName")).append(
        "]]></ToUserName><FromUserName><![CDATA[").append(
        map.get("xml.ToUserName")).append(
        "]]></FromUserName><CreateTime>").append(
        map.get("xml.CreateTime")).append(
        "</CreateTime><MsgType><![CDATA[text]]></MsgType>").append(
        "<Content><![CDATA[收到");
    sb.append("]]></Content>").append("<FuncFlag>0</FuncFlag></xml>");
    response.setCharacterEncoding("UTF-8");
    System.out.println(sb.toString());
    response.getWriter().print(sb.toString());
  }
  @Override
  public void destroy() {
    super.destroy();
  }
  @Override
  public void init() throws ServletException {
    super.init();
  }
}

XmlUtil 类:需要导入jdom.jar包

package com.wechat.utils;
import java.io.IOException;
import java.io.StringReader;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
public class XmlUtil {
  public static Map<String, String> xml2Map(String xmlStr)
      throws JDOMException, IOException {
    Map<String, String> rtnMap = new HashMap<String, String>();
    SAXBuilder builder = new SAXBuilder();
    Document doc = builder.build(new StringReader(xmlStr));
    // 得到根节点
    Element root = doc.getRootElement();
    String rootName = root.getName();
    rtnMap.put("root.name", rootName);
    // 调用递归函数,得到所有最底层元素的名称和值,加入map中
    convert(root, rtnMap, rootName);
    return rtnMap;
  }
  /**
   * 递归函数,找出最下层的节点并加入到map中,由xml2Map方法调用。
   * 
   * @param e
   *           xml 节点,包括根节点
   * @param map
   *            目标map
   * @param lastname
   *            从根节点到上一级节点名称连接的字串
   */
  public static void convert(Element e, Map<String, String> map,
      String lastname) {
    if (e.getAttributes().size() > 0) {
      Iterator it_attr = e.getAttributes().iterator();
      while (it_attr.hasNext()) {
        Attribute attribute = (Attribute) it_attr.next();
        String attrname = attribute.getName();
        String attrvalue = e.getAttributeValue(attrname);
        map.put(lastname + "." + attrname, attrvalue);
      }
    }
    List children = e.getChildren();
    Iterator it = children.iterator();
    while (it.hasNext()) {
      Element child = (Element) it.next();
      String name = lastname + "." + child.getName();
      // 如果有子节点,则递归调用
      if (child.getChildren().size() > 0) {
        convert(child, map, name);
      } else {
        // 如果没有子节点,则把值加入map
        map.put(name, child.getText());
        // 如果该节点有属性,则把所有的属性值也加入map
        if (child.getAttributes().size() > 0) {
          Iterator attr = child.getAttributes().iterator();
          while (attr.hasNext()) {
            Attribute attribute = (Attribute) attr.next();
            String attrname = attribute.getName();
            String attrvalue = child.getAttributeValue(attrname);
            map.put(name + "." + attrname, attrvalue);
          }
        }
      }
    }
  }
}

EncryptUtil类:

package com.wechat.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class EncryptUtil {
  public static String Encrypt(String strSrc) {
    MessageDigest md = null;
    String strDes = null;
    byte[] bt = strSrc.getBytes();
    try {
      md = MessageDigest.getInstance("SHA-1");
      md.update(bt);
      strDes = bytes2Hex(md.digest()); //to HexString
    } catch (NoSuchAlgorithmException e) {
      System.out.println("Invalid algorithm.");
      return null;
    }
    return strDes;
  }
  public static String bytes2Hex(byte[] bts) {
    String des = "";
    String tmp = null;
    for (int i = 0; i < bts.length; i++) {
      tmp = (Integer.toHexString(bts[i] & 0xFF));
      if (tmp.length() == 1) {
        des += "0";
      }
      des += tmp;
    }
    return des;
  }
}

web.xml:


xmlns="http://java.sun.com/xml/ns/javaee"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

 

  This is the description of my J2EE component

  This is the display name of my J2EE component

  WeChatServlet

  com.wechat.servlet.WeChatServlet

 


 

  WeChatServlet

  /WeChatServlet

 

 

  index.jsp

 

 

 



相关文章
|
26天前
|
安全 前端开发 Java
《深入理解Spring》:现代Java开发的核心框架
Spring自2003年诞生以来,已成为Java企业级开发的基石,凭借IoC、AOP、声明式编程等核心特性,极大简化了开发复杂度。本系列将深入解析Spring框架核心原理及Spring Boot、Cloud、Security等生态组件,助力开发者构建高效、可扩展的应用体系。(238字)
|
2月前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
2月前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
2月前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
87 0
|
3月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
172 2
|
3月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
197 3
|
9月前
|
自然语言处理 搜索推荐 小程序
微信公众号接口:解锁公众号开发的无限可能
微信公众号接口是微信官方提供的API,支持开发者通过编程与公众号交互,实现自动回复、消息管理、用户管理和数据分析等功能。本文深入探讨接口的定义、类型、优势及应用场景,如智能客服、内容分发、电商闭环等,并介绍开发流程和工具,帮助运营者提升用户体验和效率。未来,随着微信生态的发展,公众号接口将带来更多机遇,如小程序融合、AI应用等。
|
开发者
微信公众平台开发基本配置
微信公众平台开发基本配置
495 0
|
Go
【微信公众号】基于golang的公众号开发基本配置
【微信公众号】基于golang的公众号开发基本配置
291 0