zl程序教程

您现在的位置是:首页 >  云平台

当前栏目

微信公众号开发之回复文本消息

消息微信开发 文本 公众 回复
2023-09-11 14:19:18 时间

这一节我们主要参照官网文档点击

注意事项

  1. 相关的注意事项官网中已经写好,我们还需要注意,在返回相应类型的消息的时候,xml的尖括号不能有空格
  2. 注意消息的发送者和接收者不要写反了

代码

我们接着在auth.js 点击下写代码,代码如下

源码

const sha1 = require("sha1")

const config = require("../config")
const { getUserDataAsync, parseXmlData, formatMsg } = require("../libs/utils")

module.exports = () => {
    return async (req, res, next) => {
        const { signature, echostr, timestamp, nonce } = req.query
        const { token } = config
        const str = [token, timestamp, nonce].sort().join("")
        const sha1str = sha1(str)
        if (req.method === "GET") {
            // GET请求用于验证服务器的有效性
            if (sha1str == signature) {
                res.set("Content-Type", "text/plain");
                res.send(echostr);
            } else {
                res.send(false)
            }
        } else if (req.method === "POST") {
            // POST用于接收用户发送的消息
            if (sha1str != signature) {
                // post请求不是来源于微信
                res.send("error")
                return
            }
            // 获取微信发送的消息
            const xml_data = await getUserDataAsync(req)
            let user_data = await parseXmlData(xml_data)
            user_data = formatMsg(user_data)
            console.log(user_data);
            // 恢复用户消息
            let content = "what are you talking about?"
            const {MsgType,Content,FromUserName,ToUserName} = user_data
            console.log(Content);
            if (MsgType === "text"){
                // 文本类型的消息
                if(Content === "1"){
                    content = "三打白骨精"
                } else if(Content === "2"){
                    content = "七擒孟获"
                }else if(Content.match("水")){
                    content = "武松打虎"
                }
            }

            // 注意发送者和接受者
            let replyMessage = `<xml>
                <ToUserName><![CDATA[${FromUserName}]]></ToUserName>
                <FromUserName><![CDATA[${ToUserName}]]></FromUserName>
                <CreateTime>${Date.now()}</CreateTime>
                <MsgType><![CDATA[text]]></MsgType>
                <Content><![CDATA[${content}]]></Content>
                </xml>`
            console.log(replyMessage);
            // 将消息结构发送到微信服务器
            res.send(replyMessage)
        }
    }
}

对于代码的解释

  1. 微信服务器向我们的服务器发动post的请求的时候还会携带query参数,这一块,主要用于判断post请求是否来源于微信,所以我们在接收post请求的要判断是不是来源于微信
  2. 使用我们写好的流式数据读取的函数对微信的请求参数进行解析,得到用户发送的消息
  3. 拿到用户发送的消息,我们进行对于消息的处理(不同的消息回复什么内容),就是代码中if语句
  4. 根据官网,回复不同类型的消息,需要不同的模板,这里只回复了文本消息,所以只写了回复文本消息的模板replyMessage
  5. 最后向微信服务器发送我们的模板

测试

扫一扫测试号,我们进行测试

在这里插入图片描述