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 相关文章推荐
table行随鼠标移动变色示例
May 07 Javascript
JavaScript中window.open用法实例详解
Apr 15 Javascript
JavaScript实现简洁的俄罗斯方块完整实例
Mar 01 Javascript
JavaScript基础重点(必看)
Jul 09 Javascript
vue 实现 tomato timer(蕃茄钟)实例讲解
Jul 24 Javascript
js实现图片轮播效果学习笔记
Jul 26 Javascript
详解Webpack+Babel+React开发环境的搭建的方法步骤
Jan 09 Javascript
基于jQuery使用Ajax动态执行模糊查询功能
Jul 05 jQuery
Vue.js 十五分钟入门图文教程
Sep 12 Javascript
JS高阶函数原理与用法实例分析
Jan 15 Javascript
JS常见面试试题总结【去重、遍历、闭包、继承等】
Aug 27 Javascript
vue2.0 解决抽取公用js的问题
Jul 31 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
Extended CHM PHP 语法手册之 DIY
2006/10/09 PHP
PHP memcache在微信公众平台的应用方法示例
2017/09/13 PHP
JavaScript confirm选择判断
2008/10/18 Javascript
escape编码与unescape解码汉字出现乱码的解决方法
2014/07/02 Javascript
JavaScript实现生成GUID(全局统一标识符)
2014/09/05 Javascript
javascript实现仿腾讯游戏选择
2015/05/14 Javascript
JavaScript实现简单获取当前网页网址的方法
2015/11/09 Javascript
jQuery实现订单提交页发送短信功能前端处理方法
2016/07/04 Javascript
关于javascript的一些知识以及循环详解
2016/09/12 Javascript
js多个物体运动功能实例分析
2016/12/20 Javascript
vue+axios实现文件下载及vue中使用axios的实例
2018/09/21 Javascript
layUI的验证码功能及校验实例
2019/10/25 Javascript
JS中循环遍历数组的四种方式总结
2021/01/23 Javascript
Python实现给文件添加内容及得到文件信息的方法
2015/05/28 Python
Python探索之自定义实现线程池
2017/10/27 Python
Django项目开发中cookies和session的常用操作分析
2018/07/03 Python
浅析Python四种数据类型
2018/09/26 Python
基于numpy中数组元素的切片复制方法
2018/11/15 Python
在python中实现将一张图片剪切成四份的方法
2018/12/05 Python
实例详解Matlab 与 Python 的区别
2019/04/26 Python
python 函数中的内置函数及用法详解
2019/07/02 Python
Python的互斥锁与信号量详解
2019/09/12 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
python selenium xpath定位操作
2020/09/01 Python
python pip如何手动安装二进制包
2020/09/30 Python
浅析与CSS3的loading动画加载相关的transition优化
2015/05/18 HTML / CSS
CSS3中的@keyframes关键帧动画的选择器绑定
2016/06/13 HTML / CSS
HTML5 Web存储方式的localStorage和sessionStorage进行数据本地存储案例应用
2012/12/09 HTML / CSS
Ibood荷兰:互联网每日最佳在线优惠
2019/02/28 全球购物
希腊品牌鞋类销售网站:epapoutsia.gr
2020/03/18 全球购物
求职信模板标准格式范文
2014/02/23 职场文书
大学学风建设方案
2014/05/04 职场文书
红色故事汇观后感
2015/06/18 职场文书
大学生就业指导课心得体会
2016/01/15 职场文书
JavaScript实现简单拖拽效果
2021/09/15 Javascript
聊聊mysql都有哪几种分区方式
2022/04/13 MySQL