跟着做,大约 10 分钟。全程免费,不用买服务器,不用备案。
打开「终端 / PowerShell」,进到项目目录,然后跑一行命令:
cd "C:\Users\lenovo\AppData\Roaming\Microsoft\Windows\Start Menu\starheart"
node scripts/server.mjs --lan
看到这样的输出就成功了:
✦ 星心 · StarHeart 本地服务已启动
────────────────────────────────────────────
本机打开 : http://127.0.0.1:8080/
贺卡效果 : http://127.0.0.1:8080/c/?to=小美&msg=生日快乐
定制页面 : http://127.0.0.1:8080/customize.html
出单后台 : http://127.0.0.1:8080/admin/
部署教程 : http://127.0.0.1:8080/guide.html
手机访问 : http://192.168.x.x:8080/
在浏览器里打开 http://127.0.0.1:8080/ 就能看到了。不要直接双击 html 文件打开 —— 双击走的是 file:// 协议,浏览器的安全策略会拦住 ES 模块和 fetch,页面会白屏。必须用上面这个命令起服务。
你们这台电脑自动选中的端口是 …,上面那些地址请以实际输出为准。
node scripts/server.mjs --port 3000
贺卡是发给手机看的,所以一定要先在真实手机上过一遍。
--lan 的输出:终端里会直接打印一个二维码,手机相机扫一下就打开了。http://192.168.x.x:8080/。192.168 开头的地址就是。
手机上重点看三件事:① 爱心是不是立体的、完整的;② 名字和祝福语位置对不对;③ 点「点亮这片星空」有没有音乐。
如果你想现在马上把链接发给别人看,而不想先去注册 Cloudflare,用这一招:
cd "C:\Users\lenovo\AppData\Roaming\Microsoft\Windows\Start Menu\starheart"
node scripts/share.mjs
它会一次性做两件事:起本地服务 + 建一条公网隧道。大约 10 秒后你会看到:
══════════════════════════════════════════════════════════
✦ 可以打开了
══════════════════════════════════════════════════════════
公网链接(发给谁都能开): https://xxxx-xxxx-xxxx.trycloudflare.com
本机链接 : http://127.0.0.1:8080/
手机同 WiFi 链接 : http://192.168.x.x:8080/
贺卡效果 : https://xxxx.trycloudflare.com/c/?to=小美&msg=生日快乐
那条 https://....trycloudflare.com 就是真链接,任何人有网就能打开,
不需要密码、不需要登录。
什么时候该用哪个:
| 目的 | 用哪个 | 链接长什么样 |
|---|---|---|
| 自己看效果 | node scripts/server.mjs --lan | http://127.0.0.1:8080/ |
| 手机测真机 | node scripts/server.mjs --lan + 扫终端二维码 | http://192.168.x.x:8080/ |
| 临时发给别人看 | node scripts/share.mjs | https://xxx.trycloudflare.com |
| 正式卖东西 | 下面的方案 A(Cloudflare Pages) | https://你的域名.pages.dev |
如果提示找不到 cloudflared,先跑一次 node scripts/download-cloudflared.mjs 把它下载下来(约 50MB)。
上面那条临时链接只适合试水。要真的开始卖,必须走这一步 —— 得到的链接永久有效、不依赖你的电脑开着、还能绑自己的域名。
site 目录)。
cd "C:\Users\lenovo\AppData\Roaming\Microsoft\Windows\Start Menu\starheart"
node scripts/build.mjs
跑完会生成 starheart\dist\starheart.zip。
不用点后台、不用拖文件,直接调 Cloudflare 官方接口。你只需要一个 API Token:
cd "C:\Users\lenovo\AppData\Roaming\Microsoft\Windows\Start Menu\starheart"
set CF_API_TOKEN=你刚才复制的token
node scripts/deploy-cloudflare.mjs --project starheart跑完会直接打印你的永久链接,例如 https://starheart.pages.dev。
--dry-run。
为什么不是我随手上传一下就完事?
因为 Cloudflare 的接口有个坑:每个文件的资源键是
blake3(base64(内容) + 扩展名)[:32],不是普通的 SHA-256。
算错了不会报错 —— 上传成功、部署成功、文件数也对,但线上每个文件都 404。
所以脚本里自带了一个 BLAKE3 实现,并且用官方 35 组测试向量逐条验证过
(node scripts/test-blake3.mjs)。
优点:免费、不限制流量、自带 HTTPS、国内访问相对稳。不需要 git,不需要命令行。
starheart,这个会变成你的网址前缀。starheart 文件夹里的 site 文件夹整个拖进去(或者把 dist\starheart.zip 解压后拖里面的内容)。index.html、c、assets、data 这些的上一层目录里的内容,不要多套一层文件夹。https://starheart-xxx.pages.dev 的地址 —— 这就是你的真链接。验证:打开 https://你的域名/c/?to=小美&msg=生日快乐,手机上能看能听,就成了。
优点:真的只要拖一下,连注册都可以后补。缺点:国内访问速度不如 Cloudflare。
site 文件夹直接拖到页面中间的虚线框里。https://random-name-123.netlify.app 的链接。优点:完全免费、可以版本管理。缺点:国内访问偶尔慢,需要注册 GitHub。
starheart,选 Public,点 Create。site 文件夹里的所有内容拖进去,点 Commit changes。main + / (root),点 Save。https://你的用户名.github.io/starheart/。/starheart/)。项目里所有路径都写成相对路径了,所以能正常工作;
但如果你以后自己改了某个路径写成 /assets/...(前面带斜杠),在 GitHub Pages 上就会 404。
https://love.你的域名.com/c/?... 这种链接了。祝福语一长,链接就会很长(二维码也可能放不下)。三个办法:
项目里已经放了两张占位图(故意画成不能扫的样子),你要把它们换成真的:
wechat-pay.png。alipay-pay.png。starheart\site\assets\pay\ 目录里。然后打开 定制页,滑到第 ④ 步,就能看到你自己的收款码了。
data/config.json 里的 payment.local_qr.alipay 随便改成一个不存在的文件名,
支付宝那一栏就会显示提示文字,不影响使用。
全都在 site/data/config.json 这一个文件里:
"pricing": {
"plans": {
"basic": { "label": "亲手定制", "price": 1.99, ... },
"ai": { "label": "AI 代写 + 定制", "price": 9.99, ... }
}
},
"affiliate": {
"enabled": true,
"defaultRate": 0.3, ← 默认佣金 30%
"rateByPlan": { "basic": 0.3, "ai": 0.4 },
"settle": "每月 1 号结算上月佣金" ← 这句话会显示在定制页上
}
改完保存,刷新页面就生效(免费托管不需要重新部署也能生效,因为文件是实时读的;但如果已经部署到公网,记得重新上传一次)。
这是整个项目的设计核心,先看一张流程图:
客户在定制页填名字/祝福语
│
├──► 【内容侧】把内容打包成一条链接(不进任何服务器)
│
└──► 【收款侧】只产生一个「订单号 SH20250614-8231」
│
客户扫码付 1.99 元(备注写订单号)
│
你在【出单后台】填内容 → 点生成 → 得到一张「卡密」
│
把带卡密的链接发给客户 ──► 客户点开就是做好的星空爱心
为什么这样设计:
https://你的域名/admin/。任何人只要在链接后面加 ?ref=他的名字,这一单就会记在他头上。出单后台右侧会自动汇总每个人该拿多少,月底点 导出 CSV 就能用 Excel 对账。
建议给推广者的话术:
把这个链接发给别人,别人通过它下单,你就能拿 30%:
https://你的域名/customize.html?ref=你的名字
(名字随便起,别和别人重名就行)
看 docs/PAYMENT-AUTOMATION.md(就在项目 docs 目录里)。简单说分三步:
config.json 里把 payment.channel 改成 "auto" 并填上 Worker 地址。这一步不急。先用「收款码 + 出单后台」跑通前 10 单,摸清楚客户到底想要什么,再去搞自动化 —— 否则很容易把时间花在代码上,而不是花在卖东西上。
本地服务器自带接口,可以模拟「付款成功 → 自动发卡密」:
# 起服务
node scripts/server.mjs --port 8099
# 另开一个终端,模拟下单
curl -X POST http://127.0.0.1:8099/api/order ^
-H "Content-Type: application/json" ^
-d "{\"amount\":1.99,\"ref\":\"小明\",\"card\":{\"to\":\"小美\",\"msg\":\"生日快乐\",\"plan\":\"basic\"}}"
# 会返回一串卡密,把它贴到定制页第 ④ 步的输入框里,就能生成正式链接
直接给结论:技术上完全可行,但「个人主体 + 直接收钱」这条路基本走不通。
下面是逐条拆解,完整版在 docs/WECHAT-MINIPROGRAM.md。
<canvas> 标签,要用 <canvas type="webgl"> 组件 + 它自己的 WebGL 接口。three-platformize 或 threejs-miniprogram 这类适配层,或者干脆手写 WebGL。InnerAudioContext 播放真实音频文件(意味着要准备 mp3,并处理版权)。fillText,但字体只能用系统字体,立体文字的层叠方案要重做。工作量估算:3~7 天(有现成的 3D 数学和着色器打底),主要时间花在适配层和真机调试上。
| 门槛 | 个人主体 | 企业主体 |
|---|---|---|
| 注册小程序 | 可以(免费) | 可以(需营业执照) |
| 开通微信支付 | 不能 | 可以(需对公账户) |
| 虚拟内容 / 数字礼品类目 | 基本不批 | 需资质,审核严 |
| 引导用户加微信 / 外部收款 | 违规,会被封 | 违规 |
| 诱导分享("发给3个好友解锁") | 违规 | 违规 |
| 含 AI 生成内容 | 需说明 | 需算法备案 |
结论:小程序这条路,个人做「付费贺卡」几乎必然卡在支付和类目审核上; 企业主体可以走通,但要在微信生态内收钱,就必须接微信支付,而微信支付要求商户资质 + 结算账户。
| 现在(H5) | 小程序里对应改成 |
|---|---|
<canvas> + Three.js | <canvas type="webgl"> + three-platformize |
| Web Audio 实时合成配乐 | InnerAudioContext + 真实 mp3 |
| URL 参数传内容 | 页面参数 / 云数据库 |
| 卡密 + 收款码 | 微信支付 + 订单表(需后端或云开发) |
| DOM 文字层 | canvas fillText 或 <cover-view> |
| DOM 按钮 | <view> + bindtap |
九成是没有用 HTTP 服务打开,而是双击了 html 文件。看第 ① 步起服务。 如果已经起了服务还是白屏,页面底部会出现一个红条写着具体错误,把那张图发出来就能定位。
在链接后面加 ?q=low 强制降画质试试:.../c/?q=low。
如果好了,说明设备 GPU 性能不足,可以把 config.json 里的默认画质调低(在 data/config.json 里加一个 "quality": "medium")。
另外 ?planets=0&fountain=0 可以关掉次要动画主体来省性能。
微信和 iOS 规定:必须用户主动点一下才能放声音。所以页面正中间有个「点亮这片星空」的按钮,点它才有音乐,这是正常的,不是 bug。
微信会缓存分享卡片。让 TA 在微信里点右上角 → 刷新,或者把链接后面随便加个 &t=1 变成新链接。
出单后台的数据存在你这台电脑的浏览器里。换电脑、清浏览器数据都会没。 所以:每收一笔就导出一次 CSV,别偷懒。
现在这个版本是「一个人的生意」。如果要做成平台让很多人卖,就需要真的后端 + 账号系统 + 分账,那是另一个项目了。 建议先一个人跑通,再考虑放大。