一、前置准备
本指南使用Node.js + 微信云开发,无需购买服务器域名,适合0成本快速上线。
1.1 技术环境搭建
- 下载Node.js LTS版本:https://nodejs.org/zh-cn,安装时直接点“Next”默认完成
- 验证安装:打开CMD/PowerShell输入
node -v和npm -v,均显示版本号即成功
1.2 微信公众号准备
- 注册/登录已认证订阅号/服务号:未认证仅开放能力受限,建议优先服务号有更多消息触达机会,注册地址:https://mp.weixin.qq.com/
- 开通微信云开发:登录微信公众平台→左侧菜单栏「开发」→「云开发」→「开通」→选择免费基础版即可
二、微信云开发配置
2.1 创建云环境与数据库
- 进入云开发控制台→左侧「环境」→新建环境,环境ID复制备用,免费版最多建2个
- 左侧「数据库」→新建集合,命名为「user_points」,权限设为仅创建者可读写
- 再建「积分_logs」集合,权限设为仅创建者可读写
2.2 初始化云开发代码模板
在本地新建文件夹,命名为wx-points,打开CMD/PowerShell进入该目录,执行以下命令:
- 初始化npm:
npm init -y
- 安装微信云开发CLI:
npm install -g @cloudbase/cli
- 登录云开发:
tcb login,扫码完成登录
- 下载本地开发模板:
tcb init,按提示选择「node-starter」模板、刚创建的云环境ID
三、核心代码实现
3.1 数据库结构(user_points、积分_logs默认字段无需改,新增字段见下)
user_points核心字段(可在云开发控制台手动测试建第一条时批量开启字段权限):
- _openid(微信云开发自动生成,唯一标识用户)
- points(当前积分,默认0,Number类型)
积分_logs核心字段:
- _openid(关联用户)
- change(积分变化值,正数加,负数减,Number类型)
- reason(积分变动原因,String类型)
- create_time(变动时间,云开发自动生成的Date类型)
3.2 云函数开发
打开本地wx-points/functions目录,新建文件夹addPoints、reducePoints、getPoints三个云函数目录
每个云函数目录下执行npm install --save wx-server-sdk
addPoints云函数(index.js完整代码)
```javascript
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
exports.main = async (event, context) => {
const { _openid, change, reason } = event
try {
// 先查用户是否存在
const res = await db.collection('user_points').where({ _openid }).get()
if (res.data.length === 0) {
// 不存在则新增
await db.collection('user_points').add({
data: {
points: change
}
})
} else {
// 存在则更新
await db.collection('user_points').where({ _openid }).update({
data: {
points: db.command.inc(change)
}
})
}
// 记录日志
await db.collection('积分_logs').add({
data: {
change,
reason,
create_time: db.serverDate()
}
})
return { code: 0, msg: '积分增加成功' }
} catch (e) {
return { code: -1, msg: e.message }
}
}
```
reducePoints云函数(index.js完整代码)
```javascript
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
const _ = db.command
exports.main = async (event, context) => {
const { _openid, change, reason } = event
try {
// 先查当前积分是否足够
const res = await db.collection('user_points').where({ _openid, points: _.gte(change) }).get()
if (res.data.length === 0) {
return { code: 1, msg: '积分不足' }
}
// 更新积分
await db.collection('user_points').where({ _openid }).update({
data: {
points: _.inc(-change)
}
})
// 记录日志
await db.collection('积分_logs').add({
data: {
change: -change,
reason,
create_time: db.serverDate()
}
})
return { code: 0, msg: '积分扣减成功' }
} catch (e) {
return { code: -1, msg: e.message }
}
}
```
getPoints云函数(index.js完整代码)
```javascript
const cloud = require('wx-server-sdk')
cloud.init({
env: cloud.DYNAMIC_CURRENT_ENV
})
const db = cloud.database()
exports.main = async (event, context) => {
const { _openid } = event
try {
const userRes = await db.collection('user_points').where({ _openid }).get()
const logRes = await db.collection('积分_logs').where({ _openid }).orderBy('create_time', 'desc').limit(20).get()
return {
code: 0,
msg: '查询成功',
data: {
points: userRes.data[0]?.points || 0,
logs: logRes.data
}
}
} catch (e) {
return { code: -1, msg: e.message }
}
}
```
3.3 云函数部署

进入每个云函数目录,右键选择“在终端中打开”(或手动CMD进入),执行tcb functions:deploy 云函数名,按提示完成部署;三个云函数分别部署后,在云开发控制台「云函数」→「函数配置」→每个函数名→「权限设置」→勾选「允许任何来源调用」→「确定」
四、公众号前端对接
使用微信公众号「自定义菜单」链接到云开发静态托管页面,无需写复杂的前端代码,直接用云开发提供的「静态网站」模板快速生成积分查询、签到页面(签到默认+10分)
4.1 开通静态网站托管
进入云开发控制台→左侧「静态网站」→「开通」→免费基础版即可
4.2 上传静态页面
在本地新建index.html文件,内容如下:
```html
我的积分
当前积分:0
最近20条记录
```
将代码中的YOUR_ENV_ID替换为你的云环境ID,保存文件;进入云开发控制台「静态网站」→「文件管理」→「上传文件」,上传刚才的index.html,上传后点击文件右侧「预览」获取链接
4.3 公众号菜单配置
登录微信公众平台→左侧「功能」→「自定义菜单」→新建菜单「我的积分」,菜单内容选「跳转网页」,粘贴刚才的静态网站链接,点击「保存并发布」
五、测试与后续优化
5.1 测试
- 用个人微信扫码关注公众号,点击「我的积分」,签到查看积分是否增加、记录是否生成
- 可以自己测试其他积分规则,修改index.html中的签到按钮事件调用addPoints的参数,或新增云函数
5.2 后续优化方向
- 增加邀请好友、浏览文章等触发条件
- 云数据库防重复签到改成云函数判断(避免本地篡改)
- 增加积分兑换功能