走啊走
奋斗

轻应用服务器部署Node.js服务后如何对接微信小程序?

服务器价格表

在轻应用服务器部署 Node.js 服务后对接微信小程序,核心是完成服务端与微信服务器的双向通信,主要涉及以下关键步骤:


一、基础准备

  1. 注册小程序并获取凭证

    • 登录 微信公众平台 → 开发 → 开发管理 → 开发设置
    • 记录 AppIDAppSecret
    • 配置合法域名(如:https://your-domain.com)用于 request、上传下载等接口
  2. 部署 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 长期维护状态
日志脱敏 避免在日志中打印 openidsession_key 等敏感信息

四、常见坑点提醒

  • ❌ 未配置合法域名 → wx.request 报错“不合法的域名”
  • ❌ 服务器时间不同步 → 导致 signature 验证失败(如需签名校验)
  • ❌ 混淆 AppIDAppSecret → 登录必败
  • ⚠️ code 有效期仅 5 分钟,需及时请求;每个 code 只能使用一次

五、扩展能力(按需接入)

  • 模板消息推送(需用户订阅)
  • 微信支付(需商户号 + 支付证书)
  • 云开发直连(可绕过部分自建逻辑)
  • 微信客服消息(需绑定公众号)

需要我提供完整的 Express 项目模板(含登录、解密、JWT 中间件)或某一步的详细代码吗?