共计 4121 个字符,预计需要花费 11 分钟才能阅读完成。
微信公众号开发概述
微信公众号开发是指基于微信公众平台提供的接口,实现公众号与用户之间的互动功能。所谓的 skill 应用,可以理解为公众号中具备特定交互能力的模块,比如自动回复、菜单跳转、消息处理等。通过开发这些 skill,我们可以让公众号具备更智能的交互能力。

为什么选择微信公众号开发
- 用户基数大:微信拥有庞大的用户群体,开发公众号可以快速触达大量用户。
- 开发门槛低:微信提供了完善的开发文档和接口,开发者可以快速上手。
- 功能丰富:从简单的文本回复到复杂的支付功能,微信公众平台提供了丰富的 API 支持。
开发前准备
1. 注册微信公众号
首先,你需要在 微信公众平台 注册一个公众号。推荐选择“订阅号”或“服务号”,前者适合内容发布,后者适合功能交互。
2. 服务器配置
微信公众号开发需要一个公网可访问的服务器,用于接收和处理微信服务器发送的消息。如果你还没有服务器,可以使用以下方法:
- 本地开发:使用 ngrok 将本地服务映射到公网。
- 云服务器:购买一台云服务器(如阿里云、腾讯云)。
3. 公众号后台设置
登录微信公众平台,进入“开发”->“基本配置”,完成以下设置:
- 服务器地址(URL):填写你的服务器地址,例如
https://yourdomain.com/wechat。 - Token:自定义一个 Token,用于验证消息来源。
- EncodingAESKey:随机生成一个加密密钥,用于消息加解密。
- 消息加解密方式:选择“安全模式”(推荐)或“明文模式”。
消息加解密原理与实现
微信公众平台使用 AES 加密算法对消息进行加解密,确保通信安全。以下是加解密的流程:
- 消息加密:微信服务器将消息加密后发送到你的服务器。
- 消息解密:你的服务器收到消息后,使用 EncodingAESKey 解密。
- 消息处理:处理解密后的消息,生成回复内容。
- 消息加密:将回复内容加密后返回给微信服务器。
Node.js 实现消息加解密
以下是使用 Node.js 实现消息加解密的示例代码:
const crypto = require('crypto');
// 验证消息签名
function verifySignature(token, signature, timestamp, nonce) {const str = [token, timestamp, nonce].sort().join('');
const sha1 = crypto.createHash('sha1').update(str).digest('hex');
return sha1 === signature;
}
// 解密消息
function decryptMessage(encodingAESKey, encryptedMsg) {const key = Buffer.from(encodingAESKey + '=', 'base64');
const iv = key.slice(0, 16);
const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
let decrypted = decipher.update(encryptedMsg, 'base64', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
基础消息交互开发
文本消息收发
微信公众号支持多种消息类型,如文本、图片、语音等。以下是处理文本消息的示例代码:
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.text({ type: '*/xml'}));
app.post('/wechat', (req, res) => {
// 解析 XML 消息
const xml = req.body;
const message = parseXML(xml);
// 处理文本消息
if (message.MsgType === 'text') {const reply = generateReply(message);
res.send(reply);
}
});
function parseXML(xml) {
// 解析 XML 消息为 JavaScript 对象
// 省略具体实现
}
function generateReply(message) {
// 生成回复消息
const reply = `<xml>
<ToUserName><![CDATA[${message.FromUserName}]]></ToUserName>
<FromUserName><![CDATA[${message.ToUserName}]]></FromUserName>
<CreateTime>${Math.floor(Date.now() / 1000)}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好,你发送的消息是:${message.Content}]]></Content>
</xml>`;
return reply;
}
完整 Node.js 示例代码
以下是一个完整的 Node.js 示例代码,实现了消息接收、解密、处理和回复功能:
const express = require('express');
const crypto = require('crypto');
const bodyParser = require('body-parser');
const app = express();
const TOKEN = 'your_token';
const ENCODING_AES_KEY = 'your_encoding_aes_key';
app.use(bodyParser.text({ type: '*/xml'}));
app.get('/wechat', (req, res) => {const { signature, timestamp, nonce, echostr} = req.query;
if (verifySignature(TOKEN, signature, timestamp, nonce)) {res.send(echostr);
} else {res.status(403).send('Invalid signature');
}
});
app.post('/wechat', (req, res) => {const { signature, timestamp, nonce} = req.query;
if (!verifySignature(TOKEN, signature, timestamp, nonce)) {return res.status(403).send('Invalid signature');
}
const xml = req.body;
const message = parseXML(xml);
const reply = generateReply(message);
res.send(reply);
});
function verifySignature(token, signature, timestamp, nonce) {const str = [token, timestamp, nonce].sort().join('');
const sha1 = crypto.createHash('sha1').update(str).digest('hex');
return sha1 === signature;
}
function parseXML(xml) {
// 解析 XML 消息为 JavaScript 对象
// 省略具体实现
}
function generateReply(message) {
// 生成回复消息
const reply = `<xml>
<ToUserName><![CDATA[${message.FromUserName}]]></ToUserName>
<FromUserName><![CDATA[${message.ToUserName}]]></FromUserName>
<CreateTime>${Math.floor(Date.now() / 1000)}</CreateTime>
<MsgType><![CDATA[text]]></MsgType>
<Content><![CDATA[你好,你发送的消息是:${message.Content}]]></Content>
</xml>`;
return reply;
}
app.listen(3000, () => {console.log('Server is running on http://localhost:3000');
});
常见问题排查指南
1. Token 验证失败
- 问题:在配置服务器时,Token 验证失败。
- 原因:Token 不一致或签名计算错误。
- 解决:确保公众号后台填写的 Token 与代码中的一致,并检查签名计算逻辑。
2. 消息无法解密
- 问题:收到消息后无法解密。
- 原因:EncodingAESKey 配置错误或解密逻辑有误。
- 解决:检查公众号后台的 EncodingAESKey,并确保解密逻辑正确。
3. 消息回复超时
- 问题:微信服务器未收到回复或回复超时。
- 原因:服务器响应时间过长或网络问题。
- 解决:优化服务器处理逻辑,确保在 5 秒内完成处理并返回响应。
进阶学习建议
1. 实现天气查询 skill
尝试扩展你的公众号功能,实现一个天气查询 skill。用户发送“天气 北京”,公众号返回北京的天气信息。你可以使用第三方天气 API(如和风天气)获取数据。
2. 自定义菜单
学习如何通过微信公众平台的接口创建自定义菜单,丰富公众号的交互方式。
3. 用户管理
了解如何通过微信接口获取用户信息,实现更个性化的服务。
总结
本文详细介绍了微信公众号开发的核心流程,包括公众号配置、消息加解密、基础消息交互等。通过本文的学习,你应该能够快速搭建一个具备基本交互能力的 skill 应用。接下来,你可以尝试扩展更多功能,如自定义菜单、用户管理等,让你的公众号更加智能和实用。
如果你在开发过程中遇到任何问题,可以参考 微信官方文档 或加入开发者社区寻求帮助。祝你开发顺利!
