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

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

作者头像
Maynor
发布于 2023-09-26 00:21:40
发布于 2023-09-26 00:21:40
68400
代码可运行
举报
运行总次数:0
代码可运行

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

官网注册微信公众号

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

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

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

搭建个人服务器

Express环境搭建。

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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. 下载并安装客户端:在“我的隧道”页面中,找到刚刚创建的隧道,点击“下载客户端”,根据不同操作系统版本下载并安装对应的客户端程序(WindowsLinuxMacOS等)。
  4. 启动客户端:运行客户端程序,输入账号密码登录,然后在命令行中输入指定格式的启动命令(如“natapp -authtoken=YOUR_TOKEN”),即可开始内网穿透服务。
  5. 测试连接:在外部网络环境下,通过浏览器或其他工具访问Natapp提供的域名(如“yourdomain.natappvip.com”),即可访问到本地网络中的服务。

第三方服务器验证

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

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ npx express-generator --ejs --view=ejs chatrobot
$ npm i
$ npm start

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

微信第三方服务器配置

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

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

Express 环境:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// /app.js

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

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

// ...
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// /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
代码运行次数:0
运行
AI代码解释
复制
$ npm i express-xml-bodyparser

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// /app.js

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

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

// ...

3、创建视图

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// /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
代码运行次数:0
运行
AI代码解释
复制
// /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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
以RAID分析作为架构驱动力
寻找架构驱动力 人类自开始学会以智慧洗亮观察世界的双眼之后,就明白观察事物不能浅尝辄止停留在表面现象,而要去看透本质。通过本质规律去建模世界,才能以“一”推演万物。种种推演的过程,皆是要去寻找某种驱动力量作为分析或建构的起点。 例如,当我们要分析一个运动中的物体会形成如何的运动轨迹时,就需要寻找产生运动的力,包括初始的动力、重力、摩擦力以及其他可能干扰物体运动的力。有的力会推动者物体向前,例如初始动力以及与运动方向保持一致的作用力;有的力会阻碍物体的运动,如摩擦力或者空气阻力等。通过分析这些力的方向及度量,
张逸
2018/03/07
1.9K0
以RAID分析作为架构驱动力
了解不同架构思维,赏析架构之美
系统架构(System Architecture),软件架构(Soft Architecture)是 IT 领域常见的名词,架构设计是软件系统构建过程中极其关键的一部分。
码哥字节
2020/08/31
1.1K0
教你画图;架构图、拓扑图、用例图、流程图、建模图、分层图!
😂 现在的面试是不是为难小朋友,怎么刚一毕业的面试,就让现场手画简历项目的系统架构图。面试官说,你不是计算机专业毕业🎓的吗,这不是你的基础吗?你作为一个合格的毕业生,不就应该学习到这些吗?
小傅哥
2024/09/24
1.9K0
教你画图;架构图、拓扑图、用例图、流程图、建模图、分层图!
【工作坊】可视化设计
之所以选择可视化手段来进行软件设计——非UI或UX的设计——是基于我对设计的理解:设计并非文档,而是交流。那种依靠一位英雄来完成所有的设计,并编撰为详尽的文档,然后让程序员连蒙带猜按图索骥的设计方式,完全不可取。尤其在一个自组织的开发团队中,我们希望人人都是程序员,人人都是软件设计师,人人都是架构师。 那么,该如何做到充分的交流,就像风吹过树林,不分彼此的摇动每一片树叶?我想到最简单直截的方式:可视化。然而,此可视化非UML之所谓的“一图胜千言”。没错,我们当然需要绘制设计图,而且必须绘制设计图,但我们更希
张逸
2018/03/07
7970
【工作坊】可视化设计
【系统架构】可视化与领域驱动设计
从DDD的角度,领域逻辑的分析可以运用战略方法Bounded Context。可是,一个问题是:如何获得Bounded Context ? 我查看了许多关于Bounded Context的书籍与文章,虽然都着重强调了它的重要性,也给出了一些实例,却对如何从需求——>Boundex Context这一点上语焉不详。 一个初步设想 我的初步设想是通过绘制场景图(但并不成熟)。我认为有三种绘制场景图的方式:商业画布,体验地图和流程图。我认为,商业画布可以作为需求分析(尤其针对初创产品)的起点。商业画布如下图所示:
张逸
2018/03/07
1.3K0
【系统架构】可视化与领域驱动设计
《IT架构师成长和认证指南》简介及第2章 IT架构师角色和素养
作者写了一本关于IT架构师成长和认证的书,希望先通过连载的形式拿出来分享,结合读者的反馈来不断调整完善,也作为全文校对完善的一种方法。本书希望对于那些想成长为架构师,并在架构师职业发展道路上不断进阶的读者们有所借鉴和指导,也欢迎业内专家不吝赐教和斧正。
企业架构师思维
2025/05/30
880
《IT架构师成长和认证指南》简介及第2章 IT架构师角色和素养
六边形架构和分层架构的区别?
六边形架构(Hexagonal Architecture)和分层架构(Layered Architecture)是两种常见的软件架构模式。 六边形架构强调将核心业务逻辑与外部依赖解耦,通过接口与外部世界进行通信。核心业务逻辑位于架构的中心,而外部依赖通过适配器与核心业务逻辑连接在一起。这种架构具有灵活性高、易于测试和扩展的优点。 分层架构将软件系统划分为多个逻辑层,每个层具有特定的职责和功能。常见的层包括表示层、应用层、领域层和基础设施层。分层架构提供了清晰的分离和组织方式,使得各个层的职责清晰可见,并且易于理解、测试和维护。 这两种架构模式在软件系统设计和开发中有不同的应用场景和优势,可以根据具体需求选择适合的架构模式。
逍遥壮士
2023/09/01
7780
六边形架构和分层架构的区别?
Golang整洁架构实践
👉 腾小云导读 为了降低系统组件之间的耦合、提升系统的可维护性,一个好的代码框架显得尤为重要。本文将为大家介绍众所周知的三种代码框架,并从三种框架引申出COLA 架构以及作者基于 COLA 架构设计的 Go 语言项目脚手架实践方案。希望能给广大开发爱好者带来帮助和启发! ---- 👉 看目录,点收藏 1.为什么要有代码架构 2.好的代码架构是如何构建的     2.1 整洁架构     2.2 洋葱架构     2.3 六边形架构     2.4 COLA架构 3.推荐一种 Go 代码架构实践 4.
腾讯云开发者
2023/04/06
1.9K0
Golang整洁架构实践
微服务:如何拆分服务?
在微服务的落地中,第一步就需要进行微服务的拆分,服务的拆分很困难也很重要,本文就讲讲怎么进行服务的拆分。
oec2003
2022/04/26
1.3K0
微服务:如何拆分服务?
领域驱动设计对软件复杂度的应对
不管是因为规模与结构制造的理解力障碍,还是因为变化带来的预测能力问题,最终的决定因素还是因为需求。Eric Evans认为“很多应用程序最主要的复杂性并不在技术上,而是来自领域本身、用户的活动或业务”。因而,领域驱动设计关注的焦点在于领域和领域逻辑,因为软件系统的本质其实是给客户(用户)提供具有业务价值的领域功能。
张逸
2019/03/07
1.1K0
领域驱动设计对软件复杂度的应对
领域驱动应对业务复杂度
之前的文章提到过,领域驱动设计分成战略层次和战术层次,战略层次我们讨论的很多了,接下来我们主要看下战术层次要搞哪些事情,以及领域驱动如何以架构的形式落地呢。
春哥大魔王
2020/07/24
1K0
领域驱动应对业务复杂度
领域驱动设计(DDD)架构演进和DDD的几种典型架构介绍(图文详解)
点击上方“芋道源码”,选择“设为星标” 管她前浪,还是后浪? 能浪的浪,才是好浪! 每天 10:33 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java 2021 超神之路,很肝~ 中文详细注释的开源项目 RPC 框架 Dubbo 源码解析 网络应用框架 Netty 源码解析 消息中间件 RocketMQ 源码解析 数据库中间件 Sharding-JDBC 和 MyCAT 源码解析 作业调度中间件 Elastic-Job 源码解析 分布式事务中间件 TCC-Transaction
芋道源码
2022/03/24
9300
一网打尽,全面讲解交换机的来龙去脉,基础+拓展史上最全干货
  交换机(Switch)意为“开关”,是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。其他常见的还有电话语音交换机、光纤交换机等。
