nodeJS 开发微信公众号

准备测试公众号

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复制代码
  • 开启开发者服务

  • 填写接口配置信息

  • 结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/388434.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

单招计算机应用基础知识考试,四川邮电职业技术学院单招计算机应用基础考试大纲...

2021年高职单招升学一对一咨询小艺老师:18290437291(微信)四川邮电职业技术学院单招计算机应用基础考试大纲一、考试性质本技能考试是中等职业学校(含普通中专、职业高中、技工学校和成人中专)信息技术类专业毕业生参加四川邮电职业技术学院2016年单独招生考试。二、考试依据1.…

linux挂载磁盘阵列

linux挂载磁盘阵列 在许多项目中,都会把数据存放于磁盘阵列,以确保数据安全或者实现负载均衡。在初始安装数据库系统和数据恢复时,都需要先挂载磁盘阵列到系统中。本文记录一次在linux系统中挂载磁盘的操作步骤,以及注意事项。 此…

dedecms ---m站功能基础详解

织梦2015年6月8日更新后,就添加了很多针对手机移动端的设计,最大的设计就是添加了生成二维码的织梦标签和织梦手机模板功能,织梦更新后,默认的 default模板中就包含手机模板,所以我们可以给织梦网站设计双模板&#xf…

一个小菜鸟给未来的菜鸟们的一丢丢建议

写这篇文章的主要原因是有个建筑行业的朋友觉得搞建筑身累心累,想转到我们这个it行业来加入我们的编程大军中,找我咨询了一哈。在我了解了他的逻辑和理科这方面只是一般般的基础上,我给他的建议是:学习前端,而不是后端…

sql横着连接起来sql_SQL联接的简要介绍(到目前为止)

sql横着连接起来sqlSQL Join是什么意思? (What does a SQL Join mean?) A SQL join describes the process of merging rows in two different tables or files together.SQL连接描述了将两个不同表或文件中的行合并在一起的过程。 Rows of data are combined bas…

霸县计算机学校,廊坊中专排名2021

一、招生专业类别专业名称r制招生人政培养日标备注预备技师数控加工(中心操做工)340格养掌握先进敛p加ot知识,是部创新精神和较a空际操作能力,4了ftc71h0iwro感娶显型人于-宇缺毕让生培养具备电气白动化oirm和o技能,丛事电气设督安装、调试、…

《Python》进程收尾线程初识

一、数据共享 from multiprocessing import Manager 把所有实现了数据共享的比较便捷的类都重新又封装了一遍,并且在原有的multiprocessing基础上增加了新的机制list、dict 机制:支持的数据类型非常有限 list、dict都不是数据安全的,需要自己…

北京修复宕机故障之旅

2012-12-18日 下午开会探讨北京项目出现的一些问题,当时记录的问题是由可能因为有一定数量的客户上来后,就造成了Web服务器宕机,而且没有任何时间上的规律性,让我准备出差到北京,限定三天时间,以及准备测试…

计算机学院李世杰,有关办理2016级转专业学生相关手续通知

《有关办理2016级转专业学生相关手续通知》由会员分享,可在线阅读,更多相关《有关办理2016级转专业学生相关手续通知(4页珍藏版)》请在技术文库上搜索。1、1 关于办理 2016 级转专业学生相关手续的通知 各学院(部)、各相关部门: 根据西安科技…

一般线性模型和混合线性模型_从零开始的线性混合模型

一般线性模型和混合线性模型生命科学的数学统计和机器学习 (Mathematical Statistics and Machine Learning for Life Sciences) This is the eighteenth article from the column Mathematical Statistics and Machine Learning for Life Sciences where I try to explain som…

《企业私有云建设指南》-导读

内容简介第1章总结性地介绍了云计算的参考架构、典型解决方案架构和涉及的关键技术。 第2章从需求分析入手,详细讲解了私有云的技术选型、资源管理、监控和运维。 第3章从计算、网络、存储资源池等方面讲解了私有云的规划和建设,以及私有云建设的总体原则…

vs2005的webbrowser控件如何接收鼠标事件

这个问题来自论坛提问,vs2005的webbrowser控件如何接收鼠标事件,很多事情其实自己动动脑子就有办法的。主要是3步,给dom对象插入js脚本去响应鼠标-〉通过url跳转去通知webbrowser-〉截获跳转事件去c#中处理 示例代码: using System; using…

[TimLinux] Python 迭代器(iterator)和生成器(generator)

1. 可迭代对象 from collection import Iterableclass Iterable(metaclassABCMeta):...def __iter__(self): # 只实现了__iter__ 方法while False:yield None 能够在 for ... in obj:中使用的对象(obj)就是一个可迭代对象。 2. 迭代器 from …

太原冶金技师学院计算机系,山西冶金技师学院专业都有什么

山西冶金技师学院专业大全大家在考试之后对除了选择学校之外,还更关注专业的选择,山西冶金技师学院有哪些专业成了大家最为关心的问题。有些同学一般是选择好专业再选择自己满意的学校,下面小编将为你介绍山西冶金技师学院开设的专业及其哪些…

海南首例供港造血干细胞志愿者启程赴广东捐献

海南首例供港造血干细胞志愿者启程赴广东捐献。 张瑶 摄 海南首例供港造血干细胞志愿者启程赴广东捐献。 张瑶 摄 中新网海口1月23日电 (张茜翼 张瑶)海南省首例供港造血干细胞捐献者晶晶(化名)23日启程赴广东进行捐献,将于28号正式捐献采集造血干细胞,为…

如何击败Python的问题

Following the previous article written about solving Python dependencies, we will take a look at the quality of software. This article will cover “inspections” of software stacks and will link a free dataset available on Kaggle. Even though the title say…

KindEditor解决上传视频不能在手机端显示的问题

KindEditor自带的上传视频生成的HTML代码为<embed>&#xff0c;在手机端并不支持。于是可以自己在控件里增加生成video标签相关代码。 参考https://www.jianshu.com/p/047198ffed92。。 然而对着修改后没有成功&#xff0c;可能是那里没有改对吧。依然生成的是<embed&…

湖北经济学院的计算机是否强,graphics-ch11-真实感图形绘制_湖北经济学院:计算机图形学_ppt_大学课件预览_高等教育资讯网...

第十一章 真实感图形技术1,简单光照明模型2,多边形绘制方法3,透明4,整体观照明模型5,光线跟踪算法第十章 真实感图形绘制光照模型 (Illumination Model):计算某一点的光强度的模型11.1 真实感图形的 特点? 能反映物体表面颜色和亮度的细微变化? 能表现物体表面的质感? 能通过…

ARP攻击网络上不去,可以进行mac地址绑定

红色部分是需要敲的命令 Microsoft Windows [版本 6.1.7600] 版权所有 (c) 2009 Microsoft Corporation。保留所有权利。 C:\Users\dell>arp -s 显示和修改地址解析协议(ARP)使用的“IP 到物理”地址转换表。 ARP -s inet_addr eth_addr [if_addr] ARP -d inet_addr [if…

《独家记忆》见面会高甜宠粉 张超现场解锁隐藏技能

1月23日&#xff0c;由爱奇艺出品&#xff0c;小糖人联合出品的沉浸式成长练爱剧《独家记忆》在京举行粉丝见面会。爱奇艺高级副总裁陈宏嘉&#xff0c;爱奇艺副总裁、自制剧开发中心总经理、《独家记忆》总制片人戴莹&#xff0c;小糖人董事长、《独家记忆》总制片人朱振华&am…