nodejs微信开辟---接入指南

起首github地点送上:https://github.com/xiadd/shorthand 迎接star?
近来又拾起了微信开辟,之前的民众号是用的flask举行开辟的,所以近来想要用nodejs改写一下,这些算是纪录吧,边写代码边写下这篇文章。
因为我对nodejs也并非那末的熟习,仅仅是新手的状况,假如有毛病的处所请指出。
文章最后会放出源码。民众号布置在leancloud,这里也会轻微引见一下leancloud的云引擎,轻易布置。
这部份文章触及的代码不多,多是东西的引见以及一个接入指南。

内网穿透

因为微信开辟的端口必需是80(近来貌似增加了443),所以一个内网穿透东西照样很有必要的。我个人运用的是qq浏览器微信调试东西。

《nodejs微信开辟---接入指南》
我也引荐这个,毕竟一家的。
然则也有其他的挑选:

  1. 花生壳
    这个速率还能够,然则只要window客户端的,貌似还能够折腾路由器那里的东西,我也没深切折腾。

  2. nat123
    与花生壳相似,然则速率实在不太给力。常常设置毛病。说是免费然则须要预充几块钱进去,不是很引荐。

  3. 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也是能够胜利的,不过背面的要求就不太好办了?)。
如许来讲接入应当就算是胜利了。

    原文作者:xiadd
    原文地址: https://segmentfault.com/a/1190000005856154
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