前言

前阵子开始搞起了公众号,摸索期间也接触到了公众号开发,特将摸索过程中经历记录下来和大家分享,由于没有经历过系统的后端学习,所以以下步骤及思路均为个人在网上摸索以及思考整理而出,不保证权威性,仅供参考,如有错误或可以改进的地方,欢迎提出。

接入流程-微信侧

首先我们登录公众号后台,找到左侧菜单中的基本设置

点击修改配置之后,我们会进入参数填写页

下面我们对每一个参数进行分析。

参数说明

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的加密规则如下:

  1. 将token、timestamp、nonce三个参数进行字典序排序
  2. 将三个参数字符串拼接成一个字符串进行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接入微信公众号开发相关推荐

  1. 【Node.js 微信公众号实战】1.Node.js 接入微信公众平台开发

    文章目录:         1.Node.js 接入微信公众平台开发         2.Node.js access_token的获取.存储及更新         3.Node.js 自定义微信菜单 ...

  2. 1.Node.js 接入微信公众平台开发

    一.写在前面的话   Node.js是一个开放源代码.跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动.非阻塞和异步输入输出模型等技术来提高性能,可优化应用程 ...

  3. 微信公众号自动回复html,[.NET] 简单接入微信公众号开发:实现自动回复

    简单接入微信公众号开发:实现自动回复 一.前提 先申请微信公众号的授权,找到或配置几个关键的信息(开发者ID.开发者密码.IP白名单.令牌和消息加解密密钥等). 二.基本配置信息解读 开发者ID:固定 ...

  4. 如何接入微信公众号开发?底层原理是什么?

    要接入微信公众号开发,您需要完成以下几个步骤: 注册微信公众平台账号:首先,您需要在微信公众平台上注册一个账号,并创建一个公众号.在注册过程中,您需要提供相关的身份信息和认证材料,以便微信审核和认证您 ...

  5. 用.Net Core接入微信公众号开发

    Part1前言 最近想写一点基于.Net Core微信公众号开发的文章 Part2测试公众号申请 测试公众号申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sa ...

  6. (Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班

    (Node+Vue+微信公众号开发)企业级产品全栈开发速成周末班 从零到壹全栈部落 产品:个人独立博客,21点见 Vue + Node + MongoDB支持服务端渲染的博客系统(5天) 开发环境技术 ...

  7. nodejs微信公众号开发第一步(接入指南)--wechat模块

    用模块接入微信就非常简单了.只用配置好参数,逻辑大神都写好了,站在巨人的肩膀上的感觉就是不错 本文测试用的是微信测试号. -- express生成项目框架 express命令行创建项目 :点击这里, ...

  8. Java开发微信公众号(二)---开启开发者模式,接入微信公众平台开发

    接入微信公众平台开发,开发者需要按照如下步骤完成: 1.填写服务器配置 2.验证服务器地址的有效性 3.依据接口文档实现业务逻辑 资料准备: 1.一个可以访问的外网,即80的访问端口,因为微信公众号接 ...

  9. 微信公众号开发之服务器接入指南之Java版本

    微信公众号开发的官方文档: https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421135319 其中我们开发好的服务器,在配置到 ...

  10. C#微信公众号开发系列教程二(新手接入指南)

    此系列前面已经更新了两篇博文了,都是微信开发的前期准备工作,现在切入正题,本篇讲解新手接入的步骤与方法,大神可直接跳过,也欢迎大神吐槽. 微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教 ...

最新文章

  1. 是否提交由npm 5创建的package-lock.json文件?
  2. linux socket 端口复用 SO_REUSEADDR
  3. 云原生产业联盟成立 蚂蚁金服当选为理事单位
  4. MVC学习(四)几种分页的实现(3)
  5. 计算机应用等级考试1,计算机等级考试一级试题
  6. linux ping不允许的操作,linux – ping:sendmsg:不允许操作(有时)
  7. android开发(49) android 使用 CollapsingToolbarLayout ,可折叠的顶部导航栏
  8. django-QueryDict对象
  9. flutter闪屏过渡动画,闪光占位动画
  10. 定义表格的指定列的属性
  11. C++socket编程(七):7.2 XHttp项目创建接收浏览器请求
  12. 【深度学习框架-torch】torch.norm函数详解用法
  13. Ms08067年度技术文集合
  14. 二台计算机 共享,两台电脑如何共享
  15. 电容笔和Apple pencil的区别?双十一值得买电容笔排行榜
  16. Android工作经验6年,Android事件分发机制收藏这一篇就够了,分享PDF高清版
  17. 导图解文 从梦想到财富(39)正确的创业方向,都落在3个必然趋势中
  18. Python+pandas把多个DataFrame对象写入Excel文件中同一个工作表
  19. luogu1941 飞扬的小鸟
  20. 怎么会有两个“原本”

热门文章

  1. 四象限法推导lm曲线_数据分析四象限法详解
  2. Echarts绘制极坐标系下的多色柱状图
  3. 【小应用】社交距离检测
  4. vue图片裁剪:使用vue-cropper做图片裁剪
  5. 计算机识别人脸原理,深入浅出人脸识别原理
  6. 看了这个教程,学会快速找出三等分点
  7. android 播放器 samba,(发烧屋)教你如何解决蓝光机 KODI无法打开局域网SMB共享的问题/安卓播放器/硬盘播放器...
  8. 炉石传说---奇迹德/凯子德玩法攻略
  9. 大数据下的供应商评分系统
  10. 课题:交通标志识别——设计思路与实现步骤记录