SpringCloud Alibaba 开发微信公众号 (基础消息能力)

简介: SpringCloud Alibaba 开发微信公众号 (基础消息能力)

上一篇讲了通过封装json格式数据测试自定义菜单功能,这篇讲基础消息能力的接收普通消息和被动回复用户消息。

1.引入

开始我们将自己的服务器与微信服务器进行绑定时,将微信的GET请求获取并作了相关的验证,而对于用户在公众号上发消息等操作的时候微信服务器也会通过POST请求发送到我们填写的URL上,我们可以根据收到的信息进行相关的响应回复操作。

2.测试用户发消息操作,本地收到的POST请求 WeCharController

//    获取微信返回数据
@PostMapping
public String getWeChar(@RequestBody String message) throws Exception {
    System.out.println("接收到微信返回的消息:"+message);
    return null;
    }
复制代码

控制台信息,可以看到,当在微信公众号发送文字消息时,本地服务收到如下消息。

ToUserName: gh_1e06f4c4ca61 开发者微信号

FromUserName: oITpR58LM-HJG0Fa4BY6MkOCG5lM 发送方帐号(一个OpenID)

CreateTime:1664693332 消息创建时间 (整型)

MsgType :text  消息类型,文本为text

Content: 文本消息内容

MsgId :消息id,64位整型

接收到微信返回的消息:<xml><ToUserName><![CDATA[gh_1e06f4c4ca61]]></ToUserName>
<FromUserName><![CDATA[oITpR58LM-HJG0Fa4BY6MkOCG5lM]]></FromUserName>
<CreateTime>1664693332</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[哈哈哈测试。。。]]></Content>
<MsgId>23832676103729051</MsgId>
</xml>
复制代码

图片消息特有的信息:

PicUrl: 图片链接(由系统生成)

MediaId:图片消息媒体id,可以调用获取临时素材接口拉取数据。

MsgId:消息id,64位整型

MsgDataId: 消息的数据ID(消息如果来自文章时才有)

