轻量应用服务器安装Node.js后如何对接微信小程序API?

在轻量应用服务器上安装 Node.js 后,对接微信小程序 API 是一个常见的开发任务。以下是详细的步骤和示例代码,帮助你完成从环境搭建到与微信 API 通信的全过程。


✅ 一、准备工作

  1. 确保 Node.js 已安装

    node -v
    npm -v

    如果未安装,请参考官方文档或使用 nvm 安装合适版本(推荐 v16+ 或 v18+)。

  2. 创建项目目录

    mkdir wx-api-server
    cd wx-api-server
    npm init -y
  3. 安装依赖
    推荐使用 Express 框架快速搭建 HTTP 服务:

    npm install express cors axios dotenv

✅ 二、获取微信小程序配置信息

进入 微信公众平台 获取以下信息:

  • AppID(小程序 ID)
  • AppSecret(小程序密钥)

⚠️ 注意:AppSecret 非常敏感,不要泄露,也不要写死在前端代码中!


✅ 三、搭建后端服务(Express 示例)

1. 创建 server.js

const express = require('express');
const axios = require('axios');
require('dotenv').config();

const app = express();
app.use(express.json());
app.use(require('cors')()); // 允许跨域(仅开发环境)

// 微信 API 基础地址
const WECHAT_URL = 'https://api.weixin.qq.com';

// 获取 access_token(通常用于后续调用如发送模板消息等)
app.get('/api/get-access-token', async (req, res) => {
  const { APPID, APPSECRET } = process.env;

  try {
    const url = `${WECHAT_URL}/cgi-bin/token`;
    const params = {
      grant_type: 'client_credential',
     appid: APPID,
      secret: APPSECRET
    };

    const response = await axios.get(url, { params });

    if (response.data.access_token) {
      res.json({
        success: true,
        data: response.data
      });
    } else {
      res.status(500).json({
        success: false,
        error: response.data
      });
    }
  } catch (error) {
    res.status(500).json({ success: false, error: error.message });
  }
});

// 登录接口:通过 code 换取 openid 和 session_key
app.post('/api/login', async (req, res) => {
  const { code } = req.body;
  const { APPID, APPSECRET } = process.env;

  if (!code) {
    return res.status(400).json({ error: '缺少 code' });
  }

  try {
    const url = `${WECHAT_URL}/sns/jscode2session`;
    const params = {
      appid: APPID,
      secret: APPSECRET,
      js_code: code,
      grant_type: 'authorization_code'
    };

    const response = await axios.get(url, { params });

    const { openid, session_key, unionid, errcode, errmsg } = response.data;

    if (errcode) {
      return res.status(400).json({ error: errmsg, code: errcode });
    }

    // 此处可保存用户信息到数据库(如 MongoDB/MySQL)
    // 并生成自定义登录态 token(如 JWT)

    res.json({
      success: true,
      openid,
      session_key, // 注意:不要返回给前端!只用于后端解密
      unionid
    });
  } catch (error) {
    res.status(500).json({ error: error.message });
  }
});

// 示例:解密用户加密数据(如手机号、昵称等)
const crypto = require('crypto');
app.post('/api/decrypt-data', (req, res) => {
  const { encryptedData, iv, sessionKey } = req.body;

  if (!encryptedData || !iv || !sessionKey) {
    return res.status(400).json({ error: '参数缺失' });
  }

  let decoded;
  try {
    const sessionBuf = Buffer.from(sessionKey, 'base64');
    const ivBuf = Buffer.from(iv, 'base64');
    const encryptedBuf = Buffer.from(encryptedData, 'base64');

    const decipher = crypto.createDecipheriv('aes-128-cbc', sessionBuf, ivBuf);
    decipher.setAutoPadding(true);

    let decodedStr = decipher.update(encryptedBuf, null, 'utf8');
    decodedStr += decipher.final('utf8');

    decoded = JSON.parse(decodedStr);
  } catch (err) {
    return res.status(400).json({ error: '解密失败', detail: err.message });
  }

  res.json({ success: true, data: decoded });
});

// 启动服务
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
  console.log(`Server running at http://localhost:${PORT}`);
});

2. 创建 .env 文件(存储敏感信息)

APPID=your_appid_here
APPSECRET=your_appsecret_here
PORT=3000

使用 dotenv 加载环境变量,避免硬编码。


✅ 四、启动服务

node server.js

确保服务器防火墙开放对应端口(如 3000),并在云控制台配置安全组规则允许访问。


✅ 五、小程序端调用示例(wx.request)

// 小程序页面中
wx.login({
  success: (res) => {
    const code = res.code;
    wx.request({
      url: 'http://your-server-ip:3000/api/login',
      method: 'POST',
      data: { code },
      success: (res) => {
        if (res.data.success) {
          console.log('登录成功', res.data.openid);
          // 存储 openid 或自定义 token
        } else {
          console.error('登录失败', res.data.error);
        }
      },
      fail: (err) => {
        console.error('请求失败', err);
      }
    });
  }
});

✅ 六、安全建议

  1. 不要暴露 session_key 给前端,它应仅用于后端解密。
  2. 使用 HTTPS(可通过 Nginx + SSL 证书实现)。
  3. 对接微信支付、订阅消息等功能时,需验证签名。
  4. 使用 JWT 生成自定义登录态,替代原始 openid 直接传递。

✅ 七、进阶功能(可选)

功能 实现方式
获取用户手机号 调用 getPhoneNumber 解密
发送订阅消息 使用 access_token 调用微信推送接口
云开发替代方案 可考虑使用微信云开发减少后端压力

✅ 总结

你在轻量应用服务器上完成以下几步即可对接微信小程序 API:

  1. 安装 Node.js 和 Express
  2. 创建登录接口 /api/login 换取 openid
  3. 实现数据解密接口(如手机号)
  4. 小程序前端调用你的服务器接口
  5. 做好安全防护(HTTPS、敏感信息保护)

如有具体需求(如支付、模板消息),可继续扩展接口。

需要我提供 Nginx 配置 HTTPSDocker 部署方案 吗?欢迎继续提问!