微信公众号配置完自己的服务器后,微信会先发起验证,首次校验,订阅,扫码,消息都是一个接口来的,
解析一波消息内容
指定消息服务器后,服务器接收的一些消息数据,由此我们可以看以下的接口来写解析的业务
1.根据MsgType=event,且Event=**事件消息,MsgType=text/video/可以判断是否视频,语音,文本消息
公众号收到用户的发来的文本信息,MsgId可以用来做幂等校验
{Content=hello, CreateTime=1532340406, ToUserName=gh_dddd6, FromUserName=owPCY1djP, MsgType=text, MsgId=6581351930541366484}
取消关注
{CreateTime=1532340427, EventKey=, Event=unsubscribe, ToUserName=gh_dddd6, FromUserName=owPCY1djP, MsgType=event}
关注公众号
{CreateTime=1532340448, EventKey=, Event=subscribe, ToUserName=gh_dddd6, FromUserName=owPCY1djP, MsgType=event}
自动生成的二维码扫码进入的消息
{Ticket=gQHX8DwAAAAAAAAAAS5odHRwOi8vd2, CreateTime=1532398446, EventKey=0, Event=SCAN, ToUserName=gh_dddd637, FromUserName=owPCY1djP, MsgType=event}
自定义二维码关注时的消息
{Ticket=gQHX8DwAAAAAAAAAAS5odH, CreateTime=1532398501, EventKey=qrscene_0, Event=subscribe, ToUserName=gh_dddd, FromUserName=owPCY1djP, MsgType=event}
配置好服务器后微信主动向此地址推送消息
@RequestMapping("/test")
public void receivingAndParsingWxData(HttpServletRequest request, HttpServletResponse response) {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
//首次校验
if (echostr != null) {
if (checkSignature(signature, timestamp, nonce)) {
PrintWriter printWriter = response.getWriter();
printWriter.print(echostr);
printWriter.close();
return;
}
logger.info("签名校验失败");
}
//接收服务器的消息
InputStream inputStream = request.getInputStream();
//xml数据格式转对象
Map<String, String> wxdata = ParseXmlUtil.xml2Json(inputStream);
String msg = null;
if (wxdata.get("MsgType") == null) {
logger.info("未知的消息类型");
}
if ("event".equals(wxdata.get("MsgType"))) {
if ("subscribe".equals(wxdata.get("Event"))) {
//公众号的原生二维码进来的
if (null == wxdata.get("Ticket")) {
} else {//自定义二维码扫描进来的,根据ticket判断是哪个二维码}
}
return;
}
if ("unsubscribe".equals(wxdata.get("Event"))) {
logger.info("用户取消了关注");
return;
}
if ("SCAN".equals(wxdata.get("Event"))) {
//自定义二维码扫描进来的,根据ticket判断是哪个二维码} 原生的不会有
return;
}
}
if ("text".equals(wxdata.get("MsgType"))) {
logger.info("来自用户的消息:" + wxdata.get("context"));
}
if ("video".equals(wxdata.get("MsgType"))) {
logger.info("来自用户的消息:" + wxdata.get("context"));
}
}