准备测试公众号

mp.weixin.qq.com/debug/cgi-b…

关注,获取测试公众号

内网渗透工具

natapp.cn/login 按照教程下载客户端进行配置

后台服务接入公众号

有netapp 生成的映射外网IP => URL

搭建express开发环境

这个网上有教程,自行百度

接口配置和签名验证

接入微信平台

Token:自主设置,这个token与公众平台wiki中常提的access_token不是一回事。这个token只用于验证开发者服务器

mp.weixin.qq.com/wiki?t=reso…

// 认证开发者服务器
function sign(config, req, res, next) {const {signature,timestamp,nonce,echostr,} = req.queryconst conf = config || {}const { token } = conf.wechat// 1. 将token、timestamp、nonce三个参数进行字典序排序const array = [token, timestamp, nonce]array.sort()const str = array.toString().replace(/,/g, '')// 2. 将三个参数字符串拼接成一个字符串进行sha1加密const sha1Code = crypto.createHash('sha1')const code = sha1Code.update(str, 'utf-8').digest('hex')// 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信if (req.method === 'GET') {if (code === signature) {res.send(echostr)} else {res.send('error')}} else if (req.method === 'POST') {if (code !== signature) {return}next()}}
复制代码

获取access_token

微信公众号文档中已经详细说明了,access_token是公众号的全局唯一接口调用凭据,因此每个接口均要加上access_token mp.weixin.qq.com/wiki?t=reso…

// config.json
{"wechat" : {"appID": "","appSecret": "","token": "access_token","prefix": "https://api.weixin.qq.com/cgi-bin/","mpPrefix": "https://mp.weixin.qq.com/cgi-bin/"}
}
复制代码
/**微信相关操作api*/const config = require('./config/config')
const utils = require('./utils')const wechatApi = {}
const { appID, appSecret } = config.wechat
const api = {accessToken: `${config.wechat.prefix}token?grant_type=client_credential`,upload: `${config.wechat.prefix}media/upload?`,
}// 获取access_token
wechatApi.updateAccessToken = function () {const option = {url: `${api.accessToken}&appid=${appID}&secret=${appSecret}`,json: true,}return utils.request(option).then(data => Promise.resolve(data))
}module.exports = wechatApi复制代码
// ../routes/index.jsconst express = require('express')
const config = require('../config/config')
const utils = require('../utils')
const wechatApi = require('../wechatApi')const router = express.Router()
// 获取,验证access_token,存入redis中
// 路由之前,添加token
router.use((req, res, next) => {// 根据token从redis中获取access_tokenutils.get(config.wechat.token).then((data) => {// 获取到值--往下传递if (data) {return Promise.resolve(data)}// 没获取到值--从微信服务器端获取,并往下传递return wechatApi.updateAccessToken()}).then((data) => {// console.log(data);// 没有expire_in值--此data是redis中获取到的if (!data.expires_in) {// console.log('redis获取到值');req.accessToken = datanext()} else {// 有expire_in值--此data是微信端获取到的// console.log('redis中无值');// 保存到redis中,由于微信的access_token是7200秒过期,// 存到redis中的数据减少20秒,设置为7180秒过期utils.set(config.wechat.token, `${data.access_token}`, 7180).then((result) => {if (result === 'OK') {req.accessToken = data.access_tokennext()}})}})
})
module.exports = router复制代码

引入wechat模块

// ../routes/wechat.jsconst express = require('express')
const wechat = require('wechat')
const conf = require('../config/config')
const service = require('../service.js')const router = express.Router()
router.use(express.query())
const config = {token: conf.wechat.token,appid: conf.wechat.appID,appsecret: conf.wechat.appSecret,encodingAESKey: '',
}router.use('/', wechat(config, (req, res) => {const message = req.weixinconst {MsgType,} = messageswitch (MsgType) {case 'text': // 文本service.handleText(res, message.Content)breakdefault:res.reply('服务器内部错误,请重试')}
}))module.exports = router复制代码

开始测试

const createError = require('http-errors')
const express = require('express')
const path = require('path')
const cookieParser = require('cookie-parser')
const logger = require('morgan')
const indexRouter = require('./routes/index')
const wechatRouter = require('./routes/wechat')
const utils = require('./utils')
const config = require('./config/config.json')const app = express()// view engine setup
app.set('views', path.join(__dirname, 'views'))
app.set('view engine', 'jade')
app.use(logger('dev'))
app.use(express.json())
app.use(express.urlencoded({ extended: false }))
app.use(cookieParser())
app.use(express.static(path.join(__dirname, 'public')))
app.use(utils.sign(config)) // 接口配置和签名验证
app.use('/', indexRouter)
app.use('/wechat', wechatRouter)// catch 404 and forward to error handler
app.use((req, res, next) => {next(createError(404))
})// error handler
app.use((err, req, res) => {// set locals, only providing error in developmentres.locals.message = err.messageres.locals.error = req.app.get('env') === 'development' ? err : {}// render the error pageres.status(err.status || 500)res.render('error')
})
module.exports = app复制代码
  • 开启开发者服务
  • 填写接口配置信息
  • 结果

nodeJS 开发微信公众号相关推荐

  1. NodeJs开发微信公众号(一)

    古话说: 万事开头难, 回头细想想还真是这样,在没有开始做微信公众号开发之前我以为它很复杂,但是学过之后只想说原来just so so~ 这里是我的项目的github地址: https://githu ...

  2. Nodejs开发微信公众号中控服务

    本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. 本项目旨在为多个微信公众号 ...

  3. Nodejs开发微信公众号--获取access_token

    为了梳理代码,我单独给微信的接口进行了一些封装.这是前面认证接口的内容. 封装接口用到了request npm install --save request 封装的 js 结构大致是这样的 var r ...

  4. 教程: nodejs 做微信公众号开发,回复 xml 消息

    教程: nodejs 做微信公众号开发,回复 xml 消息 首先需要你的后台跟服务器已经可以建立连接,这个不再冗述看官方教程就好 接入指南 .此篇介绍的是如何获取用户发来的信息,并回复它. 一.接收 ...

  5. ❤️十分钟快速学会使用Nodejs全栈开发微信公众号【建议收藏】

    一.准备 注册微信订阅号 注册小程序测试号 sunny-ngrok工具安装及注册账号 注意:sunny-ngrok的原型是ngrok,不过ngrok是国外的,sunny-ngrok是国内的一个私服,速 ...

  6. 手把手教你如何使用NodeJs和JavaScript开发微信公众号

    大家作为前端可能活多或少的都写过结合微信jsdk开发的微信h5网页,对授权登录这块以及部分sdk可能都有通过后台接口来调用,那么大家有没有想过,这些后台接口都是怎么写的呢?那么今天这篇文章就带大家来了 ...

  7. SpringBoot开发微信公众号

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 在讲微信公众号开发之前,先来大概了解一下微信公众号.微信公 ...

  8. Java开发微信公众号(四)---微信服务器post消息体的接收及消息的处理

    在前几节文章中我们讲述了微信公众号环境的搭建.如何接入微信公众平台.以及微信服务器请求消息,响应消息,事件消息以及工具处理类的封装:接下来我们重点说一下-微信服务器post消息体的接收及消息的处理,这 ...

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

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

最新文章

  1. 68-95-99规则–以普通英语解释正态分布
  2. 使用特异性特征提取网络辅助分类任务
  3. Qt中使用C++的方式
  4. android 模拟飞行,安卓版模拟飞行 X Plane 9试玩
  5. 学了C语言,如何利用CURL写一个下载程序?—用nmake编译CURL并安装
  6. 后端数据操作超时_数据分析在知乎商业质量保障中的初步实践
  7. 免费GPU支持!口罩识别、安全帽识别算法赛同步开启,丰厚奖品等你来战!
  8. 去哪儿网笔试题——取出第一个重复的字符
  9. 档案信息化管理的最好解决方案
  10. Android RecyclerView(五)封装Holder与Adapter(Android 5.0 新特性)
  11. iptables的端口范围映射
  12. 前端链接共享(记录)
  13. mariadb配置允许远程访问方式
  14. spark-sql(spark sql cli)客户端集成hive
  15. 14道Python基础练习题(附答案)
  16. 字典攻击——彩虹表攻击与防御
  17. Java中native方法的使用
  18. Pr剪辑上分攻略 -- 动漫电影混剪
  19. 树莓派计算模块CM4 eMMC系统烧写、配置、相机连接
  20. 抽象类和具体类的区别

热门文章

  1. Java布尔类toString()方法及示例
  2. cobalt strick 4.0系列教程(3)---数据管理
  3. java 考试复习整理——JAVA类和类成员的修饰符
  4. 数据可视化【八】根据数据类型选择可视化方式
  5. Cow Contest——Floyed+连通性判断
  6. C++四种强制类型转换
  7. Linux中wait()函数及waitpid()函数
  8. 08-图7 公路村村通 (30 分
  9. 【C++ Primer | 16】std::move和std::forward、完美转发
  10. java基础教程第三版耿祥义,后台开发JAVA岗