俗话说,万事开头难。对于刚刚接触微信公众号开发的小白来说,进行服务器验证往往难住了一大片开发者。在这里记录一下我的验证方法,希望能帮助到大家!
根据微信公众平台的接入指南,先把准备工作做完:有自己的服务器,且已配置域名可以访问,我是在 nodejs 环境下进行开发的,使用的 express 框架,所以你还要安装好 nodejs 环境和 express 框架;
接下来我们看具体怎么操作:
先看一下目录结构:
- 创建 config 配置文件
在项目跟目录创建 config 目录,在该目录下新建 config.json 文件:
{
"wechat": {
"appID": "wxab83a07fab75f836",
"appSecret": "8e42ec4e0b959f5e228a77ccb0f9e45d",
"token": "weixin"
}
}
- 封装签名认证模块
在项目根目录新建 common 目录,在该目录下新建 utils.js 文件,根据 接入指南 需要对 token、timestamp、nonce 三个参数字典序排序拼接成的字符串进行 sha1 加密,所以我们需要先安装 sha1 依赖模块:
npm install sha1 --save
然后在 utils.js 文件中引入:
let utils = {}
const sha1 = require('sha1')
// 微信开发者服务器验证模块中间件
utils.sign = function(config) {
return function(req, res, next) {
config = config || {}
let query = req.query,
token = config.wechat.token, // 从 config 配置文件中获取 token
signature = query.signature, // 微信加密签名
nonce = query.nonce, // 随机数
timestamp = query.timestamp, // 时间戳
echostr = query.echostr // 随机字符串
/**
* 1)将 token、timestamp、nonce 三个参数进行字典序排序
* 2)将三个参数字符串拼接成一个字符串进行 sha1 加密
* 3)开发者获得加密后的字符串可与 signature 对比,标识该请求来源于微信
*/
let ttnStr = [token, timestamp, nonce].sort().join(''),
shaStr = sha1(ttnStr)
if(req.method === 'GET') {
if(shaStr === signature) {
res.send(echostr)
}else{
res.send('This GET request is not from WeChat server.')
}
} else if(req.method == 'POST'){
if(shaStr != signature) {
return
}
next()
}
}
}
module.exports = utils
- 引入服务器验证模块中间件
在 app.js 中引入 utils.js 和 config.json,然后使用验证模块中间件:
const express = require('express')
// 引入 utils.js 和 config.json
const config = require('./config/config.json')
const utils = require('./common/utils')
const app = express()
app.use(express.query())
// 定义路由并使用微信开发者服务器验证模块中间件
app.use('/', utils.sign(config))
app.listen(3000)
- 运行 node 服务,然后在公众号后台进行服务器的配置验证;
为了方便调试,可以申请微信公众平台测试号,使用测试号进行接口配置,需要注意的是使用测试号进行调试的时候记得将 config.json 文件中的 appID 和 appSecret 修改为测试号的信息,token 也要和测试号的接口配置信息一栏中的 token 保持一致。