2、自动回复消息

上一篇已经接入公众平台,现在来说下消息回复

接入公众平台与消息处理区别:

接入公众平台 : method = RequestMethod.GET;

消息处理       : method = RequestMethod.POST

 

下面都是以文本消息为例子,其他消息查看文档 : https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421140453

[KGS~0LDG7@~B3ZV33L[FSX

由上图,我们已经知道了 普通微信用户向公众账号发消息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

{`_8]7%WUW2$X@GU}[XM%4V

3、测试

一、关注公众号: 在你的测试账号页面,扫描图下的地方二维码,然后点击关注

ZKE@N2LA$VEZEX5}GMV6C0G

控制台打印:

XmlMessageEntity [ToUserName=xxxxxa436, FromUserName=xxxxxxxxxlJdq9AY2E, Event=subscribe, MsgType=event, Content=null, MsgId=null]

这里ToUserName(开发者微信号)可以在测试页面顶部查看,如下图

TNW%WVKG9SU6@VT)JU9QZ9V

FromUserName(微信用户OpenID)可以在 测试号二维码 中 用户列表找到

 

微信显示:

S71022-102618

二、取消关注公众号

控制台打印:

XmlMessageEntity [ToUserName=xxxxxa436, FromUserName=xxxxxxxxxlJdq9AY2E, Event=unsubscribe, MsgType=event, Content=null, MsgId=null]

二者的区别: Event

unsubscribe:  取消关注公众号

subscribe:     关注公众号

三,在公众号发消息

由于程序还没对MsgType进行分类处理,所以都是回复谢谢大家关注(下篇再处理)

S71022-104243

控制台打印:

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、微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不会对此作任何处理,并且不会发起重试。详情请见“发送消息-被动回复消息”。

posted @ 2017-10-22 10:53  天涯越野  阅读(617)  评论(0编辑  收藏  举报