接收到微信返回的消息:<xml><ToUserName><![CDATA[gh_1e06f4c4ca61]]></ToUserName>
<FromUserName><![CDATA[oITpR58LM-HJG0Fa4BY6MkOCG5lM]]></FromUserName>
<CreateTime>1664693659</CreateTime>
<MsgType><![CDATA[image]]></MsgType>
<PicUrl><![CDATA[http://mmbiz.qpic.cn/mmbiz_jpg/ZfcbAy54RBxoL0ZBCbvnvCERD7F7D1uNBY6fbO6UGnv2QRslGwicfhx4PXFOJJB3TnJkfmX8TI9pwfCqOdGjb0Q/0]]></PicUrl>
<MsgId>23832682835649773</MsgId>
<MediaId><![CDATA[uqSJdeAYZuyROkywTrIYTT0rJooLGBCEKwTGU-F8-Y1PF855UQPoQnpt3bQaytGP]]></MediaId>
</xml>
复制代码

语音消息特有的信息: Format:语音格式:amr Recognition: 语音识别结果,UTF8编码

接收到微信返回的消息:<xml><ToUserName><![CDATA[gh_1e06f4c4ca61]]></ToUserName>
<FromUserName><![CDATA[oITpR58LM-HJG0Fa4BY6MkOCG5lM]]></FromUserName>
<CreateTime>1664693943</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[uqSJdeAYZuyROkywTrIYTeWX2VBmyIJL75ADGHxjFTZICINUYLZxshP4WRJdF5b6]]></MediaId>
<Format><![CDATA[amr]]></Format>
<MsgId>23832683876255433</MsgId>
<Recognition><![CDATA[]]></Recognition>
</xml>
复制代码

未开启接收语音识别结果权限Recognition是空的,因此开启接收语音识别结果权限

网络异常,图片无法展示
|

接收到微信返回的消息:<xml><ToUserName><![CDATA[gh_1e06f4c4ca61]]></ToUserName>
<FromUserName><![CDATA[oITpR5-x01JQu8doRMMgaFDYU3eM]]></FromUserName>
<CreateTime>1664694297</CreateTime>
<MsgType><![CDATA[voice]]></MsgType>
<MediaId><![CDATA[uqSJdeAYZuyROkywTrIYTXiT-nSSIDQ92XkbO9idN2RCdxdXap8xIs-X4MVU48FY]]></MediaId>
<Format><![CDATA[amr]]></Format>
<MsgId>7149807563452710912</MsgId>
<Recognition><![CDATA[你好。]]></Recognition>
</xml>
复制代码

其他消息,就不再介绍了,基本上不同的消息都会有自己特有的属性,其他属性则是各种消息所共有的。

3.被动响应用户的消息

当我们服务器收到用户的一些消息操作时,我们可以通过收到的消息类型、消息内容进行相应的回复操作。从上面的收到的消息信息可以看出,我们收到的消息是XML格式的信息,因此我们需要将其转为MAP格式数据从而方便我们的处理,同时再将要响应的结果转为XML进行返回。 引入相关依赖

<dependency>
    <groupId>org.dom4j</groupId>
    <artifactId>dom4j</artifactId>
    <version>2.1.1</version>
</dependency>
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.10</version>
</dependency>
复制代码

其中dom4j依赖的DocumentHelper.parseText方法 是将给定文本 XML解析为新创建的 Document。我们通过对Document遍历赋值转为MAP格式数据。 而xstream依赖的toXML方法是将对象转化为XML信息进行返回(其中对象属性上需要增加 @XStreamAlias("相关字段")注解)。

创建XmlUtils 转化处理工具类

import com.thoughtworks.xstream.XStream;
import org.apache.commons.lang.StringUtils;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * XML对象处理类
 *
 * @auther: wanghongjie
 * @blame: wanghongjie
 * @date: 2020-08-30 17:31
 * @Description:
 */
public class XmlUtils {
    /**
     * 将xml格式的字符串转换成Map对象
     *
     * @param xmlStr xml格式的字符串
     * @return Map对象
     * @throws Exception 异常
     */
    public static Map<String, Object> xmlStrToMap(String xmlStr) throws Exception {
        if (StringUtils.isEmpty(xmlStr)) {
            return null;
        }
        Map<String, Object> map = new HashMap<>(16);
        //将xml格式的字符串转换成Document对象
        Document doc = DocumentHelper.parseText(xmlStr);
        //获取根节点
        Element root = doc.getRootElement();
        //获取根节点下的所有元素
        List children = root.elements();
        //循环所有子元素
        if (children != null && children.size() > 0) {
            for (Object o : children) {
                Element child = (Element) o;
                map.put(child.getName(), child.getTextTrim());
            }
        }
        return map;
    }
    public static String beanToXml(Object object, Class cls) {
        XStream stream = new XStream();
        stream.processAnnotations(cls);
        return stream.toXML(object);
    }
}
复制代码

创建公共消息参数处理类BaseMessage (任何消息的公共属性类,对应具体消息只需要继承该类即可)

import com.ctsi.sddx.constants.WeCharConstant;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import java.io.Serializable;
import java.util.Map;
/**
 * 公共消息参数处理类
 * Created with IntelliJ IDEA.
 * User:  wanghongjie
 * Date:  2020/10/17 - 09:56
 * <p>
 * Description:
 */
@Data
public class BaseMessage implements Serializable {
    /**
     * 消息ID 64位整型
     */
    @XStreamAlias("MsgId")
    private String msgId;
    /**
     * 开发者微信号
     */
    @XStreamAlias("ToUserName")
    private String toUserName;
    /**
     * 发送方帐号(一个OpenID)
     */
    @XStreamAlias("FromUserName")
    private String fromUserName;
    /**
     * 消息创建时间 (整型)
     */
    @XStreamAlias("CreateTime")
    private String createTime;
    /**
     * 消息类型,文本为text
     */
    @XStreamAlias("MsgType")
    private String msgType;
    void init(Map<String, Object> map) {
        this.createTime = String.valueOf(map.get(WeCharConstant.CREATE_TIME));
        this.fromUserName = String.valueOf(map.get(WeCharConstant.FROM_USER_NAME));
        this.toUserName = String.valueOf(map.get(WeCharConstant.TO_USER_NAME));
        this.msgType = String.valueOf(map.get(WeCharConstant.MSG_TYPE));
        this.msgId = String.valueOf(map.get(WeCharConstant.MSG_ID));
    }
}
复制代码

文本消息实体类TextMessage

import cn.org.spring.common.util.XmlUtils;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import lombok.Data;
import java.util.Map;
/**
 * Created with IntelliJ IDEA.
 * User:  wanghongjie
 * Date:  2020/10/17 - 10:01
 * <p>
 * Description:
 */
@Data
@XStreamAlias("xml")
public class TextMessage extends BaseMessage {
    @XStreamAlias("Content")
    private String content;
    public static TextMessage of(Map<String, Object> objectMap, String content) {
        TextMessage textMessage = new TextMessage();
        textMessage.init(objectMap);
        textMessage.setContent(content);
        return textMessage;
    }
    public static TextMessage ofSendMsg(Map<String, Object> objectMap, String content) {
        TextMessage textMessage = new TextMessage();
        textMessage.init(objectMap);
        textMessage.setContent(content);
        textMessage.setMsgType("text");
        String from = textMessage.getFromUserName();
        textMessage.setFromUserName(textMessage.getToUserName());
        textMessage.setToUserName(from);
        return textMessage;
    }
    public String toXml() {
        return XmlUtils.beanToXml(this, TextMessage.class);
    }
}
复制代码

测试 WeCharController

//    获取微信返回数据
    @PostMapping
    public String getWeChar(@RequestBody String message) throws Exception {
        System.out.println("接收到微信返回的消息:"+message);
        Map<String, Object> stringObjectMap = XmlUtils.xmlStrToMap(message);
        TextMessage textMessage = TextMessage.ofSendMsg(stringObjectMap, "你好呀,欢迎关注我的测试公众号!");
        String responseMessage = textMessage.toXml();
        System.out.println("响应微信平台的消息:"+responseMessage);
        return responseMessage;
    }
复制代码

控制台输出:

接收到微信返回的消息:<xml><ToUserName><![CDATA[gh_1e06f4c4ca61]]></ToUserName>
<FromUserName><![CDATA[oITpR5-x01JQu8doRMMgaFDYU3eM]]></FromUserName>
<CreateTime>1664696395</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[滴滴滴]]></Content>
<MsgId>23832721292703678</MsgId>
</xml>
响应微信平台的消息:<xml>
  <MsgId>23832721292703678</MsgId>
  <ToUserName>oITpR5-x01JQu8doRMMgaFDYU3eM</ToUserName>
  <FromUserName>gh_1e06f4c4ca61</FromUserName>
  <CreateTime>1664696395</CreateTime>
  <MsgType>text</MsgType>
  <Content>你好呀,欢迎关注我的测试公众号!</Content>
