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

 

 

 



相关文章
|
13天前
|
iOS开发
“企业微信iPad协议”第0x0B次编译:当朋友圈接口在凌晨悄然返回空数组
新品海报发布失败,排查发现企业微信iPad端因本地时间偏差超60秒,导致`ext_ticket`校验失败。NTP校准后恢复正常。问题根源:独立加签逻辑对时间敏感,且错误不提示。精准时间成合规关键。
197 0
|
16天前
|
算法 iOS开发 CDN
“企业微信iPad协议”第 0x04 天:当朋友圈接口在凌晨 2:14 突然返回 404
新品上线紧急任务:300位经销商朋友圈同步海报。突破官方限制,利用企业微信iPad协议私有接口,自动化上传发布。凌晨遭遇404,迅速定位并修复算法版本问题,最终高效完成推送,点赞超4200。技术在文档之外,也在边界之内。
136 0
|
21天前
|
消息中间件 人工智能 Java
抖音微信爆款小游戏大全:免费休闲/竞技/益智/PHP+Java全筏开源开发
本文基于2025年最新行业数据,深入解析抖音/微信爆款小游戏的开发逻辑,重点讲解PHP+Java双引擎架构实战,涵盖技术选型、架构设计、性能优化与开源生态,提供完整开源工具链,助力开发者从理论到落地打造高留存、高并发的小游戏产品。
|
21天前
|
存储 Java 关系型数据库
Java 项目实战基于面向对象思想的汽车租赁系统开发实例 汽车租赁系统 Java 面向对象项目实战
本文介绍基于Java面向对象编程的汽车租赁系统技术方案与应用实例,涵盖系统功能需求分析、类设计、数据库设计及具体代码实现,帮助开发者掌握Java在实际项目中的应用。
41 0
|
2月前
|
安全 Java 数据库
Java 项目实战病人挂号系统网站设计开发步骤及核心功能实现指南
本文介绍了基于Java的病人挂号系统网站的技术方案与应用实例,涵盖SSM与Spring Boot框架选型、数据库设计、功能模块划分及安全机制实现。系统支持患者在线注册、登录、挂号与预约,管理员可进行医院信息与排班管理。通过实际案例展示系统开发流程与核心代码实现,为Java Web医疗项目开发提供参考。
109 2
|
2月前
|
JavaScript 安全 前端开发
Java开发:最新技术驱动的病人挂号系统实操指南与全流程操作技巧汇总
本文介绍基于Spring Boot 3.x、Vue 3等最新技术构建现代化病人挂号系统,涵盖技术选型、核心功能实现与部署方案,助力开发者快速搭建高效、安全的医疗挂号平台。
147 3
|
2月前
|
小程序 JavaScript API
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
这篇文章介绍了使用uni-halo框架进行微信小程序开发的过程,包括选择该框架的原因、开发目标以及项目配置和部署的步骤。
uni-halo + 微信小程序开发实录:我的第一个作品诞生记
|
Java 应用服务中间件 Linux
Java调用微信登录以及eclipse 远程调试
这些年微信异常火爆,甚至爷爷奶奶辈的人都会用微信。所以很多网站都支持用微信账号登录,那么接下来就来看看如何当用户通过微信访问我们的链接时,我们如何获取到该用户的微信公开资料,以及如何用eclipse 远程调试代码。 (本文的前提是有一个可以在阿里云上运行的web项目)。
Java调用微信登录以及eclipse 远程调试
|
21天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案

热门文章

最新文章