【公众号-个人订阅号开发】接受文本消息&响应文本消息

服务器接受文本消息

用户给公众号发送的信息都会发送到之前你配置服务器(不清楚服务器配置的可以参考之前的文章【个人小程序订阅号开发】微信后台服务端接入 Java实现)。我们可以接受消息体解析并对相应的消息做出自动回复。

假设有如下场景

  • A 向公众号发送“人工服务”文本信息
  • 公众号回复A用户如下内容:“好的,正在为你转接中”

开发代码

基于上一章节代码基础开发新的代码。

接收文本消息实体类

官方文本数据说明如下

xml 样例

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>1348831860</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[this is a test]]></Content>
  <MsgId>1234567890123456</MsgId>
  <MsgDataId>xxxx</MsgDataId>
  <Idx>xxxx</Idx>
</xml>

字段说明

参数描述
ToUserName开发者微信号
FromUserName发送方账号(一个OpenID)
CreateTime消息创建时间 (整型)
MsgType消息类型,文本为text
Content文本消息内容
MsgId消息id,64位整型
MsgDataId消息的数据ID(消息如果来自文章时才有)
Idx多图文时第几篇文章,从1开始(消息如果来自文章时才有)

添加 XML Maven 依赖

由于接收到的消息是XML格式的,添加如下maven 依赖

<dependency>
            <groupId>jakarta.xml.bind</groupId>
            <artifactId>jakarta.xml.bind-api</artifactId>
            <version>4.0.2</version>
        </dependency>
        <dependency>
            <groupId>com.sun.xml.bind</groupId>
            <artifactId>jaxb-impl</artifactId>
            <version>4.0.0</version>
            <scope>runtime</scope>
        </dependency>

ReceiveTextMessage实体类Java

package top.xyx0123.wx.entity;

import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.Data;

/**
 * ReceiveTextMessage.
 */
@XmlRootElement(name = "xml")
@XmlAccessorType(XmlAccessType.FIELD)
@Data
@Schema(example =
        "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
                "<xml>\n" +
                "\t<Content>你好</Content>\n" +
                "\t<CreateTime>0</CreateTime>\n" +
                "\t<ToUserName>B</ToUserName>\n" +
                "\t<FromUserName>A</FromUserName>\n" +
                "\t<MsgDataId>msgDataId</MsgDataId>\n" +
                "\t<MsgId>msgId</MsgId>\n" +
                "\t<MsgType>text</MsgType>\n" +
                "</xml>")
public class ReceiveTextMessage {
    private String ToUserName;

    private String FromUserName;

    private long CreateTime;

    private String MsgType;

    private long MsgId;

    private String MsgDataId;

    private String Content;
}

响应文本消息实体类

xml 样例

<xml>
  <ToUserName><![CDATA[toUser]]></ToUserName>
  <FromUserName><![CDATA[fromUser]]></FromUserName>
  <CreateTime>12345678</CreateTime>
  <MsgType><![CDATA[text]]></MsgType>
  <Content><![CDATA[你好]]></Content>
</xml>

字段说明

参数是否必须描述
ToUserName接收方账号(收到的OpenID)
FromUserName开发者微信号
CreateTime消息创建时间 (整型)
MsgType消息类型,文本为text
Content回复的消息内容(换行:在content中能够换行,微信客户端就支持换行显示)

ResponseTextMessage实体类Java

package top.xyx0123.wx.entity;

import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlRootElement;
import lombok.Data;

/**
 * ResponseTextMessage.
 */
@XmlRootElement(name = "xml")
@XmlAccessorType(XmlAccessType.FIELD)
@Data
public class ResponseTextMessage {
    private String ToUserName;

    private String FromUserName;

    private long CreateTime;

    private String MsgType;

    private String Content;
}

Controller定义Post消息接收接口

Notice: consumes = {"text/xml; charset=UTF-8"}) 经过测试,微信以Content-Type: text/xml;charset=UTF-8请求。

 @RequestMapping(value = "/wechat/validate", method = RequestMethod.POST,
            produces = {"application/xml; charset=UTF-8",},
            consumes = {"text/xml; charset=UTF-8"})
    public ResponseTextMessage receiveMessage(
            @RequestBody ReceiveTextMessage receiveTextMessage) {
        log.info("Receive message: {}", receiveTextMessage);
        // 响应的消息
        ResponseTextMessage responseTextMessage = new ResponseTextMessage();
        responseTextMessage.setToUserName(receiveTextMessage.getFromUserName());
        responseTextMessage.setFromUserName(receiveTextMessage.getToUserName());
        responseTextMessage.setCreateTime(new Date().getTime());
        responseTextMessage.setMsgType(receiveTextMessage.getMsgType());
        responseTextMessage.setContent("好的,正在为你转接中");
        return responseTextMessage;
    }

测试

本地swagger测试

正式环境测试

为了测试开发公众号的功能,我也是新申请了一个订阅号。和大家一样从0开始的。大家可以关注我的公众号(软件老许)去验证实现的功能,或者扫描下方二维码测试本次内容功能。目前实现了发送文本自动回复文本消息如文章中提到的功能。后面开发的功能也都会集成到这个公众号上面。接下来我再看看有什么比较好玩有趣的功能都会开发分享。




最后谢谢大家! 十一国庆快乐!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值