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设计模式之观察者模式的多个实现版本实例
Mar 03 Javascript
JS实现可自定义大小,可双击关闭的弹出层效果
Oct 16 Javascript
Node.js巧妙实现Web应用代码热更新
Oct 22 Javascript
Javascript闭包实例详解
Nov 29 Javascript
更高效的使用JQuery 这里总结了8个小技巧
Apr 13 Javascript
html5+javascript实现简单上传的注意细节
Apr 18 Javascript
js获取地址栏参数的两种方法
Jun 27 Javascript
vue+ElementUI实现订单页动态添加产品数据效果实例代码
Jul 13 Javascript
vue脚手架及vue-router基本使用
Apr 09 Javascript
深入浅出了解Node.js Streams
May 27 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
Jun 24 Javascript
AJAX实现省市县三级联动效果
Oct 16 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
zend framework配置操作数据库实例分析
2012/12/06 PHP
PHP+AJAX实现投票功能的方法
2015/09/28 PHP
PHP几个实用自定义函数小结
2016/01/25 PHP
基于Asp.net与Javascript控制的日期控件
2010/05/22 Javascript
腾讯与新浪的通过IP地址获取当前地理位置(省份)的接口
2010/07/26 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
javascript的propertyIsEnumerable()方法使用介绍
2014/04/09 Javascript
jQuery中[attribute]选择器用法实例
2014/12/31 Javascript
使用JavaScript+canvas实现图片裁剪
2015/01/30 Javascript
纯JS代码实现一键分享功能
2016/04/20 Javascript
js实现图片缓慢放大缩小效果
2016/08/02 Javascript
ionic实现滑动的三种方式
2016/08/27 Javascript
如何判断出一个js对象是否一个dom对象
2016/11/24 Javascript
用JavaScript实现让浏览器停止载入页面的方法
2017/01/19 Javascript
微信小程序 devtool隐藏的秘密
2017/01/21 Javascript
js控制文本框禁止输入特殊字符详解
2017/04/07 Javascript
微信小程序实现传递多个参数与事件处理
2019/08/12 Javascript
vue实现禁止浏览器记住密码功能的示例代码
2021/02/03 Vue.js
[43:53]OG vs EG 2019国际邀请赛淘汰赛 胜者组 BO3 第三场 8.22
2019/09/05 DOTA
利用Python的Flask框架来构建一个简单的数字商品支付解决方案
2015/03/31 Python
使用Python对微信好友进行数据分析
2018/06/27 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
2020/02/26 Python
CSS3实现闪烁动画效果的方法
2015/02/09 HTML / CSS
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
美津浓巴西官方网站:Mizuno巴西
2019/07/24 全球购物
买卖正宗运动鞋:GOAT
2019/12/06 全球购物
五年级数学教学反思
2014/02/11 职场文书
购房协议书范本
2014/10/02 职场文书
学生打架检讨书
2014/10/20 职场文书
设立有限责任公司出资协议书
2014/11/01 职场文书
现实表现材料范文
2014/12/23 职场文书
《清澈的湖水》教学反思
2016/02/17 职场文书
python 自动化偷懒的四个实用操作
2021/04/11 Python
vue实现水波涟漪效果的点击反馈指令
2021/05/31 Vue.js
如何在python中实现ECDSA你知道吗
2021/11/23 Python
MySql中的json_extract函数处理json字段详情
2022/06/05 MySQL