Node.js开发第三方微信公众平台


Posted in Javascript onJune 05, 2017

一、写在前面的话

  Node.js是一个开放源代码、跨平台的JavaScript语言运行环境,采用Google开发的V8运行代码,使用事件驱动、非阻塞和异步输入输出模型等技术来提高性能,可优化应用程序的传输量和规模。这些技术通常用于数据密集的事实应用程序。——来自维基百科

  最近花了差不多近一个月的时间去学习Node.js,由于它的代码语言是 Javascript ,因此对于语法上就没有过多的去研究,毕竟做过Web开发的程序员,很少有不会Javascript的。而写这篇文章,也只是为了


Node.js开发第三方微信公众平台

如有不正确的地方,希望大家指正。

二、准备工作

  在正式开始码代码之前,我们需要准备以下东西:

搭建 Node 环境。Node的安装过程太过简单,网上也有太多的教程,大家可以自行百度;申请微信公众号,同样这里也不做介绍,大家自行百度。服务器和域名。打开Node.js中文网文档 打开 微信开发者文档 三、接入微信公众平台 1.创建Node.js 项目

  首先我们在电脑的任意磁盘上创建文件夹,命名随意,我这命名为 wechat;

  随后在文件夹中创建两个文件,一个是config.json,另一个为app.js。如下图所示:
Node.js开发第三方微信公众平台

PS:这里我的 IDE 是 VSCode,各位可随意使用自己喜欢的 IDE。

  为了后续功能的扩展,我加入了Express框架,具体操作如下:

电脑打开运行界面,快捷键为:win+R,输入cmd后回车,进入dos界面,输入命令

npm install -g express

进行全局安装;由于 Express 自 4.x 版本中将命令工具分离出来,因此还需要输入下一个命令

npm install -g express-generator@4

安装成功后,在dos界面中输入以下 命令

express -h

结果如下图所示:

Node.js开发第三方微信公众平台

Node.js开发第三方微信公众平台

什么?你的运行结果提示:express不是内部或外部命令。那你必须要检查一下安装 node.js 的时候有没有添加环境变量。点击<a href="http://jingyan.baidu.com/article/1876c8529c79e2890b1376dd.html?st=2&net_type=&bd_page_type=1&os=0&rst=&word=WWWDHZJS.ORG" target="_blank">解决express不是内部或外部命令问题

2.微信文档步骤

  如果在没有考虑清楚之前,就开始码代码的话,这样做是非常危险的。我们先打开微信文档,点击 开始开发 中的 接入指南,如图:

Node.js开发第三方微信公众平台

跳过第一步,直接看第二步,如图:

Node.js开发第三方微信公众平台

正如帮助文档所说的那样,我们总结以四个步骤:

获取微信服务器Get请求的参数 signature、timestamp、nonce、echostr 将token、timestamp、nonce三个参数进行字典序排序将三个参数字符串拼接成一个字符串进行sha1加密开发者获得加密后的字符串可与signature对比,标识该请求来源于微信 3.接入功能的实现

   整理好思路后我们就按照上一节的步骤去实现。首先我们在打开 config.json 文件,输入以下内容:

{
 "token":"wechat"
}
   config.json 文件是我们程序的配置文件,在后面的文章中,我们会将程序名称、微信定义的参数名称、请求地址等配置内容存放在该文件中。

   打开 app.js 文件,该文件属于我们程序的入口,在文件启动及以后路由配置都是再次实现的,首先我们导入重要的模块:

const express = require('express'), //express 框架 
  crypto = require('crypto'), //引入加密模块
  config = require('./config');//引入配置文件
上面的代码不难理解,require 就是导入模块的意思。这里主要针对我们自定义的config.json文件讲解一下:
 "./" 表示与 app.js 在同一及目录下,为什么要这么写呢?原因很简单就是在我们通过 npm 命令安装模块时,如果我们指定了全局安装,也就是 -g,安装后的文件则会保存在我们 node.js 安装路径下的 node_modules 文件夹中;同理,我们不指定全局安装,安装后的文件则会保存在我们安装命令输入时所在的文件夹根目录下的 node_modules 文件夹中,此时如果没有该文件,系统会自动创建。

 这里我们都是使用 require 去导入模块的,node.js 怎么分辨系统模块和我们自定义的模块呢,聪明的你一定想到了,没错就是 "./" 这个,如果你不想用它的话,你也可以把自定义的模块文件移到 node_modules 文件夹中。

 require 是通过模块名称去导入模块文件的,因此在引入的时候不需要写入文件的后缀名。如果两个文件重名,但后缀名不同, require 会按照 Node.js 的加载优先级顺序进行导入,即 js文件 > json文件 > node文件。


