起首github地点送上:https://github.com/xiadd/shorthand 迎接star?
近来又拾起了微信开辟,之前的民众号是用的flask举行开辟的,所以近来想要用nodejs改写一下,这些算是纪录吧,边写代码边写下这篇文章。
因为我对nodejs也并非那末的熟习,仅仅是新手的状况,假如有毛病的处所请指出。
文章最后会放出源码。民众号布置在leancloud,这里也会轻微引见一下leancloud的云引擎,轻易布置。
这部份文章触及的代码不多,多是东西的引见以及一个接入指南。
内网穿透
因为微信开辟的端口必需是80(近来貌似增加了443),所以一个内网穿透东西照样很有必要的。我个人运用的是qq浏览器微信调试东西。
我也引荐这个,毕竟一家的。
然则也有其他的挑选:
花生壳
这个速率还能够,然则只要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
布置到开辟环境(免费用户用不着)
云引擎简介
进入掌握台后如图所示:
存储是数据库,各个功用如名字所说。一些临时用不着的功用就不提了。
主如果云引擎这个选项,须要进入设置中设置好域名。
数据库
leancloud的数据库是一个半残的mongo,基本是够用的。文档在这js数据开辟
民众号的接入
我这边运用的是民众号测试号,因为个人申请到的定阅号的功用严峻缺失。
起首看微信文档
填写效劳器设置
也就上图的接口设置信息,url是你效劳布置的处所,图中的url是微信调试东西天生的,所以有些乱,token是随便填写的,注重下面照样要用到的,注重保留好。
考证效劳器地点的有效性
这里就是代码部份了。先上目次构造:
app
目次放营业逻辑代码。
config.js寄存相干设置,包含微信民众号的appId ,Token等
module.exports = {
'token': 'yourtoken',//设置中的token
'appId': 'your appid',//设置里的appid
'appSecret': 'your appsecret'//设置中的appsecret
};
注:这部份引自微信民众平台文档
开辟者提交信息后,微信效劳器将发送GET要求到填写的效劳器地点URL上,GET要求照顾参数以下表所示:
者经由过程磨练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也是能够胜利的,不过背面的要求就不太好办了?)。
如许来讲接入应当就算是胜利了。