nodejs微信开发之接入指南


Posted in NodeJs onMarch 17, 2019

最近又拾起了微信开发,之前的公众号是用的flask进行开发的,所以最近想要用nodejs改写一下,这些算是记录吧,边写代码边写下这篇文章。

因为我对nodejs也并不是那么的熟悉,仅仅是新手的状态,如果有错误的地方请指出。

文章最后会放出源码。公众号部署在leancloud,这里也会稍微介绍一下leancloud的云引擎,方便部署。

这部分文章涉及的代码不多,多是工具的介绍以及一个接入指南。

内网穿透

由于微信开发的端口必须是80(最近貌似增加了443),所以一个内网穿透工具还是很有必要的。我个人使用的是qq浏览器微信调试工具。

nodejs微信开发之接入指南
我也推荐这个,毕竟一家的。
但是也有其他的选择:

花生壳
这个速度还可以,但是只有window客户端的,貌似还可以折腾路由器那边的东西,我也没深入折腾。

nat123
与花生壳类似,但是速度着实不太给力。经常配置错误。说是免费但是需要预充几块钱进去,不是很推荐。

ngrok
一个开源软件,可以自己在服务器上部署也可以使用现成的,其实qq浏览器的微信调试就是基于这个搭建的。算是比较好用的。

leancloud

为什么使用leancloud,其实是我没太接触其他的云服务,也无从比较,另外一个就是heroku,但是国内的访问速度感人。
leancloud应该是一个类似parse(其实parse我也不是很了解hhhh)的服务,但还提供了托管web的云引擎。包括python和nodejs两种,这里介绍nodejs的引擎。云引擎入门的话请看leancloud云引擎入门,毕竟比我讲的强多了。
对于个人开发者,leancloud算是免费的,限制不是很大,但是貌似最近出了个实名认证,但是没认证好像也没啥问题。但是对于面试用户,如果应用没有请求,就是睡眠,所以如果应用打不开多试两次就行了,极有可能是睡眠了。

常用命令

lean new新建项目
lean app add [appname] [appid] 关联项目到leancloud 云引擎
lean up 启动服务
lean deploy部署应用(貌似收费用户是部署到测试环境)
lean publish部署到开发环境(免费用户用不着)

云引擎简介

进入控制台后如图所示:

nodejs微信开发之接入指南

存储是数据库,各个功能如名字所说。一些暂时用不着的功能就不提了。

主要是云引擎这个选项,需要进入设置中配置好域名。

nodejs微信开发之接入指南

数据库

leancloud的数据库是一个半残的mongo,基本是够用的。文档在这js数据开发

公众号的接入

我这边使用的是公众号测试号,因为个人申请到的订阅号的功能严重缺失。

首先看微信文档

nodejs微信开发之接入指南

填写服务器配置

nodejs微信开发之接入指南

也就上图的接口配置信息,url是你服务部署的地方,图中的url是微信调试工具生成的,所以有些乱,token是随意填写的,注意下面还是要用到的,注意保存好。

验证服务器地址的有效性

这里就是代码部分了。先上目录结构:

nodejs微信开发之接入指南

app目录放业务逻辑代码。

config.js存放相关配置,包括微信公众号的appId ,Token等

module.exports = {
 'token': 'yourtoken',//配置中的token
 'appId': 'your appid',//配置里的appid
 'appSecret': 'your appsecret'//配置中的appsecret
};

注:这部分引自微信公众平台文档

开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

nodejs微信开发之接入指南

通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信

这部分的代码如下:

const crypto = require('crypto');
const path = require('path');
const url = require('url');

//import config
const config = require('../../config');

//进行sha1加密
function sha1(str) {
 var shasum = crypto.createHash("sha1");
 shasum.update(str);
 str = shasum.digest("hex");
 return str;
}

function wechatAuth(req, res) {
 var query = url.parse(req.url, true).query;
 var signature = query.signature;
 var echostr = query.echostr;
 var timestamp = query['timestamp'];
 var nonce = query.nonce;

 var reqArray = [nonce, timestamp, config.token];

 //对数组进行字典排序
 reqArray.sort();
 var sortStr = reqArray.join('');//连接数组
 var sha1Str = sha1(sortStr);

 if (signature === sha1Str) {
  res.end(echostr);
 } else {
  res.end("false");
  console.log("授权失败!");
 }
}

module.exports = wechatAuth;

相信代码说的总是比我清楚,首先获取请求url中的四个参数,对nonce,timestamp, 和token进行字典排序也就是Array.sort(),然后进行字符串拼接,进行sha1加密,如果结果和signature相等则成功,(顺便说一句,其实直接返回echostr也是可以成功的,不过后面的请求就不太好办了?)。

