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

 

 

 



相关文章
|
4天前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
|
7天前
|
SQL 安全 Java
安全问题已经成为软件开发中不可忽视的重要议题。对于使用Java语言开发的应用程序来说,安全性更是至关重要
在当今网络环境下,Java应用的安全性至关重要。本文深入探讨了Java安全编程的最佳实践,包括代码审查、输入验证、输出编码、访问控制和加密技术等,帮助开发者构建安全可靠的应用。通过掌握相关技术和工具,开发者可以有效防范安全威胁,确保应用的安全性。
18 4
|
5天前
|
Java
java线程接口
Thread的构造方法创建对象的时候传入了Runnable接口的对象 ,Runnable接口对象重写run方法相当于指定线程任务,创建线程的时候绑定了该线程对象要干的任务。 Runnable的对象称之为:线程任务对象 不是线程对象 必须要交给Thread线程对象。 通过Thread的构造方法, 就可以把任务对象Runnable,绑定到Thread对象中, 将来执行start方法,就会自动执行Runable实现类对象中的run里面的内容。
18 1
|
8天前
|
缓存 监控 Java
如何运用JAVA开发API接口?
本文详细介绍了如何使用Java开发API接口,涵盖创建、实现、测试和部署接口的关键步骤。同时,讨论了接口的安全性设计和设计原则,帮助开发者构建高效、安全、易于维护的API接口。
29 4
|
11天前
|
Java 开发者
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
在Java多线程编程的世界里,Lock接口正逐渐成为高手们的首选,取代了传统的synchronized关键字
38 4
|
13天前
|
小程序 前端开发 算法
|
14天前
|
SQL Java 程序员
倍增 Java 程序员的开发效率
应用计算困境:Java 作为主流开发语言,在数据处理方面存在复杂度高的问题,而 SQL 虽然简洁但受限于数据库架构。SPL(Structured Process Language)是一种纯 Java 开发的数据处理语言,结合了 Java 的架构灵活性和 SQL 的简洁性。SPL 提供简洁的语法、完善的计算能力、高效的 IDE、大数据支持、与 Java 应用无缝集成以及开放性和热切换特性,能够大幅提升开发效率和性能。
|
8天前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
14 0
|
8天前
|
Java API Android开发
kotlin和java开发优缺点
kotlin和java开发优缺点
22 0
WK
|
14天前
|
开发框架 移动开发 Java
C++和Java哪个更适合开发移动应用
本文对比了C++和Java在移动应用开发中的优劣,从市场需求、学习难度、开发效率、跨平台性和应用领域等方面进行了详细分析。Java在Android开发中占据优势,而C++则适合对性能要求较高的场景。选择应根据具体需求和个人偏好综合考虑。
WK
27 0

热门文章

最新文章