手把手做一个公众号GPT智能客服【二】实现微信公众号回复(订阅送源码!)
文章目录
- 第二课:实现微信公众号回复
- 公众号(订阅号)的基本使用
- 素材库
- 草稿箱
- 自动回复
- 自定义菜案
- 合集标签
- 投票
- 搭建个人服务器
- 内网穿透
- 第三方服务器验证
- 消息的接收与回复
- 后记
第二课:实现微信公众号回复
官网注册微信公众号
https://mp.weixin.qq.com/
公众号(订阅号)的基本使用
素材库
草稿箱
自动回复
自定义菜案
合集标签
投票
搭建个人服务器
Express环境搭建。
https://www.expressjs.com.cn/
const express = require('express')
const app = express()
const port = 3000app.get('/', (req, res) => {res.send('Hello World.')
})app.listen(port, () => {console.log(`Example app listening on port ${port}`)
})
内网穿透
因为微信消息的转发,需要服务器在外网环境下进行访问,而我们正常编写代码需要在本地环境,所以我们需要通过Natapp进行内网穿透(成本为每月9元)
Natapp是一款内网穿透工具,它可以将本地的网络服务映射到公网上,从而实现外网访问内网服务的功能。下面是使用Natapp进行内网穿透的步骤:
- 注册并登录Natapp账号:在Natapp官网(https://natapp.cn/)中注册一个账号,并通过邮箱验证激活。
- 创建隧道:登录Natapp后台管理页面,在“我的隧道”中点击“创建隧道”,填写要映射的本地IP地址和端口号等信息,选择相应的协议类型(如HTTP、TCP等),并设置隧道名称。
- 下载并安装客户端:在“我的隧道”页面中,找到刚刚创建的隧道,点击“下载客户端”,根据不同操作系统版本下载并安装对应的客户端程序(Windows、Linux、MacOS等)。
- 启动客户端:运行客户端程序,输入账号密码登录,然后在命令行中输入指定格式的启动命令(如“natapp -authtoken=YOUR_TOKEN”),即可开始内网穿透服务。
- 测试连接:在外部网络环境下,通过浏览器或其他工具访问Natapp提供的域名(如“yourdomain.natappvip.com”),即可访问到本地网络中的服务。
第三方服务器验证
应用Express 应用程序生成器创建项目:
https://www.expressjs.com.cn/starter/generator.html
$ npx express-generator --ejs --view=ejs chatrobot
$ npm i
$ npm start
默认情况下微信的公众号是自动回复 我们需要将用户发送的消息 转到自己的服务器

微信第三方服务器配置

- 在公众平台填写第三方域名以及token
- 点击提交
- 在第三方域名做逻辑处理,验证token是否合法
- 按照tx的加密算法产生一个新的加密字符串 和sinatrue进行对比 对比ok token验证ok将echorstr 返回
参见:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

Express 环境:
// /app.js// ...
var chatrobotRouter = require('./routes/chatrobot');// ...
app.use('/chatrobot', chatrobotRouter)// ...
// /routes/chatrobot.jsconst express = require('express');
const crypto = require('crypto')
const router = express.Router();function checkSignature(req, res, next) {// 定义 token,此 token 一定要与微信公众号 token 一致const token = 'weixin'// 获取来自微信服务器的信息const { signature, echostr, timestamp, nonce } = req.query// 将token、timestamp、nonce三个参数进行字典序排序,再拼接成一个字符串const tmpStr = [token, timestamp, nonce].sort().join('')// 将三个参数字符串拼接成一个字符串进行sha1加密const mySignature = crypto.createHash('sha1').update(tmpStr).digest('hex')// 获得加密后的字符串可与signature对比,标识该请求来源于微信// 若确认此次GET请求来自微信服务器,请原样返回echostr参数内容res.send(mySignature === signature ? echostr : 'error')
}router.get('/', checkSignature)module.exports = router;
消息的接收与回复
消息接收,参见:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Receiving_standard_messages.html
消息回复,参见:https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Passive_user_reply_message.html
完整代码:
1、安装中间件 express-xml-bodyparser
$ npm i express-xml-bodyparser
2、在app.js文件中添加中间
// /app.js// ...
var xmlparser = require('express-xml-bodyparser')// ...
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(xmlparser())// ...
3、创建视图
// /views/reply.ejs
// 注意这里fromusername 和 tousername 是相反的。
<xml><ToUserName>]]>ToUserName><FromUserName>]]>FromUserName><CreateTime><%= createtime %>CreateTime><MsgType>MsgType><Content>]]>Content>
xml>
4、添加核心代码
// /routes/chatrobot.js// ...function formatMsg(msg) {const msgXml = msg.xmlconst msgArray = Object.keys(msgXml)return msgArray.reduce((obj, key) => {obj[key] = msgXml[key][0]return obj}, {})
}function messageController(req, res, next) {// 接收到微信方发来的消息并处理const msg = formatMsg(req.body)// 回复信息const {tousername,fromusername} = msgmsg['createtime'] = Math.floor((new Date().getTime()) / 1000)msg['content'] = '你好呀 ☕️'res.set('Content-Type', 'text/xml')res.render('reply', msg)
}// ...// 消息接收与回复
router.post('/', messageController)// ...
后记
📢博客主页:https://manor.blog.csdn.net
📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📢本文由 Maynor 原创,首发于 CSDN博客🙉
📢每次转变,总会迎来很多不解的目光,有时甚至是横眉冷对千夫指。但对顺境逆境都心存感恩,使自己用一颗柔软的心包容世界。柔软的心最有力量⭐
📢专栏持续更新,欢迎订阅:https://blog.csdn.net/xianyu120/category_12452278.html
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
