使用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

 

 

 



相关文章
|
消息中间件 缓存 前端开发
从资损百万到零事故:Java 接口幂等设计的艺术与实践
在分布式系统中,重复请求常引发严重资损,如支付双扣、库存超卖等问题,其根源在于接口缺乏幂等性设计。本文通过真实案例揭示幂等性的重要性,并详解8种主流解决方案,涵盖唯一请求ID、乐观锁、悲观锁、状态机等,帮助开发者构建稳定系统,保障业务一致性。无论你是架构师还是开发工程师,都能从中获得实战指导,有效规避重复调用带来的风险。
1449 2
|
数据采集 JSON Java
Java爬虫获取1688店铺所有商品接口数据实战指南
本文介绍如何使用Java爬虫技术高效获取1688店铺商品信息,涵盖环境搭建、API调用、签名生成及数据抓取全流程,并附完整代码示例,助力市场分析与选品决策。
|
算法 安全 Java
除了类,Java中的接口和方法也可以使用泛型吗?
除了类,Java中的接口和方法也可以使用泛型吗?
333 11
|
Java Go 开发工具
【Java】(9)抽象类、接口、内部的运用与作用分析,枚举类型的使用
抽象类必须使用abstract修饰符来修饰,抽象方法也必须使用abstract修饰符来修饰,抽象方法不能有方法体。抽象类不能被实例化,无法使用new关键字来调用抽象类的构造器创建抽象类的实例。抽象类可以包含成员变量、方法(普通方法和抽象方法都可以)、构造器、初始化块、内部类(接 口、枚举)5种成分。抽象类的构造器不能用于创建实例,主要是用于被其子类调用。抽象类中不一定包含抽象方法,但是有抽象方法的类必定是抽象类abstract static不能同时修饰一个方法。
448 1
|
存储 缓存 安全
Java集合框架(二):Set接口与哈希表原理
本文深入解析Java中Set集合的工作原理及其实现机制,涵盖HashSet、LinkedHashSet和TreeSet三大实现类。从Set接口的特性出发,对比List理解去重机制,并详解哈希表原理、hashCode与equals方法的作用。进一步剖析HashSet的底层HashMap实现、LinkedHashSet的双向链表维护顺序特性,以及TreeSet基于红黑树的排序功能。文章还包含性能对比、自定义对象去重、集合运算实战和线程安全方案,帮助读者全面掌握Set的应用与选择策略。
1557 23
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
安全 Java 开发者
Java集合框架:详解Deque接口的栈操作方法全集
理解和掌握这些方法对于实现像浏览器后退功能这样的栈操作来说至关重要,它们能够帮助开发者编写既高效又稳定的应用程序。此外,在多线程环境中想保证线程安全,可以考虑使用ConcurrentLinkedDeque,它是Deque的线程安全版本,尽管它并未直接实现栈操作的方法,但是Deque的接口方法可以相对应地使用。
642 12
|
小程序 前端开发 Android开发
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
2881 29
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
|
小程序 JavaScript API
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
这篇文章介绍了使用uni-halo框架进行微信小程序开发的过程,包括选择该框架的原因、开发目标以及项目配置和部署的步骤。
732 0
uni-halo + 微信小程序开发实录:我的第一个作品诞生记