Node.js开发第三方微信公众平台

 实际上就是这么简单,我们也就不再纠结这个问题,继续下面的工作。

   实例 express 以及 创建服务器

//实例 express
var app = express();
//用于处理所有进入 3000 端口 get 的连接请求
app.get('/',function(req,res){
 //对请求连接返回内容
 res.send("Hello Node.js");
});
//监听3000端口
app.listen(3000);
  上面的代码通过注释,我们就能明白其意思,这里我就不再做细致的讲解。再次进入 dos 界面,通过命令进入我们项目的文件的根目录下,如图:

Node.js开发第三方微信公众平台

输入命令,启动我们的Node.js项目

node app.js

启动成功后,我们打开浏览器输入地址:http://localhost:3000 访问我们的node.js项目,如图

Node.js开发第三方微信公众平台

Node.js开发第三方微信公众平台

小技巧 :

  在每次更改完 node.js 项目后,我们都需要先将 node.js停止(快捷键: Ctrl+C),然后再通过命令再次运行,这样特别麻烦。这里我推荐使用 supervisor 工具,npm 安装命令为:npm install -g supervisor。这样我们启动 node.js 项目命令改为 supervisor app.js,更改项目后只需要保存,刷新浏览器页面就可以得到更改后的结果了。

  完成上面的工作后,我们就可以正式开始写接入微信公众平台的主要代码,废话不多说直接贴代码

Node.js开发第三方微信公众平台
const express = require('express'), //express 框架 
  crypto = require('crypto'), //引入加密模块
  config = require('./config');//引入配置文件

var app = express();//实例express框架

//用于处理所有进入 3000 端口 get 的连接请求
app.get('/',function(req,res){
 //1.获取微信服务器Get请求的参数 signature、timestamp、nonce、echostr
 var signature = req.query.signature,//微信加密签名
  timestamp = req.query.timestamp,//时间戳
   nonce = req.query.nonce,//随机数
   echostr = req.query.echostr;//随机字符串

 //2.将token、timestamp、nonce三个参数进行字典序排序
 var array = [config.token,timestamp,nonce];
 array.sort();

 //3.将三个参数字符串拼接成一个字符串进行sha1加密
 var tempStr = array.join('');
 const hashCode = crypto.createHash('sha1'); //创建加密类型 
 var resultCode = hashCode.update(tempStr,'utf8').digest('hex'); //对传入的字符串进行加密

 //4.开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
 if(resultCode === signature){
  res.send(echostr);
 }else{
  res.send('mismatch');
 }
});

//监听3000端口
app.listen(3000);

4.部署项目

   完成了代码后我们就可以把项目发布到外网上了,这里我用的是花生壳内网映射外网的软件,各位可以随意使用其他工具。

1.打开花生壳的软件,点击内网穿透:

Node.js开发第三方微信公众平台

2.点击添加映射

Node.js开发第三方微信公众平台

3.配置映射

Node.js开发第三方微信公众平台

  由于微信只接受80端口,我们在映射类型选择为 网站80端口;内网主机就是我们电脑的 IP 地址;内网端口号就是node.js的监听端口;点击确定后,就成功映射到外网了,可以通过花生壳提供的域名进行访问。

5.接入验证

  再次进入微信公众平台在左侧菜单点击基本配置,如图:

Node.js开发第三方微信公众平台

Node.js开发第三方微信公众平台

点击修改配置。其中服务器地址,就是我们外网映射的地址;令牌(Token)就是我们在 config.json 文件中 定义的 token 值;消息加密可以点击随机生成按钮,当然你也可以随便定义;消息加解密方式这块可以随便选择,这里我就使用默认的,如图:

Node.js开发第三方微信公众平台

Node.js开发第三方微信公众平台

  点击提交按钮,提示 提交成功,那么我就要祝贺你了

