node.js接入微信公众号开发
前言
前阵子开始搞起了公众号,摸索期间也接触到了公众号开发,特将摸索过程中经历记录下来和大家分享,由于没有经历过系统的后端学习,所以以下步骤及思路均为个人在网上摸索以及思考整理而出,不保证权威性,仅供参考,如有错误或可以改进的地方,欢迎提出。
接入流程-微信侧
首先我们登录公众号后台,找到左侧菜单中的基本设置
点击修改配置之后,我们会进入参数填写页
下面我们对每一个参数进行分析。
参数说明
URL
必须以http://
或https://
开头,分别支持80端口和443端口。这里就是要我们填入我们的后端地址,用户的操作类请求微信都会给转发到这个地址,需要注意的是这个地址仅支持80端口和443端口,所以我们有两种方法
- 将给后端服务分配一个单独的子域名(二级、三级均可),本文采取的就是这种方法
- 使用Nginx进行代理,如果你的后端服务没有使用80端口或者443端口,可以使用Nginx将请求转发到后端所在的地址。
Token
Token可由我们任意填写,主要是用来生成签名,我们在初始接入的时候,微信会利用token生成秘钥发送给服务器,服务器对秘钥进行验证,验证成功即可接入成功。
EncodingAESKey
EncodingAESKey可以由我们手写,或者点击随机生成按钮进行生成,这个主要用户后期的微信发送到服务器的消息体的加解密,后面我们会说到。
消息加解密方式
- 明文模式:不加密
- 兼容模式:加密不加密共存
- 安全模式:加密
由于本篇文章不涉及后续的消息处理,暂时不讲,后面讲消息处理的时候会说到,开发时我们选择兼容模式即可
接入流程-服务器侧
服务器验证
全部填写完毕,我们点击提交,会发现系统弹出了错误弹窗,告诉我们token验证失败
这是因为我们仅在微信这边配置了,但是没有在服务器端进行回应。我们先来看看服务端有没有收到消息
可以看到我们已经收到了微信的验证消息,下面我们只要对微信进行正确的回应就好了。
首先我们要知道微信发送的这串消息都涵盖了哪些参数,都是什么意思,我们需要怎么回应。
微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示
参数 | 描述 |
---|---|
signature | 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 |
timestamp | 时间戳 |
nonce | 随机数 |
echostr | 随机字符串 |
signature有我们之前填写的token和微信get请求中的timestamp、nonce共同组合加密而成,我们收到之后需要对signature进行解码,然后对解码出来的token进行验证 ,验证完成之后返回echostr参数给微信即可完成接入。
signature的加密规则如下:
- 将token、timestamp、nonce三个参数进行字典序排序
- 将三个参数字符串拼接成一个字符串进行sha1加密
字典序排序其实就是按字母顺序排序,我们使用js中数组的sort方法即可。
接下来我们要在服务端对请求进行处理,来完成接入流程。
因为我们之前在微信填写的服务端地址为域名/wx
,所以我们先把/wx这个路由的请求放到白名单中,不进行权限校验。
上面我们说了,signature的加密规则用到了sha1加密,这里我们可以使用node.js自带的方法来实现一个sha1加密
// encryption.js
const crypto = require('crypto')module.exports = {md5: (str) => {return crypto.createHash('md5').update(str).digest('hex')},sha1: (str) => {return crypto.createHash('sha1').update(str).digest('hex')}
}
之后我们就可以对微信的验证消息进行验证并处理了
const encryption = require('../utils/encryption')
class WxController {async index(ctx) {let {signature = '', timestamp = '', nonce = '', echostr = ''} = ctx.querylet token = process.env.wx_token// 验证tokenlet str = [token, timestamp, nonce].sort().join('')let sha1 = encryption.sha1(str)if (sha1 !== signature) {ctx.body = 'token验证失败'return} else {ctx.body = echostr}}
}module.exports = new WxController()
改完之后我们部署到服务器,然后再去微信侧点击一下提交,可以看到,已经可以提交成功了。
之后我们点击启用按钮,会提示我们启用之后公众平台的自定义菜单和自动回复将会失效,所有的请求都会转发到我们自己的服务端
之后我们去公众号测试一下
会发现微信提示我们公众号服务故障,这是因为我们还没有对发送的消息做任何处理,然后我们去服务端看看
可以看到我们已经成功的收到了微信转发过来的请求,说明我们已经接入成功了,后面只需要按微信的规定,对信息进行处理,然后返回必要的信息就可以了,这些就放在后面的文章说吧。
顺便吐槽一句,个人公众号的权限真少啊
node.js接入微信公众号开发相关推荐
- 【Node.js 微信公众号实战】1.Node.js 接入微信公众平台开发
文章目录: 1.Node.js 接入微信公众平台开发 2.Node.js access_token的获取.存储及更新 3.Node.js 自定义微信菜单 ...
- 1.Node.js 接入微信公众平台开发
一.写在前面的话 Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...
- 微信公众号自动回复html,[.NET] 简单接入微信公众号开发:实现自动回复
简单接入微信公众号开发:实现自动回复 一.前提 先申请微信公众号的授权,找到或配置几个关键的信息(开发者ID.开发者密码.IP白名单.令牌和消息加解密密钥等). 二.基本配置信息解读 开发者ID:固定 ...
- 如何接入微信公众号开发?底层原理是什么?
要接入微信公众号开发,您需要完成以下几个步骤: 注册微信公众平台账号:首先,您需要在微信公众平台上注册一个账号,并创建一个公众号.在注册过程中,您需要提供相关的身份信息和认证材料,以便微信审核和认证您 ...
- 用.Net Core接入微信公众号开发
Part1前言 最近想写一点基于.Net Core微信公众号开发的文章 Part2测试公众号申请 测试公众号申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sa ...
- (Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班
(Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班 从零到壹全栈部落 产品:个人独立博客,21点见 Vue + Node + MongoDB支持服务端渲染的博客系统(5天) 开发环境技术 ...
- nodejs微信公众号开发第一步(接入指南)--wechat模块
用模块接入微信就非常简单了.只用配置好参数,逻辑大神都写好了,站在巨人的肩膀上的感觉就是不错 本文测试用的是微信测试号. -- express生成项目框架 express命令行创建项目 :点击这里, ...
- Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发
接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...
- 微信公众号开发之服务器接入指南之Java版本
微信公众号开发的官方文档: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 其中我们开发好的服务器,在配置到 ...
- C#微信公众号开发系列教程二(新手接入指南)
此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教 ...
最新文章
- 是否提交由npm 5创建的package-lock.json文件?
- linux socket 端口复用 SO_REUSEADDR
- 云原生产业联盟成立 蚂蚁金服当选为理事单位
- MVC学习(四)几种分页的实现(3)
- 计算机应用等级考试1,计算机等级考试一级试题
- linux ping不允许的操作,linux – ping:sendmsg:不允许操作(有时)
- android开发(49) android 使用 CollapsingToolbarLayout ,可折叠的顶部导航栏
- django-QueryDict对象
- flutter闪屏过渡动画,闪光占位动画
- 定义表格的指定列的属性
- C++socket编程(七):7.2 XHttp项目创建接收浏览器请求
- 【深度学习框架-torch】torch.norm函数详解用法
- Ms08067年度技术文集合
- 二台计算机 共享,两台电脑如何共享
- 电容笔和Apple pencil的区别?双十一值得买电容笔排行榜
- Android工作经验6年,Android事件分发机制收藏这一篇就够了,分享PDF高清版
- 导图解文 从梦想到财富(39)正确的创业方向,都落在3个必然趋势中
- Python+pandas把多个DataFrame对象写入Excel文件中同一个工作表
- luogu1941 飞扬的小鸟
- 怎么会有两个“原本”
热门文章
- 四象限法推导lm曲线_数据分析四象限法详解
- Echarts绘制极坐标系下的多色柱状图
- 【小应用】社交距离检测
- vue图片裁剪:使用vue-cropper做图片裁剪
- 计算机识别人脸原理,深入浅出人脸识别原理
- 看了这个教程,学会快速找出三等分点
- android 播放器 samba,(发烧屋)教你如何解决蓝光机 KODI无法打开局域网SMB共享的问题/安卓播放器/硬盘播放器...
- 炉石传说---奇迹德/凯子德玩法攻略
- 大数据下的供应商评分系统
- 课题:交通标志识别——设计思路与实现步骤记录