前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >手把手做一个公众号GPT智能客服【二】实现微信公众号回复(订阅送源码!)

手把手做一个公众号GPT智能客服【二】实现微信公众号回复(订阅送源码!)

作者头像
Maynor
发布2023-09-26 08:21:40
5680
发布2023-09-26 08:21:40
举报
文章被收录于专栏:最新最全的大数据技术体系

第二课:实现微信公众号回复

官网注册微信公众号

https://mp.weixin.qq.com/

公众号(订阅号)的基本使用

素材库
草稿箱
自动回复
自定义菜案
合集标签
投票

搭建个人服务器

Express环境搭建。

https://www.expressjs.com.cn/

代码语言:javascript
复制
const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => {
  res.send('Hello World.')
})

app.listen(port, () => {
  console.log(`Example app listening on port ${port}`)
})

内网穿透

因为微信消息的转发,需要服务器在外网环境下进行访问,而我们正常编写代码需要在本地环境,所以我们需要通过Natapp进行内网穿透(成本为每月9元)

Natapp是一款内网穿透工具,它可以将本地的网络服务映射到公网上,从而实现外网访问内网服务的功能。下面是使用Natapp进行内网穿透的步骤:

  1. 注册并登录Natapp账号:在Natapp官网(https://natapp.cn/)中注册一个账号,并通过邮箱验证激活。
  2. 创建隧道:登录Natapp后台管理页面,在“我的隧道”中点击“创建隧道”,填写要映射的本地IP地址和端口号等信息,选择相应的协议类型(如HTTP、TCP等),并设置隧道名称。
  3. 下载并安装客户端:在“我的隧道”页面中,找到刚刚创建的隧道,点击“下载客户端”,根据不同操作系统版本下载并安装对应的客户端程序(Windows、Linux、MacOS等)。
  4. 启动客户端:运行客户端程序,输入账号密码登录,然后在命令行中输入指定格式的启动命令(如“natapp -authtoken=YOUR_TOKEN”),即可开始内网穿透服务。
  5. 测试连接:在外部网络环境下,通过浏览器或其他工具访问Natapp提供的域名(如“yourdomain.natappvip.com”),即可访问到本地网络中的服务。

第三方服务器验证

应用Express 应用程序生成器创建项目:

https://www.expressjs.com.cn/starter/generator.html

代码语言:javascript
复制
$ npx express-generator --ejs --view=ejs chatrobot
$ npm i
$ npm start

默认情况下微信的公众号是自动回复 我们需要将用户发送的消息 转到自己的服务器

image-20230418221158214
image-20230418221158214

微信第三方服务器配置

image-20230418221754997
image-20230418221754997
  1. 在公众平台填写第三方域名以及token
  2. 点击提交
  3. 在第三方域名做逻辑处理,验证token是否合法
  4. 按照tx的加密算法产生一个新的加密字符串 和sinatrue进行对比 对比ok token验证ok将echorstr 返回

参见:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html

image-20230418222147523
image-20230418222147523

Express 环境:

代码语言:javascript
复制
// /app.js

// ...
var chatrobotRouter = require('./routes/chatrobot');

// ...
app.use('/chatrobot', chatrobotRouter)

// ...
代码语言:javascript
复制
// /routes/chatrobot.js

const 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

代码语言:javascript
复制
$ npm i express-xml-bodyparser

2、在app.js文件中添加中间

代码语言:javascript
复制
// /app.js

// ...
var xmlparser = require('express-xml-bodyparser')

// ...
app.use(express.json());
app.use(express.urlencoded({ extended: false }));
app.use(xmlparser())

// ...

3、创建视图

代码语言:javascript
复制
// /views/reply.ejs
// 注意这里fromusername 和 tousername 是相反的。
<xml>
  <ToUserName>
    <![CDATA[<%= fromusername %>]]>
  </ToUserName>
  <FromUserName>
    <![CDATA[<%= tousername %>]]>
  </FromUserName>
  <CreateTime>
    <%= createtime %>
  </CreateTime>
  <MsgType>
    <![CDATA[text]]>
  </MsgType>
  <Content>
    <![CDATA[<%= content %>]]>
  </Content>
</xml>

4、添加核心代码

代码语言:javascript
复制
// /routes/chatrobot.js

// ...

function formatMsg(msg) {
  const msgXml = msg.xml
  const 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
  } = msg

  msg['createtime'] = Math.floor((new Date().getTime()) / 1000)
  msg['content'] = '你好呀 ☕️'

  res.set('Content-Type', 'text/xml')
  res.render('reply', msg)
}

// ...

// 消息接收与回复
router.post('/', messageController)

// ...

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第二课:实现微信公众号回复
    • 公众号(订阅号)的基本使用
      • 素材库
      • 草稿箱
      • 自动回复
      • 自定义菜案
      • 合集标签
      • 投票
    • 搭建个人服务器
      • 内网穿透
        • 第三方服务器验证
          • 消息的接收与回复
          相关产品与服务
          消息队列 TDMQ
          消息队列 TDMQ (Tencent Distributed Message Queue)是腾讯基于 Apache Pulsar 自研的一个云原生消息中间件系列,其中包含兼容Pulsar、RabbitMQ、RocketMQ 等协议的消息队列子产品,得益于其底层计算与存储分离的架构,TDMQ 具备良好的弹性伸缩以及故障恢复能力。
          领券
          问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档