在轻量应用服务器(如腾讯云 Lighthouse、阿里云轻量等)上安装 Node.js 后对接微信小程序 API,核心是用服务端代码调用微信接口(小程序端不能直接调用需要密钥的接口)。以下是完整流程:
一、前置准备
- 注册并认证微信小程序
- 获取
AppID和AppSecret(在微信公众平台 → 开发 → 开发设置中查看)
- 获取
- 配置服务器域名
- 在微信公众平台 → 开发 → 开发设置 → 服务器域名中,添加你的轻量服务器 IP 或域名(需 HTTPS + 有效证书)
- 安装依赖
npm init -y npm install express axios https node-fetch --save # 若需处理签名/加密,可额外安装 crypto-js 等
二、后端核心逻辑(以 Express 为例)
1. 创建基础服务 (server.js)
const express = require('express');
const axios = require('axios');
const app = express();
app.use(express.json());
const APP_ID = 'your_appid';
const APP_SECRET = 'your_appsecret';
const BASE_URL = 'https://api.weixin.qq.com';
// 登录凭证校验 & 获取 openid
app.post('/auth/login', async (req, res) => {
const { code } = req.body; // 前端通过 wx.login() 获取
if (!code) return res.status(400).json({ error: '缺少 code' });
try {
// 第一步:用 code 换取 session_key + openid
const loginRes = await axios.get(`${BASE_URL}/sns/jscode2session`, {
params: {
appid: APP_ID,
secret: APP_SECRET,
js_code: code,
grant_type: 'authorization_code'
}
});
const { session_key, openid, errcode, errmsg } = loginRes.data;
if (errcode) throw new Error(errmsg);
// 第二步:将 openid + session_key 存入 Redis/数据库(会话管理)
// 此处简化示例:直接返回给前端(生产环境务必做安全校验!)
res.json({ success: true, openid, session_key });
} catch (e) {
console.error(e);
res.status(500).json({ error: e.message });
}
});
// 示例:调用微信支付预下单接口(需配合支付流程)
app.post('/pay/createOrder', async (req, res) => {
const { openid, amount, description } = req.body;
try {
// 1. 先获取 access_token(带缓存优化更佳)
const tokenRes = await axios.get(`${BASE_URL}/cgi-bin/token`, {
params: {
grant_type: 'client_credential',
appid: APP_ID,
secret: APP_SECRET
}
});
const access_token = tokenRes.data.access_token;
// 2. 调用统一下单接口
const orderRes = await axios.post(
`${BASE_URL}/pay/unifiedorder`,
{
appid: APP_ID,
mch_id: 'your_mch_id', // 商户号
nonce_str: generateNonce(),
sign: '', // 需按规则生成签名
body: description,
out_trade_no: generateOrderId(),
total_fee: amount * 100, // 单位:分
spbill_create_ip: req.ip,
notify_url: 'https://your-domain.com/pay/notify',
trade_type: 'JSAPI'
},
{ headers: { 'Content-Type': 'application/json' } }
);
res.json(orderRes.data);
} catch (e) {
res.status(500).json({ error: e.response?.data || e.message });
}
});
function generateNonce() {
return Math.random().toString(36).slice(-16);
}
function generateOrderId() {
return Date.now().toString(36) + Math.random().toString(36).slice(-8);
}
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
🔐 重要安全提示:
AppSecret永远不要暴露在客户端或 Git 仓库中!使用环境变量(.env+dotenv)- 所有接口必须走 HTTPS(轻量服务器需自行申请 SSL 证书或使用 Let’s Encrypt)
- 对敏感操作(如支付、用户信息)增加签名验证与防重放机制
三、前端小程序调用示例(login.js)
Page({
onLoad() {
this.doLogin();
},
doLogin() {
wx.login({
success: (res) => {
if (res.code) {
fetch('https://your-domain.com/auth/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code: res.code })
})
.then(r => r.json())
.then(data => {
if (data.success) {
// 存储 openid/session_key 到本地(如 localStorage),后续请求携带
wx.setStorageSync('openid', data.openid);
this.bindUserInfo(); // 如需获取头像昵称,再用 session_key 解密
} else {
wx.showToast({ title: '登录失败', icon: 'none' });
}
});
}
}
});
}
});
四、常见问题排查
| 问题 | 解决方案 |
|---|---|
invalid code |
检查 code 是否过期(仅能用一次,5 分钟内有效);确认前端 wx.login() 成功 |
invalid appid / secret |
核对 AppID/AppSecret 大小写、无空格;确认未修改过 |
| 域名未备案/无 HTTPS | 轻量服务器需绑定域名 + 部署 Nginx + 申请 SSL 证书(推荐 certbot) |
| 签名错误 | 严格按 微信官方文档 生成 MD5/HMAC-SHA256 签名 |
五、进阶建议
- ✅ 使用 Redis 缓存
access_token(有效期 2 小时) - ✅ 接入 云函数(如腾讯云 SCF、阿里云 FC)替代自建服务器,免运维且天然支持 HTTPS
- ✅ 使用
wechat-api或miniprogram-cloud-sdk等封装库减少重复代码 - ✅ 开启防火墙仅开放 443/80 端口,其他端口禁止公网访问
需要我提供:
- 完整的 Dockerfile 部署方案?
- Nginx + SSL 自动续期配置?
- 用户信息解密(手机号/头像)的具体实现?
欢迎告诉我你的具体场景,我可进一步定制代码。
CLOUD云枢