上一篇已经接入公众平台,现在来说下消息回复
接入公众平台与消息处理区别:
接入公众平台 : method = RequestMethod.GET;
消息处理 : method = RequestMethod.POST
下面都是以文本消息为例子,其他消息查看文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453
由上图,我们已经知道了 普通微信用户向公众账号发消息XML结构
1、XmlMessageEntity 实体类
package com.wenxi.Entity; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement; @XmlRootElement(name = "xml") @XmlAccessorType(XmlAccessType.FIELD) public class XmlMessageEntity { private String ToUserName; private String FromUserName; private Long CreateTime; private String MsgType; private String Content; private String Event; private Long MsgId; public String getEvent() { return Event; } public void setEvent(String event) { Event = event; } public String getToUserName() { return ToUserName; } public void setToUserName(String toUserName) { ToUserName = toUserName; } public String getFromUserName() { return FromUserName; } public void setFromUserName(String fromUserName) { FromUserName = fromUserName; } public Long getCreateTime() { return CreateTime; } public void setCreateTime(Long createTime) { CreateTime = createTime; } public String getMsgType() { return MsgType; } public void setMsgType(String msgType) { MsgType = msgType; } public String getContent() { return Content; } public void setContent(String content) { Content = content; } public Long getMsgId() { return MsgId; } public void setMsgId(Long msgId) { MsgId = msgId; } @Override public String toString() { return "XmlMessageEntity [ToUserName=" + ToUserName + ", FromUserName=" + FromUserName + ", Event=" + Event + ", MsgType=" + MsgType + ", Content=" + Content + ", MsgId=" + MsgId + "]"; } }
2、处理消息并返回
package com.wenxi.controller; import com.wenxi.Entity.XmlMessageEntity; import com.wenxi.utils.SecurityUtil; import com.wenxi.utils.WeixinUtil; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import java.util.Arrays; import java.util.Date; @Controller public class ValidateController { @RequestMapping(value = "/weixinValidate",method = RequestMethod.GET) @ResponseBody public String weixinValidate(String signature, String timestamp, String nonce, String echostr ){ // 1)将token、timestamp、nonce三个参数进行字典序排序 String[] arrs = {WeixinUtil.TOKEN,timestamp,nonce}; //WeixinUtil.TOKEN: 抽取出来的TOKEN,为了重用 Arrays.sort(arrs); // 2)将三个参数字符串拼接成一个字符串进行sha1加密 String str = arrs[0] + arrs[1] + arrs[2]; // 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 if (signature.equals(SecurityUtil.SHA1(str))){ //确认此次GET请求来自微信服务器,返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败 return echostr; }else return null; } /** * 自动回复信息 */ @RequestMapping(value = "weixinValidate",method = RequestMethod.POST) @ResponseBody public XmlMessageEntity weixinValidate(@RequestBody XmlMessageEntity entity){ System.out.println(entity); XmlMessageEntity returnMessageEntity = new XmlMessageEntity(); returnMessageEntity.setFromUserName(entity.getToUserName()); returnMessageEntity.setToUserName(entity.getFromUserName()); returnMessageEntity.setContent("谢谢大家关注!"); returnMessageEntity.setCreateTime(new Date().getTime()); returnMessageEntity.setMsgType("text"); return returnMessageEntity; } }
以下是回复的XML结构,其他消息查看文档 :https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140543
3、测试
一、关注公众号: 在你的测试账号页面,扫描图下的地方二维码,然后点击关注
控制台打印:
XmlMessageEntity [ToUserName=xxxxxa436, FromUserName=xxxxxxxxxlJdq9AY2E, Event=subscribe, MsgType=event, Content=null, MsgId=null]
这里ToUserName(开发者微信号)可以在测试页面顶部查看,如下图
FromUserName(微信用户OpenID)可以在 测试号二维码 中 用户列表找到
微信显示:
二、取消关注公众号
控制台打印:
XmlMessageEntity [ToUserName=xxxxxa436, FromUserName=xxxxxxxxxlJdq9AY2E, Event=unsubscribe, MsgType=event, Content=null, MsgId=null]
二者的区别: Event
unsubscribe: 取消关注公众号
subscribe: 关注公众号
三,在公众号发消息
由于程序还没对MsgType进行分类处理,所以都是回复谢谢大家关注(下篇再处理)
控制台打印:
XmlMessageEntity [ToUserName=xxxxxa436, FromUserName=xxxxxxxxxlJdq9AY2E, Event=null, MsgType=text, Content=测试一下, MsgId=6479560144755671793]
关注(取消) 与 普通消息发送区别:
Event: 关注(取消)为subscribe或者unsubscribe, 而普通消息发送为null;
MsgType: 关注(取消)为event, 而普通消息发送为text;
Content: 关注(取消)为null, 而普通消息发送为具体的消息;
MsgId: 关注(取消)为null, 而普通消息发送为具体的ID;
1、关于重试的消息排重,推荐使用msgid排重。
2、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。