在轻量应用服务器上安装 Node.js 后,对接微信小程序 API 是一个常见的开发任务。以下是详细的步骤和示例代码,帮助你完成从环境搭建到与微信 API 通信的全过程。
✅ 一、准备工作
-
确保 Node.js 已安装
node -v npm -v如果未安装,请参考官方文档或使用
nvm安装合适版本(推荐 v16+ 或 v18+)。 -
创建项目目录
mkdir wx-api-server cd wx-api-server npm init -y -
安装依赖
推荐使用 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);
}
});
}
});
✅ 六、安全建议
- 不要暴露
session_key给前端,它应仅用于后端解密。 - 使用 HTTPS(可通过 Nginx + SSL 证书实现)。
- 对接微信支付、订阅消息等功能时,需验证签名。
- 使用 JWT 生成自定义登录态,替代原始
openid直接传递。
✅ 七、进阶功能(可选)
| 功能 | 实现方式 |
|---|---|
| 获取用户手机号 | 调用 getPhoneNumber 解密 |
| 发送订阅消息 | 使用 access_token 调用微信推送接口 |
| 云开发替代方案 | 可考虑使用微信云开发减少后端压力 |
✅ 总结
你在轻量应用服务器上完成以下几步即可对接微信小程序 API:
- 安装 Node.js 和 Express
- 创建登录接口
/api/login换取openid - 实现数据解密接口(如手机号)
- 小程序前端调用你的服务器接口
- 做好安全防护(HTTPS、敏感信息保护)
如有具体需求(如支付、模板消息),可继续扩展接口。
需要我提供 Nginx 配置 HTTPS 或 Docker 部署方案 吗?欢迎继续提问!
CLOUD技术笔记