本系统旨在解决用户付费后自动变更权限并拉入高端社群的痛点。我们将采用Node.js (Express)作为后端框架,MongoDB存储用户状态,对接微信支付作为收款渠道,并通过企业微信API实现自动拉群。整个流程无需人工干预,完全自动化闭环。
核心业务流程如下:
首先需要在本地创建项目目录并安装必要的依赖包。请确保你的开发环境已经安装了 Node.js (v14+) 和 MongoDB。
打开终端,依次执行以下命令:
```bash mkdir community-upgrade-system cd community-upgrade-system npm init -y npm install express mongoose axios body-parser xml2js crypto ```依赖包说明:
在项目根目录下创建 models/User.js 文件。我们需要定义一个用户模型,用来记录用户的 OpenID、当前的 VIP 等级以及会员过期时间。
```javascript const mongoose = require('mongoose'); const UserSchema = new mongoose.Schema({ openid: { type: String, required: true, unique: true }, // 微信用户唯一标识 vipLevel: { type: Number, default: 0 }, // 0: 普通用户, 1: VIP用户 vipExpireAt: { type: Date }, // 会员过期时间 unionid: String, // 企业微信关联ID createdAt: { type: Date, default: Date.now } }); module.exports = mongoose.model('User', UserSchema); ```创建 config.js 文件,集中管理所有 API 密钥和配置信息。请将以下占位符替换为你自己在微信商户平台和企业微信后台获取的真实密钥。
```javascript module.exports = { // 数据库配置 MONGO_URI: 'mongodb://localhost:27017/community_upgrade', // 微信支付配置 WECHAT_PAY: { APPID: 'wxYourAppId', MCHID: '1234567890', // 商户号 KEY: 'your_merchant_key_32_bytes_long', // API密钥 NOTIFY_URL: 'https://your-domain.com/api/payment/callback' // 支付回调地址 }, // 企业微信配置 WORK_WECHAT: { CORPID: 'wwYourCorpId', AGENT_SECRET: 'your_agent_secret', // 通讯录管理Secret AGENTID: 1000001, // 应用ID VIP_CHAT_ID: 'wrYourChatId' // 目标付费群ID } }; ```创建 services/WeChatService.js,封装微信支付和企业微信的底层交互逻辑。
所有企业微信接口调用都需要携带 Access Token。
```javascript const axios = require('axios'); const config = require('../config'); let accessTokenCache = ''; let tokenExpireTime = 0; async function getWorkWechatToken() { const now = Date.now(); if (accessTokenCache && now < tokenExpireTime) { return accessTokenCache; } const url = `https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=${config.WORK_WECHAT.CORPID}&corpsecret=${config.WORK_WECHAT.AGENT_SECRET}`; const res = await axios.get(url); if (res.data.errcode === 0) { accessTokenCache = res.data.access_token; tokenExpireTime = now + (res.data.expires_in - 300) 1000; // 提前5分钟过期 return accessTokenCache; } else { throw new Error('获取Token失败: ' + JSON.stringify(res.data)); } } ```此函数负责将用户添加到配置文件中指定的 VIP 群。
```javascript async function inviteUserToChat(userId) { try { const token = await getWorkWechatToken(); const url = `https://qyapi.weixin.qq.com/cgi-bin/addressbook/add_member_into_chat?access_token=${token}`; const payload = { chatid: config.WORK_WECHAT.VIP_CHAT_ID, userlist: [userId] // 可以是数组,批量添加 }; const res = await axios.post(url, payload); if (res.data.errcode !== 0) { console.error('拉群失败:', res.data); return false; } return true; } catch (error) { console.error('拉群异常:', error); return false; } } module.exports = { getWorkWechatToken, inviteUserToChat }; ```创建 app.js,搭建 Express 服务器并处理支付成功的核心逻辑。这是整个系统的“心脏”。
```javascript const express = require('express'); const bodyParser = require('body-parser'); const mongoose = require('mongoose'); const xml2js = require('xml2js'); const crypto = require('crypto'); const User = require('./models/User'); const { inviteUserToChat } = require('./services/WeChatService'); const config = require('./config'); const app = express(); app.use(bodyParser.text({ type: '/xml' })); // 微信回调发送XML // 连接数据库 mongoose.connect(config.MONGO_URI) .then(() => console.log('MongoDB 连接成功')) .catch(err => console.error('MongoDB 连接失败', err)); // 辅助函数:生成微信支付签名 function getSign(params) { let keys = Object.keys(params).sort(); let str = ''; keys.forEach(key => { if (params[key] && key !== 'sign') { str += `${key}=${params[key]}&`; } }); str += `key=${config.WECHAT_PAY.KEY}`; return crypto.createHash('md5').update(str, 'utf8').digest('hex').toUpperCase(); } // 支付回调接口 app.post('/api/payment/callback', async (req, res) => { let xmlData = req.body; // 1. 解析XML xml2js.parseString(xmlData, { explicitArray: false }, async (err, result) => { if (err) return res.send('
由于微信支付回调必须指向公网可访问的 URL,而本地开发环境是局域网,我们需要使用内网穿透工具。推荐使用 Ngrok 或 花生壳。
1. 下载并安装 Ngrok。
2. 在终端执行命令映射本地 3000 端口:
```bash ngrok http 3000 ```3. 终端会显示一个 Forwarding URL,例如 https://abc1-23-45-67.ngrok.io。
4. 将此 URL 加上后缀 /api/payment/callback 填入 config.js 中的 NOTIFY_URL。
5. 确保你的企业微信应用中,该用户(OpenID对应的账号)已经在通讯录中,否则 inviteUserToChat 会因找不到用户而失败。
1. 签名验证一直失败?
检查 config.js 中的 KEY 是否正确,且结尾没有多余的空格。确保参数参与签名计算时,字段名按照字典序排列,且最后拼接了 key。
2. 拉群提示“userid not found”?
微信小程序的 OpenID 和企业微信的 UserID 是两套体系。你需要开发一个“绑定账号”的功能,将用户的 OpenID 与企业微信的 UserID 存入数据库的映射关系。在上述代码中,inviteUserToChat(openid) 需替换为 inviteUserToChat(user.workWechatUserId)。
3. 支付回调没有触发?
检查服务器防火墙是否开放 3000 端口,以及 Ngrok 的 HTTPS 隧道是否稳定。微信支付只支持 HTTPS 回调。
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图