`
youanyyou
  • 浏览: 197008 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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

 
阅读更多

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

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

 

WeChatServlet 类:

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:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	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">
  <servlet>
    <description>This is the description of my J2EE component</description>
    <display-name>This is the display name of my J2EE component</display-name>
    <servlet-name>WeChatServlet</servlet-name>
    <servlet-class>com.wechat.servlet.WeChatServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>WeChatServlet</servlet-name>
    <url-pattern>/WeChatServlet</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
  
</web-app>

 

测试案例:

大家可关注微信公众账号:在线匹配交友

微信里面暂时搜索不到,大家可扫描二维码关注,二维码见附件

做了个最简单的回复信息,由于获取不到用户信息还没有想到好的想法

欢迎大家提供宝贵意见

暂时是本机做服务器的如果服务没开可能不会收到自动回复信息

  • 大小: 29.4 KB
分享到:
评论

相关推荐

    微信公众平台接口调用

    微信公众平台接口调用(java版);用来向普通用户传送信息;servlet中用到的map工具

    java开发微信公众平台

    微信公众帐号开发教程第1 篇-引言 ...微信公众帐号开发教程第3 篇-开发模式启用及接口配置 微信公众帐号开发教程第4 篇-消息及消息处理工具的封装 微信公众帐号开发教程第5 篇-各种消息的接收与响应

    微信公众平台 JAVA开发代码(实现菜单,自动回复,关注事件等)

    微信公众平台,开发者模式下的Java实现。实现菜单,自动回复,关注事件等!利用SpringMVC框架实现。如有疑问,可以关注我的博客~

    微信公众平台 客服接口发消息的实现代码(Java接口开发)

    微信公众平台技术文档:客服消息 一、接口说明 当用户和公众号产生特定动作的交互时(具体动作列表请见下方说明),微信将会把消息数据推送给开发者,开发者可以在一段时间内(目前修改为48小时)调用客服接口,通过...

    微信公众平台接口调用(java版)

    微信公众平台接口调用(java版) 资料来自百度,上传供大家一起学习分享~~

    微信公众平台接口Java版

    此代码是微信公众平台接口Java版本。 已经实现了最新的接收、发送消息接口。 将代码分成MVC模式,有效隔开业务逻辑层,控制层,模型层,方便调用理解。

    微信公众平台接口调用(java版).doc

    微信公众平台接口调用(java版).doc可以很好的帮助快速进入微信公众平台开发学习的童鞋们!

    微信公众平台接口调用(java版).pdf

    微信公众平台接口调用(java版).pdf

    微信公众平台开发 实例 java 开发资料

    本资料主要针对Java开发者,旨在帮助他们掌握微信公众平台的开发技术。 在“微信公众平台开发 实例 java 开发资料”中,我们可以学习到以下几个核心知识点: 1. **微信公众平台基础**:了解微信公众平台的基本架构...

    微信公众平台开发视频

    3. 微信公众平台开发之Struts2 (免费) 25:31 4. 微信公众平台开发之Spring MVC 27:12 5. 识别微信浏览器 24:40 6. 限制只允许微信浏览器访问 23:30 7. 一套程序服务多个账号---原始ID 17:46 8. 一套程序服务多个账号...

    微信公众平台接入Java实例

    利用java实现微信公众平台接入,实现TOKEN验证,以及信息的回复接口实现。

    微信公众平台接口开发java版sdk

    用于微信开放平台及微信个接口开发的调用sdk 此sdk包含【开放平台全网发布】,接收微信推送消息事件,发起公众号授权,处理各消息事件,粉丝,分组,支付,emoji处理,网页授权,获取用户信息,群发,图文,回复内容...

    微信公众平台接口调用(java版)参照.pdf

    微信公众平台接口调用(java版)参照.pdf

    微信公众平台接口java版

    模仿php版本。已经调通。微信开放公众平台的接口java版

    微信公众平台实现获取用户OpenID的方法

    主要介绍了微信公众平台实现获取用户OpenID的方法,需要开发人员经过微信授权后获取高级接口才能使用此功能,用户OpenID对于微信公众平台建设有着非常广泛的用途,需要的朋友可以参考下

    JAVA微信开发资料

    微信公众帐号开发教程第 1 篇-引言..2 微信公众帐号开发教程第 2 篇-微信公众帐号的类型(普通和会议).. 3 微信公众帐号开发教程第 3 篇-开发模式启用及接口...微信公众平台开发教程第 21 篇-“可信网址”白名单175

    微信公众开放平台开发 -智能机器人java源代码工程

    刘峰的博客说明已经很详细了, 本人旨在帮助刚入门微信公众平台开发苦于无法着手而迅速上手准备的, 有不明白的请联系我或微信号guestsun。 导入整个工程到eclipse, 压缩包里面有hellochat.war文件部署到百度bae云...

Global site tag (gtag.js) - Google Analytics