当用户发送消息给公众号时,会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML结构,来对该消息进行响应(现支持回复文本、图片、图文、语音、视频、音乐)。严格来说,发送被动响应消息其实并不是一种接口,而是对微信服务器发过来消息的一次回复。

以文本为例接下来以文本为例进行测试。

    /**
     * 回复消息
     */
    @PostMapping("/")
    public String receiveMessageService( HttpServletRequest request)  {
        return messageService.receiveMessageService(request);
    }

客户发送的消息会默认转到配置的url初始路径

    /**
     * 处理用户发送信息的业务服务层方法实现
     * @param request
     */
    @Override
    public String receiveMessageService(HttpServletRequest request) {
        logger.info("【消息模块】开始处理用户发送信息的业务");
        ServletInputStream inputStream = null;
        try {
            inputStream = request.getInputStream();
        } catch (IOException e) {
            logger.info(e.getMessage());
        }
        Map<String,String> map = new HashMap<>();
        SAXReader reader = new SAXReader();
        try {
            Document document = reader.read(inputStream);
            Element root = document.getRootElement();
            List<Element> elements = root.elements();
            for (Element element:elements
            ) {
                map.put(element.getName(),element.getStringValue());
            }
        } catch (DocumentException e) {
            logger.info(e.getMessage());
        }
        //1.从文本中获取用户的openid
        String openid = map.get("FromUserName");
        logger.info("【消息模块】request流中信息:===>【{}】",map);
        if(openid == null ){
            String message = "获取用户openid失败";
            logger.warn(message);
            throw new ServiceException(ServiceCode.ERROR_SERVICE, message);
        }

        //3.回复用户消息
        return getReplyMessage(map);
    }


    /**
     * 回复消息的方法
     */
    private String getReplyMessage(Map<String, String> map) {
        TextMessage textMessage = new TextMessage();
        textMessage.setToUserName(map.get("FromUserName"));
        textMessage.setFromUserName(map.get("ToUserName"));
        textMessage.setMsgType("text");
        textMessage.setContent("欢迎关注本公众号---消息自动回复");
        textMessage.setCreateTime(System.currentTimeMillis()/1000);
        //XML转换成Java对象
        // 缺少判断如果用户发送的不是text文本的判断处理
        XStream xStream = new XStream();
        xStream.processAnnotations(TextMessage.class);
        String xml = xStream.toXML(textMessage);
        logger.info("消息返回的信息: ===>");
        logger.info("{}",xml);
        return xml;
    }
TextMessage这个类需要自己定义:
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
//需要回复的消息样式
//        String message ="<xml>\n" +
//                "  <ToUserName><![CDATA[oBjyN6KSlSUGWOWCVbNZXrviueD0]]></ToUserName>\n" +
//                "  <FromUserName><![CDATA[gh_d263783aa70c]]></FromUserName>\n" +
//                "  <CreateTime>1693999561</CreateTime>\n" +
//                "  <MsgType><![CDATA[text]]></MsgType>\n" +
//                "  <Content><![CDATA[你好]]></Content>\n" +
//                "</xml>";
@XStreamAlias("xml")
@Data
public class TextMessage {
    @XStreamAlias("ToUserName")
    private String toUserName;
    @XStreamAlias("FromUserName")
    private String fromUserName;
    @XStreamAlias("CreateTime")
    private Long createTime;
    @XStreamAlias("MsgType")
    private String msgType;
    @XStreamAlias("Content")
    private String content;
}

接下来是请求与响应:

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