接收微信服务器的事件推送,首先需要一个公网url,微信服务器把事件推送到这个公网ip上。并在微信公众平台测试账号管理后台配置:
这个url就是自己服务器的地址(具体到某一个controller接口,本地写两个http名一致的接口,一个为get请求鉴权确认消息来自微信服务器,一个为post请求接收微信服务器的消息并自定义处理),Token是用于验证的,可由我们自行定义,主要作用是参与生成签名,与微信请求的签名进行比较。配置后开发者和微信服务器所有的交互都是通过这个url。至于url可以自己购买一个服务器,也可以使用其他途径把自己的代码映射成公网可以访问到的,如natapp
NATAPP 链接本地服务到互联网_weisian151的博客-CSDN博客,这种方法还可以本地断点调试哦(因为实际调用的是本地主机)。按照微信公众平台的要求,把本地微信后台服务的端口设成80,之后映射到公网上:
如我本地的是localhost:8080/wechat/message/wechatMessage,映射后在后台配置如下:
接下来就可以写代码了:
如现在把所有扫描二维码关注的用户信息存入数据库:
1、数据库设计:
2、DTO:
消息对象封装:
package com.demo.wechat.domain;
import java.io.StringReader;
import java.util.Date;
import java.util.HashMap;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
public class WechatMsg {
/**
* 发送者
*/
private String fromUserName;
/**
* 接收者
*/
private String toUserName;
/**
* 消息类型
*/
private String msgType;
/**
* 事件(消息类型为事件)
*/
private String event;
/**
* 事件Key(消息类型为事件)
*/
private String eventKey;
/**
* 消息内容(消息类型为文本)
*/
private String content;
/**
* 图文消息
*/
private NewsMessage newsMessage;
public WechatMsg(String fromUserName, String toUserName) {
this.fromUserName = fromUserName;
this.toUserName = toUserName;
}
/**
* 同构XML构造方法
*
* @param msgXml 消息体
*/
public WechatMsg(String msgXml) {
try {
HashMap<String, String> map = new HashMap<String, St