前言
我是一名全栈工程师,因工作需要学了一下微信公众号开发,学习的同时我也希望把我学到的知识分享给大家,以及我所遇到的坑. 后台我主要是NodeJs,我的目的不是教大家如何写NodeJs所以大家需要的话可以去网上自己学一下.
微信公众号测试号
因为公众号注册是有一定的门槛,所以推荐大家申请一个微信公众号测试号.
申请入口: 微信公众号测试号申请
(我问你答)工作原理
微信用户
发送了 " hi " 给微信服务器
微信服务器
又转发给了我们自己写的配置服务器
.配置服务器
做出相应的处理,并给微信服务器
做出响应.- 如果
微信服务器
在五秒内得不到配置服务器
的回应,它会尝试重新发送.总共试3次.如果都没有响应则向微信用户反馈"该公众号提供的服务出现故障,请稍后再试". 微信服务器
得到配置服务器
的响应之后,再转发给微信用户
.
从上面我们可以看得出,
微信服务器
与配置服务器
之间是需要连接通讯的,我们需要给微信服务器
提供一个可以访问我们服务器的办法. 也就是公网ip
。 因为我们是在本地写代码,没有公网IP,唯一的办法就是将本地IP映射到外网.
内网穿透
为了本地开发方便,同学们可以下载一款叫花生壳
的软件.它可以将我们本地IP地址映射到公网上,并给我们分配了一个域名.微信服务器可以通过域名与我们本地的配置服务器通信.
填写服务器配置
将配置服务器接口填到URL的位置,token可以随便写,但必须保持与后台配置的token一致.
创建node工程
- 创建项目
创建一个文件夹,名字随便起. 我就叫WechatServe
- 配置文件
根目录下创建config.json
文件,里面是我们的存放我们的配置信息
{
"token": "wechat"
}
appId
与appSecret
字段的内容必须与测试号信息里面保持一致,token
也要与接口配置信息里面的token
保持一致.
- 创建node应用
创建app.js
文件,关于一些中间件的导入我就不详细说了,大家自行添加.
const Express =require('express')
const app = Express();
// 监听的端口必须与你映射到公网的端口一致.
app.listen(3000);
验证微信
开发者提交配置信息后,微信服务器将发送GET请求到填写的服务器地址URL上.所以我们要实现这个接口.
wechat.js
--------------------------------------
const sha1 = require("sha1");
const Wechat = function(config) {
// 拿出配置文件内容
this.token = config.token;
/*
*
* 验证微信
*/
Wechat.prototype.auth = function(ctx) {
//这么做是为了省去req req.query...
let { query } = ctx;
// 拿出里面的内容
//微信加密签名 == 通过 时间戳+随机数+token 生成的
let signature = query.signature; //query.signature 等价与 req.query.signature
// 时间戳
let timestamp = query.timestamp;
//随机数
let nonce = query.nonce;
// 随机字符串
let echostr = query.echostr;
console.log(this.token);
let arr = [this.token, timestamp, nonce];
let str = arr.sort().join("");
// 使用 sha1加密
let resultCode = sha1(str);
//如果后端的加密签名与前端加密签名结果一致则成功
if (resultCode === signature) {
// 验证成功 返回echostr
ctx.body = echostr;
} else {
// 验证失败
console.log("微信验证失败!");
}
};
};
module.exports = Wechat;
app.js
-------------------------
const Koa = require("koa");
const Router=require('koa-router')
const config = require("./config.json");
const Wechat = require("./wechat/wechat.js");
const app = new Koa();
const router=new Router();
let wechatApp = new Wechat(config);
router.get('/',async ctx=>{
wechatApp.auth(ctx);
})
app.use(router.routes());
app.use(router.allowedMethods());
app.listen(3000);
点击提交配置,提示配置成功说明我们成功了.
完整代码: https://github.com/hyz0421/WechatServe.git 记得给个星星噢
有问题可以加我 vx: wxid_e4923mikekfd22