这样来说接入应该就算是成功了。

首先github地址奉上:https://github.com/xiadd/shorthand

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

NodeJs 相关文章推荐
NodeJs基本语法和类型
Feb 13 NodeJs
nodejs实现HTTPS发起POST请求
Apr 23 NodeJs
Nodejs Stream 数据流使用手册
Apr 17 NodeJs
NodeJS与HTML5相结合实现拖拽多个文件上传到服务器的实现方法
Jul 26 NodeJs
Nodejs进阶:基于express+multer的文件上传实例
Nov 21 NodeJs
nodejs根据ip数组在百度地图中进行定位
Mar 06 NodeJs
Nodejs下使用gm圆形裁剪并合成图片的示例
Feb 22 NodeJs
原生nodejs使用websocket代码分享
Apr 07 NodeJs
nodejs实现套接字服务功能详解
Jun 21 NodeJs
PHPStorm中如何对nodejs项目进行单元测试详解
Feb 28 NodeJs
Nodejs封装类似express框架的路由实例详解
Jan 05 NodeJs
nodejs各种姿势断点调试的方法
Jun 18 NodeJs
nodejs微信开发之授权登录+获取用户信息
Mar 17 #NodeJs
详解nodejs 开发企业微信第三方应用入门教程
Mar 12 #NodeJs
详解NodeJS Https HSM双向认证实现
Mar 12 #NodeJs
NodeJs入门教程之定时器和队列
Mar 08 #NodeJs
nodejs npm错误Error:UNKNOWN:unknown error,mkdir 'D:\Develop\nodejs\node_global'at Error
Mar 02 #NodeJs
nodejs同步调用获取mysql数据时遇到的大坑
Mar 02 #NodeJs
Nodejs中怎么实现函数的串行执行
Mar 02 #NodeJs
You might like
php学习笔记 面向对象中[接口]与[多态性]的应用
2011/06/16 PHP
浅谈PHP表单提交(POST&GET&URL编/解码)
2017/04/03 PHP
IE中radio 或checkbox的checked属性初始状态下不能选中显示问题
2009/07/25 Javascript
js null,undefined,字符串小结
2010/08/21 Javascript
jquery如何判断表格同一列不同行input数据是否重复
2014/05/14 Javascript
让javascript加载速度倍增的方法(解决JS加载速度慢的问题)
2014/12/12 Javascript
推荐一个自己用的封装好的javascript插件
2015/01/29 Javascript
javascript实现tab切换的两个实例
2015/11/05 Javascript
jQuery flip插件实现的翻牌效果示例【附demo源码下载】
2016/09/20 Javascript
D3.js中强制异步文件读取同步的几种方法
2017/02/06 Javascript
JavaScript生成图形验证码
2020/08/24 Javascript
详解Vue微信公众号开发踩坑全记录
2017/08/21 Javascript
详解React Native开源时间日期选择器组件(react-native-datetime)
2017/09/13 Javascript
jQuery EasyUI Layout实现tabs标签的实例
2017/09/26 jQuery
Angular5中调用第三方库及jQuery的添加的方法
2018/06/07 jQuery
微信小程序之裁剪图片成圆形的实现代码
2018/10/11 Javascript
Python time模块详解(常用函数实例讲解,非常好)
2014/04/24 Python
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
Python构造自定义方法来美化字典结构输出的示例
2016/06/16 Python
python使用for循环计算0-100的整数的和方法
2019/02/01 Python
利用Python实现微信找房机器人实例教程
2019/03/10 Python
python爬虫 Pyppeteer使用方法解析
2019/09/28 Python
Keras Convolution1D与Convolution2D区别说明
2020/05/22 Python
CSS3实现伪类hover离开时平滑过渡效果示例
2017/08/10 HTML / CSS
详解Canvas事件绑定
2018/06/27 HTML / CSS
美国网上花店:JustFlowers
2017/02/12 全球购物
美国打印机墨水和碳粉购物网站:QuikShip Toner
2018/08/29 全球购物
Mankind美国/加拿大:英国领先的男士美容护发用品公司
2018/12/05 全球购物
学年自我鉴定范文
2013/10/01 职场文书
建筑专业自我鉴定
2013/10/22 职场文书
日语专业个人求职信范文
2014/02/02 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
期末个人总结范文
2015/02/13 职场文书
幼儿园科学课教学反思
2016/03/03 职场文书
Python基础之数据结构详解
2021/04/28 Python
Matlab如何实现矩阵复制扩充
2021/06/02 Python