</xml>
复制代码

测试号响应效果:

网络异常,图片无法展示
|

思考

当你这么写的话貌似把响应信息的处理写死了,无论你发送的是文本信息,还是图片信息、语音信息他都会只回复这个信息。

网络异常,图片无法展示
|
首先想到的就是通过微信发来的POST请求进行类型判断,如果是文本信息怎么怎么回复,如果是图片信息我怎么怎么回复,如果是语音信息怎么怎么回复。。。。

下篇文章: 使用策略模式处理复杂消息


相关文章
|
7月前
|
自然语言处理 搜索推荐 小程序
微信公众号接口:解锁公众号开发的无限可能
微信公众号接口是微信官方提供的API,支持开发者通过编程与公众号交互,实现自动回复、消息管理、用户管理和数据分析等功能。本文深入探讨接口的定义、类型、优势及应用场景,如智能客服、内容分发、电商闭环等,并介绍开发流程和工具,帮助运营者提升用户体验和效率。未来,随着微信生态的发展,公众号接口将带来更多机遇,如小程序融合、AI应用等。
|
4月前
|
小程序 前端开发 Android开发
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
878 29
小程序微信分享功能如何开发?开放平台已绑定仍不能使用的问题?-优雅草卓伊凡
|
5月前
|
小程序 Java 关系型数据库
weixin163基于微信小程序的校园二手交易平台系统设计与开发ssm(文档+源码)_kaic
本文介绍了一款基于微信小程序的校园二手物品交易平台的开发与实现。该平台采用Java语言开发服务端,使用MySQL数据库进行数据存储,前端以微信小程序为载体,支持管理员和学生两种角色操作。管理员可管理用户、商品分类及信息、交易记录等,而学生则能注册登录、发布购买商品、参与交流论坛等。系统设计注重交互性和安全性,通过SSM框架优化开发流程,确保高效稳定运行,满足用户便捷交易的需求,推动校园资源共享与循环利用。
|
6月前
|
人工智能 自然语言处理 小程序
技术小白如何利用DeepSeek半小时开发微信小程序?
通过通义灵码的“AI程序员”功能,即使没有编程基础也能轻松创建小程序或网页。借助DeepSeek V3和R1满血版模型,用户只需用自然语言描述需求,就能自动生成代码并优化程序。例如,一个文科生仅通过描述需求就成功开发了一款记录日常活动的微信小程序。此外,通义灵码还提供智能问答模式,帮助用户解决开发中的各种问题,极大简化了开发流程,让普通人的开发体验更加顺畅。
1714 11
技术小白如何利用DeepSeek半小时开发微信小程序?
|
5月前
|
小程序 关系型数据库 Java
weixin168“返家乡”高校暑期社会实践微信小程序设计与开发ssm(文档+源码)_kaic
本文探讨高校暑期社会实践微信小程序的开发与应用,旨在通过信息化手段提升活动管理效率。借助微信小程序技术、SSM框架及MySQL数据库,实现信息共享、流程规范和操作便捷。系统涵盖需求分析、可行性研究、设计实现等环节,确保技术可行、操作简便且经济合理。最终,该小程序可优化活动发布、学生信息管理和心得交流等功能,降低管理成本并提高工作效率。
|
6月前
|
小程序 JavaScript 前端开发
微信小程序开发全流程:从注册到上线的完整指南
这篇文章详细记录了微信小程序的完整开发到最终上线的每一个步骤。适合对小程序开发感兴趣的个人开发者或希望了解完整流程的学习者,涵盖了云开发、事件绑定、生命周期管理、组件使用等关键内容。
1847 11
|
6月前
|
负载均衡 Dubbo Java
Spring Cloud Alibaba与Spring Cloud区别和联系?
Spring Cloud Alibaba与Spring Cloud区别和联系?
|
7月前
|
人工智能 SpringCloudAlibaba 自然语言处理
SpringCloud Alibaba AI整合DeepSeek落地AI项目实战
在现代软件开发领域,微服务架构因其灵活性、可扩展性和模块化特性而受到广泛欢迎。微服务架构通过将大型应用程序拆分为多个小型、独立的服务,每个服务运行在其独立的进程中,服务与服务间通过轻量级通信机制(通常是HTTP API)进行通信。这种架构模式有助于提升系统的可维护性、可扩展性和开发效率。
2057 2
|
7月前
|
JSON 缓存 小程序
微信小程序组件封装与复用:提升开发效率
本文深入探讨了微信小程序的组件封装与复用,涵盖组件的意义、创建步骤、属性与事件处理,并通过自定义弹窗组件的案例详细说明。组件封装能提高代码复用性、开发效率和可维护性,确保UI一致性。掌握这些技能有助于构建更高质量的小程序。
|
6月前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
105 0