Node.js开发第三方微信公众平台

你已经成功的步入了Node.js开发微信的开发的第一步。

   GITHUB源代码:https://github.com/SilenceHVK/wechatByNode 。对文章有不正确之处,请给予纠正。github源代码请顺手给个 Star,最后感谢您的阅读。

Javascript 相关文章推荐
javascript 播放器 控制
Jan 22 Javascript
javascript实现的listview效果
Apr 28 Javascript
jquery $.ajax()取xml数据的小问题解决方法
Nov 20 Javascript
jQuery JSON实现无刷新三级联动实例探讨
May 28 Javascript
JS Map 和 List 的简单实现代码
Jul 08 Javascript
JavaScript?Apple设备检测示例代码
Nov 15 Javascript
Angularjs使用指令做表单校验的方法
Mar 31 Javascript
vuejs 单文件组件.vue 文件的使用
Jul 28 Javascript
Vue2实时监听表单变化的示例讲解
Aug 30 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
Nov 13 Javascript
Vue.js样式动态绑定实现小结
Jan 24 Javascript
node.js监听文件变化的实现方法
Apr 17 Javascript
js自定义Tab选项卡效果
Jun 05 #Javascript
纯js实现动态时间显示
Sep 07 #Javascript
深入理解Angular.JS中的Scope继承
Jun 04 #Javascript
yarn的使用与升级Node.js的方法详解
Jun 04 #Javascript
npm国内镜像 安装失败的几种解决方案
Jun 04 #Javascript
Angular 4依赖注入学习教程之InjectToken的使用(八)
Jun 04 #Javascript
Angular 4依赖注入学习教程之ValueProvider的使用(七)
Jun 04 #Javascript
You might like
php 搜索框提示(自动完成)实例代码
2012/02/05 PHP
PHP中的生成XML文件的4种方法分享
2012/10/06 PHP
PHP生成短网址的3种方法代码实例
2014/07/08 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
TP框架实现上传一张图片和批量上传图片的方法分析
2020/04/23 PHP
AJAX使用了UpdatePanel后无法使用alert弹出脚本
2010/04/02 Javascript
JavaScript学习点滴 call、apply的区别
2010/10/22 Javascript
javascript中数组的定义及使用实例
2015/01/21 Javascript
jQuery简单tab切换效果实现方法
2015/04/08 Javascript
Angular中ng-bind和ng-model的区别实例详解
2017/04/10 Javascript
Angular4学习笔记之实现绑定和分包
2017/08/01 Javascript
JS实现的贪吃蛇游戏完整实例
2019/01/18 Javascript
layui加载表格,绑定新增,编辑删除,查看按钮事件的例子
2019/09/06 Javascript
Vue.js 无限滚动列表性能优化方案
2019/12/02 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
[01:06:42]VP vs NewBee Supermajor 胜者组 BO3 第二场 6.5
2018/06/06 DOTA
用python 制作图片转pdf工具
2015/01/30 Python
Python标准异常和异常处理详解
2015/02/02 Python
Python实现读取文件最后n行的方法
2017/02/23 Python
python操作redis方法总结
2018/06/06 Python
vue学习笔记之动态组件和v-once指令简单示例
2020/02/29 Python
美国大码时尚女装购物网站:ELOQUII
2017/12/28 全球购物
机械专业应届生求职信
2013/09/21 职场文书
服务行业个人求职的自我评价
2013/12/12 职场文书
政法大学毕业生自荐信范文
2014/01/01 职场文书
初中体育教学反思
2014/01/14 职场文书
2014年五四青年节演讲比赛方案
2014/04/22 职场文书
党的群众路线教育实践活动心得体会范文
2014/11/05 职场文书
2015公务员试用期工作总结
2014/12/12 职场文书
2016年社区植树节活动总结
2016/03/16 职场文书
文书工作总结(范文)
2019/07/11 职场文书
解决go在函数退出后子协程的退出问题
2021/04/30 Golang
JavaScript实现简单计时器
2021/06/22 Javascript
dubbo集成zipkin获取Traceid的实现
2021/07/26 Java/Android
mysql使用instr达到in(字符串)的效果
2022/04/03 MySQL
postgresql如何找到表中重复数据的行并删除
2023/05/08 MySQL