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

  • 相关阅读:
    python学习笔记(二)-字符串方法
    python学习笔记(一)-基础知识
    Charles抓包工具断点修改返回内容
    Charles抓包工具过滤网络请求
    Jmeter通过正则表达式提取器提取响应结果数据
    【PHP】什么时候使用Try Catch(转)
    【tp5.1】七牛云上传图片
    【PHP】统计问卷调查结果的选项票数和百分比
    【tp5.1】composer安装PHPExcel以及导入导出Excel
    【tp5.1】微信公众号授权登录及获取信息录入数据库
  • 原文地址:https://www.cnblogs.com/weiapro/p/7708115.html
Copyright © 2011-2022 走看看