2、自动回复消息

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

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

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

消息处理 : method = RequestMethod.POST

由上图,我们已经知道了 普通微信用户向公众账号发消息XML结构

1、XmlMessageEntity 实体类

java;html-script:false;quick-code:true;smart-tabs:true;auto-links:false;toolbar:true;gutter;true;light:false;ruler:false;pad-line-numbers:2;collapse:false;tab-size:4;first-line:1; package com.wenxi.Entity;</p> <p>import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlRootElement;</p> <p>@XmlRootElement(name = "xml") @XmlAccessorType(XmlAccessType.FIELD) public class XmlMessageEntity {</p> <pre><code>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 + "]"; } </code></pre> <p>}</p> <pre><code> 2、处理消息并返回 ;html-script:false;quick-code:true;smart-tabs:true;auto-links:false;toolbar:true;gutter;true;light:false;ruler:false;pad-line-numbers:2;collapse:false;tab-size:4;first-line:1;
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;
}
}

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

Original: https://www.cnblogs.com/weiapro/p/7708115.html
Author: 天涯越野
Title: 2、自动回复消息

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/607573/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • CSS

    一、入门基础 1.1、语法 ​ 选择器{ ​ 声明1; ​ 声明2; ​ } Title h1{ width: 180px; color: aqua; } 我是标题 建议这种规范 …

    Java 2023年6月8日
    065
  • Android JNI中C调用Java方法

    背景需求 我们需要在JNI的C代码调用Java代码。实现原理:使用JNI提供的反射借口来反射得到Java方法,进行调用。 JNI关键方法讲解。 在同一个类中,调用其他方法 JNIE…

    Java 2023年5月29日
    074
  • docker打包Python项目成镜像文件

    做实验时因为数据太大用到了学校的服务器平台,在平台进行训练的时候首先需要搭建环境,由于种种原因,只能自己用docker来打包镜像文件,自己做镜像。记录一下遇到的坑以及解决方法。 d…

    Java 2023年6月5日
    084
  • 用jquery实现省市联动

    省市联动 var pros = [‘请选择省份’,’广东省’,’湖南省’,’四川省’]; var cities = [ [], [‘广州’,’汕头’,’珠海’,’茂名’,’东莞’,…

    Java 2023年6月6日
    090
  • 图片集

    MySQL 执行流程 线程生命周期 posted @2022-09-12 20:16 李小龙他哥 阅读(20 ) 评论() 编辑 Original: https://www.cnb…

    Java 2023年6月8日
    095
  • 【每日算法】动态规划二

    难度: 【简单】 &#x5047;&#x8BBE;&#x4F60;&#x6B63;&#x5728;&#x722C;&#x69…

    Java 2023年6月9日
    082
  • 简单实现一个快速传输电子书到kindle的小项目

    前言 最近翻出来好久没有看的kindle,准备继续我的阅读之路。当然,也是因为发现了一个非常好的获取电子书资源的网站,又燃起了我的阅读兴趣。 然而,往kindle里传输电子书的方式…

    Java 2023年6月5日
    083
  • Spring Authorization Server 0.3.0 发布,官方文档正式上线

    基于 OAuth2.1的授权服务器 Spring Authorization Server 0.3.0今天正式发布,在本次更新中有几大亮点。 文档正式上线 Spring Autho…

    Java 2023年5月30日
    060
  • java中的set接口(Hashset,LinkedHashset,TreeSet)

    Hashset介绍 HashSet实际上是HashMap,底层都一样(数组+链表+红黑树) 不能有重复的元素,记住深入理解,可以添加不同的对象的,在前面的随笔中讲过了,只能有一个n…

    Java 2023年6月6日
    079
  • 对象-一论

    创建与初始化对象 在程序里,使用 new关键字创建类的对象,格式: classType className = new classType()。在使用new的同时,也在内存中为该对…

    Java 2023年6月5日
    078
  • Java学习-第一部分-第二阶段-第二节:枚举和注释

    自定义类实现枚举 先看一个需求 要求创建季节(Season)对象,请设计并完成。 创建Season对象有如下特点 1.季节的值是有限的几个值(spring, summer, aut…

    Java 2023年6月16日
    080
  • 关于锁的基础知识

    1、synchronized作用于静态方法和非静态方法的区别非静态方法:给对象加锁(可以理解为给这个对象的内存上锁,注意:只是这块内存,其他同类对象都会有各自的内存锁),这时候在其…

    Java 2023年6月5日
    079
  • rocketmq实现延迟队列精确到秒级实现方案2-时间轮和delay-file实现

    上图是通过RocketMQ源码分析一个实现原理方案示意图。 分为两个部分: 消息的写入消息的Schedule 在写入CommitLog之前,如果是延迟消息,按照每10分钟写入del…

    Java 2023年6月5日
    078
  • RabbitMQ

    一.MQ的相关概念 什么是MQ? Message Queue,消息队列。简单的来说,就是一个先进先出的队列,用来发送消息(信息)。 为什么要用 MQ? 流量消峰:在电商系统中,比如…

    Java 2023年6月7日
    076
  • [学习笔记] Java正则表达式

    正则表达式 正则表达式定义了字符串的模式,可以用于搜索、编辑或处理文本; 正则表达式使用字符串描述规则,并用于匹配字符串; 一个正则表达式其实就是一个描述规则的字符串,被正则表达式…

    Java 2023年6月5日
    073
  • Synchronized锁及其膨胀

    在并发编程中, synchronized锁因其使用简单,在线程间同步被广泛应用。下面对其原理及锁升级过程进行探究。 当实例方法被synchronized修饰时,通过当前实例调用此方…

    Java 2023年6月6日
    068
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球