网络工程师笔记
2021/09/30
8.4K1
一网打尽,全面讲解交换机的来龙去脉,基础+拓展史上最全干货
手机端本地服务与后端微服务的技术差异
以下是手机内部本地服务与后端微服务架构及通信协议的对比分析,结合两者的核心设计差异与技术实现特点展开:
用户2755790
2025/04/24
1270
当我们谈论DDD时我们在谈论什么
谈论到 DDD,我们会聊事件风暴,会聊限界上下文,会聊六边形架构,会聊实体值对象。这些概念各不相同,相关的概念也很不一样,但都属于DDD的范畴。见过了很多DDD的讨论和工作坊,我发现大家唇枪舌剑无法达成一致,往往是因为各自脑中的问题并不相同。
ThoughtWorks
2023/04/28
2760
当我们谈论DDD时我们在谈论什么
DDD分层架构浅析
微服务架构模型有好多种,例如整洁架构、CQRS和六边形架构等等。每种架构模式虽然提出的时代和背景不同,但其核心理念都是为了设计出“高内聚低耦合”的架构,轻松实现架构演进。而DDD分层架构的出现,使架构边界变得越来越清晰,它在微服务架构模型中,占有非常重要的位置。
架构狂人
2023/08/16
1.8K0
DDD分层架构浅析
程序员过关斩将--从未停止过的系统架构设计步伐
谈到系统架构的分层和系统领域边界的划分,每个架构师,每个技术经理,甚至每个程序员都有自己的一套想法。无论是怎么样的划分方案,总体的目标始终是一致的,打造一个高性能,高可用,高可扩展,高安全性的系统,甚至会附加上一大堆的专业名词,例如:高度一致性,可重用性,幂等性,兼容性 等等。对于最终用户来说,无论系统怎么样架构设计,稳定性是第一位的。假如系统三天两头打不开,报500服务器错误,程序员岂不是天天要被祭天?
架构师修行之路
2020/11/11
3940
我,前端,不想卷技术了……卷下整洁架构
行为是指系统实现的功能特性,一般是比较紧急的,需要按时上线。架构就是指系统架构,是重要的,但是并不总是特别紧急。因此导致我们常常忽视系统的架构价值,使得系统越来越难于理解、修改,导致系统功能迭代成本逐步上升,生产力逐步下降。
腾讯云开发者
2023/10/19
7520
我,前端,不想卷技术了……卷下整洁架构
如何有效的进行架构设计?
最近描述产品或者架构解决方案的经验总结写的相对较多,这篇暂时不谈具体问题场景了,想聊一下关于架构设计的一点方法论和经验总结。之前的很长一段时间都在实践和学习架构等相关的内容,回想了一下工作以来接触到的系统:广告系统、营销活动系统、权益系统、支付&账务系统、资金决策系统,然后还有那些看起来规模庞大的重点项目,也算是有了一点自己的总结和思考,在这里表述出来分享给大家。
邹志全
2021/11/24
5160
如何有效的进行架构设计?
干货 | 后微服务时代,领域驱动设计在携程国际火车票的实践
Ma Ning,携程国际火车票后端开发工程师,关注系统架构、微服务、高可用等技术领域。
携程技术
2021/08/13
1K0
推荐阅读
相关推荐
以RAID分析作为架构驱动力
更多 >
LV.0
这个人很懒,什么都没有留下~
目录
  • 第二课:实现微信公众号回复
    • 公众号(订阅号)的基本使用
      • 素材库
      • 草稿箱
      • 自动回复
      • 自定义菜案
      • 合集标签
      • 投票
    • 搭建个人服务器
    • 内网穿透
    • 第三方服务器验证
    • 消息的接收与回复
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档