在轻应用服务器部署 Node.js 服务后对接微信小程序,核心是完成服务端与微信服务器的双向通信,主要涉及以下关键步骤:
一、基础准备
-
注册小程序并获取凭证
- 登录 微信公众平台 → 开发 → 开发管理 → 开发设置
- 记录
AppID和AppSecret - 配置合法域名(如:
https://your-domain.com)用于request、上传下载等接口
-
部署 Node.js 服务
- 使用 Express/Koa/NestJS 等框架搭建 HTTPS 服务(必须支持 HTTPS)
- 确保服务器能访问公网(或X_X工具如 ngrok 仅用于测试)
二、核心对接流程
1. 获取临时登录凭证 code(前端发起)
- 小程序端调用
wx.login()获取code - 将
code发送给你的 Node.js 后端
// 前端示例
wx.login({
success: (res) => {
if (res.code) {
fetch('/api/login', {
method: 'POST',
body: JSON.stringify({ code: res.code })
});
}
}
});
2. 后端用 code + AppID + AppSecret 换取 openid
- 调用微信接口:
GET https://api.weixin.qq.com/sns/jscode2session
// Node.js 后端示例(Express)
app.post('/api/login', async (req, res) => {
const { code } = req.body;
const appId = process.env.APP_ID;
const appSecret = process.env.APP_SECRET;
const url = `https://api.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${appSecret}&js_code=${code}&grant_type=authorization_code`;
try {
const response = await axios.get(url);
const { openid, session_key } = response.data;
// 生成自定义 token(可选但推荐)
const token = jwt.sign({ openid }, process.env.JWT_SECRET, { expiresIn: '7d' });
res.json({ token, openid });
} catch (err) {
console.error('微信登录失败:', err.response?.data || err.message);
res.status(500).json({ error: '登录失败' });
}
});
✅ 注意:
session_key可用于解密用户敏感数据(见下文),建议不要直接返回给前端。
3. 处理用户授权(手机号/头像昵称)
- 若需获取用户信息,需引导用户点击按钮触发授权(
button open-type="getPhoneNumber") - 后端用
encryptedData+iv+session_key解密明文(Node.js 需用crypto模块)
function decryptUserData(encryptedData, iv, sessionKey) {
const decipher = crypto.createDecipheriv('aes-128-cbc', Buffer.from(sessionKey, 'base64'), Buffer.from(iv, 'base64'));
let decrypted = decipher.update(encryptedData, 'base64', 'utf8');
decrypted += decipher.final('utf8');
return JSON.parse(decrypted);
}
三、安全与最佳实践
| 项目 | 建议 |
|---|---|
| HTTPS | 生产环境必须启用 HTTPS(自签名证书无效) |
| 密钥管理 | AppSecret、JWT 密钥等放入环境变量,勿硬编码 |
| 防重放攻击 | 对 code 做一次性校验(Redis 存储已使用过的 code) |
| 会话管理 | 优先使用自定义 JWT 替代 session_key 长期维护状态 |
| 日志脱敏 | 避免在日志中打印 openid、session_key 等敏感信息 |
四、常见坑点提醒
- ❌ 未配置合法域名 →
wx.request报错“不合法的域名” - ❌ 服务器时间不同步 → 导致
signature验证失败(如需签名校验) - ❌ 混淆
AppID和AppSecret→ 登录必败 - ⚠️
code有效期仅 5 分钟,需及时请求;每个code只能使用一次
五、扩展能力(按需接入)
- 模板消息推送(需用户订阅)
- 微信支付(需商户号 + 支付证书)
- 云开发直连(可绕过部分自建逻辑)
- 微信客服消息(需绑定公众号)
需要我提供完整的 Express 项目模板(含登录、解密、JWT 中间件)或某一步的详细代码吗?
CLOUD云计算