一、引言
微信公众号作为当前最流行的社交媒体平台之一,为企业和个人提供了与粉丝互动、传播信息的绝佳渠道。而Node.js作为一种高效、轻量级的JavaScript运行环境,非常适合用于微信公众号开发。本文将详细介绍如何使用Node.js开发微信公众号,帮助开发者快速上手。
二、准备工作
在开始开发之前,我们需要准备以下工具和材料:
- Node.js环境:确保你的计算机上已经安装了Node.js和npm(Node Package Manager)。
- 微信公众号测试号:在微信公众平台申请一个测试号,用于开发和测试。
- 编辑器:选择一个你喜欢的代码编辑器,如Visual Studio Code、Sublime Text等。
三、服务器配置
- 填写服务器配置
登录微信公众平台官网后,在公众平台官网的开发-基本设置页面,勾选协议成为开发者,点击“修改配置”按钮,填写服务器地址(URL)、Token和EncodingAESKey。其中,URL是开发者用来接收微信消息和事件的接口URL;Token可由开发者任意填写,用作生成签名(该Token会和接口URL中包含的Token进行比对,从而验证安全性);EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。
同时,开发者可选择消息加解密方式:明文模式、兼容模式和安全模式。模式的选择与服务器配置在提交后都会立即生效,请开发者谨慎填写及选择。加解密方式的默认状态为明文模式,选择兼容模式和安全模式需要提前配置好相关加解密代码。
注意:URL字段填写一个接口,不能是IP地址,而且域名必须指向80端口,需要后端配合,能够响应微信发送的验证。如果接口异常无法配置成功,可以使用natapp等基于ngrok的域名映射工具。
- 验证服务器地址的有效性
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数包括signature、timestamp、nonce和echostr。开发者需要对signature进行校验,确认此次GET请求来自微信服务器。校验方式如下:
(1)将token、timestamp、nonce三个参数进行字典序排序; (2)将三个参数字符串拼接成一个字符串进行sha1加密; (3)获得加密后的字符串可与signature对比,标识该请求来源于微信。
若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功;否则接入失败。
以下是一个Node.js示例代码,用于验证服务器地址的有效性:
const express = require('express');
const crypto = require('crypto');
const app = express();
const port = 3000;
const token = 'your_token'; // 填写你的Token
app.get('/wechat', (req, res) => {
const signature = req.query.signature;
const timestamp = req.query.timestamp;
const nonce = req.query.nonce;
const echostr = req.query.echostr;
// 校验signature
const arr = [token, timestamp, nonce].sort();
const str = arr.join('');
const sha1 = crypto.createHash('sha1');
sha1.update(str);
const result = sha1.digest('hex');
if (result === signature) {
res.send(echostr);
} else {
res.send('error');
}
});
app.listen(port, () => {
console.log(`Server running at http://localhost:${port}/`);
});
将上述代码保存为一个JavaScript文件,并在终端中运行该文件。然后,在微信公众平台的服务器配置页面填写你的服务器地址(如http://localhost:3000/wechat
)、Token和EncodingAESKey,点击提交。如果配置成功,你将看到“接入成功”的提示。
四、消息处理
- 接收消息
当粉丝向公众号发送消息时,微信服务器会将消息推送到开发者填写的服务器地址上。消息包括文本消息、图片消息、语音消息、视频消息等。开发者需要根据消息类型进行相应的处理。
以下是一个接收文本消息的示例代码:
app.post('/wechat', express.json(), (req, res) => {
const msgType = req.body.MsgType;
const fromUserName = req.body.FromUserName;
const toUserName = req.body.ToUserName;
const content = req.body.Content;
if (msgType === 'text') {
// 处理文本消息
const replyMsg = `您发送的文本消息是:${content}`;
const replyXml = `
<xml>
<ToUserName><![CDATA[${fromUserName}]]></ToUserName>
<FromUserName><![CDATA[${toUserName}]]></FromUserName>
<CreateTime>${Math.floor(Date.now() / 1000)}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[${replyMsg}]]></Content>
</xml>
`;
res.send(replyXml);
} else {
// 处理其他类型的消息
res.send('success');
}
});
在上述代码中,我们使用express.json()
中间件来解析POST请求的JSON数据。然后,根据MsgType
字段判断消息类型,并进行相应的处理。对于文本消息,我们构造一个回复消息,并将其以XML格式发送给微信服务器。
- 发送消息
开发者也可以主动向粉丝发送消息,包括文本消息、图片消息、语音消息等。以下是一个发送文本消息的示例代码:
const accessToken = 'your_access_token'; // 填写你的access_token
const sendTextMessage = (toUserName, content) => {
const url = `https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=${accessToken}`;
const data = {
"touser": toUserName,
"msgtype": "text",
"text": {
"content": content
}
};
axios.post(url, data)
.then(response => {
console.log('消息发送成功', response.data);
})
.catch(error => {
console.error('消息发送失败', error);
});
};
// 调用发送消息函数
sendTextMessage('user_open_id', '这是一条测试消息');
在上述代码中,我们使用axios库向微信服务器发送POST请求,发送文本消息给指定的粉丝。注意,access_token
是调用微信API的凭证,需要定期获取和更新。你可以使用微信提供的API接口获取access_token
。
五、菜单设置
微信公众号还支持自定义菜单功能,开发者可以根据自己的需求设置菜单项和菜单事件。以下是一个设置自定义菜单的示例代码:
const createMenu = () => {
const accessToken = 'your_access_token'; // 填写你的access_token
const url = `https://api.weixin.qq.com/cgi-bin/menu/create?access_token=${accessToken}`;
const data = {
"button": [
{
"type": "click",
"name": "今日歌曲",
"key": "V1001_TODAY_MUSIC"
},
{
"type": "view",
"name": "官网",
"url": "http://www.example.com"
},
{
"name": "菜单",
"sub_button": [
{
"type": "click",
"name": "搜索",
"key": "V1002_TODAY_NEWS"
},
{
"type": "view",
"name": "视频",
"url": "http://www.qq.com"
},
{
"type": "click",
"name": "赞一下我们",
"key": "V1003_GOOD"
}
]
}
]
};
axios.post(url, data)
.then(response => {
console.log('菜单设置成功', response.data);
})
.catch(error => {
console.error('菜单设置失败', error);
});
};
// 调用设置菜单函数
createMenu();
在上述代码中,我们使用axios库向微信服务器发送POST请求,设置自定义菜单。菜单项包括点击事件和跳转链接两种类型。你可以根据自己的需求设置不同的菜单项和菜单事件。
六、总结
本文详细介绍了如何使用Node.js开发微信公众号,包括服务器配置、消息处理、菜单设置