# 键共振 Destiny · 完整网站(Cursor 投喂包 20260812)— 部署说明 作者定稿**完整版**(静态站 + 典章投喂)。站点根就是本目录(`website/`)。 参数口径统一 **2026-08-11**(大运×1.0 · 小运×1/8 · 地系数=1−(1−D)×¼×E午 · 令囚⅞/死⅝; 合冲生克刑害破见 `app/js/kr_params_2026_08_11.js`)。纯静态,无后端、无构建。 ## 本地预览 ```bash cd website python3 -m http.server 8930 ``` - 网站主页:`/index.html` - 排盘(含引擎 kr_engine.js):`/app/zeisen.html?theme=light&go=1` - 教程三部:`/app/teach.html` - 看盘流程报表:`/app/kanpan_report.html` - 文档索引:`/docs/index.html` > 付费内容默认对外加锁。`?unlock=master` 等 URL 参数**已失效**,不再解锁(见下文「付费墙与作者权限」)。 ## 正式上线(已完成) - 正式域名:**https://keyresonance.com**(含 `www`),HTTPS 已启用。 - 托管:Cloudflare **Pages** 项目 `key-resonance-destiny`,部署分支 `cursor/full-website-2026-08-11-bfb6`,站点根 `website/`。 - 后端结账/许可:`website/functions/api/` 自动映射为 `/api/*`。健康检查:`https://keyresonance.com/api/health`。 - 命令行脚本 `tool/pages_deploy.sh` 默认也使用同一部署分支;如需临时覆盖,可设置环境变量 `CF_PAGES_BRANCH`。 ## v2.0 替换发布闸门(上线前必查) - 规则源仅认:`AI_FEED_CANON.md`、`docs/IRON_LOCK.md`、`docs/PRINCIPLES.md` - 实时报告链路仅认:`app/js/kr_engine.js` + `app/js/kr_text_matcher.js` + `app/js/zeisen.js` - 用忌六字段未齐时,页面与报告只能输出“用忌待回填,暂停方向性建议” - 历史页面/旧文案仅存档,不得回流到实时报告路径 ## 绑定 / 重绑自定义域(Cloudflare Pages) 1. Pages 项目 `key-resonance-destiny` → **Custom domains** → 添加 `keyresonance.com` 与 `www.keyresonance.com`。 2. 若状态长时间停在 `Verifying`,多半是 DNS 没有记录或被占用。到该域的 **DNS → Records** 手动加两条 **Proxied(橙云)CNAME**: - `@`(根域)→ `key-resonance-destiny.pages.dev` - `www` → `key-resonance-destiny.pages.dev` 3. 清掉抢路由的旧 Worker:`kr-stripe-checkout`(旧 `www.keyresonance.com/api` 路由)、`keyresonance-pages-proxy` 等的自定义域/路由**全部删除**——Worker 路由优先级高于 Pages 自定义域,不删会截走 `/api/*`。 4. 状态转 `Active` 后,用无痕窗口验证 `https://keyresonance.com/` 与 `https://keyresonance.com/api/health`。 ## 主要目录 | 路径 | 内容 | |---|---| | `index.html` | 枢纽(现行 2026-08-11) | | `app/` | 排盘(引擎)· 合参 · 教程三部 · 典章 · O/P 程序 · 看盘报表 · 断语库 · 价目 | | `docs/` | 文档索引 · VERDICT_FOUNDATION · O_PROGRAM 总表 · STILL_MISSING | | `legal/` | 隐私/条款/免责 | | `AI_FEED_CANON.*` | 投喂总册(定量/参数唯一事实源) | | `freeze_c2ecb89.html` · `preview/` | **历史冻存 c2ecb89**(小运×1/4,仅对照,勿混用) | ## 参数一致性 现行导航页全部为 **2026-08-11 · 小运×1/8**;已修正 `wenzhen_duiqi.html`、 `app/canon.html`、`app/o_program.html`、`app/kanpan_report.html`、 `docs/O_PROGRAM_MASTER_TABLE.md` 中残留的「小运×1/4」。仅 `freeze_c2ecb89.html` 与 `preview/` 保留旧值作历史对照,已明确标注。 ## 收款结账(真付款真解锁) 已接入 **Stripe Checkout + Cloudflare Pages Functions + 签名许可(RS256 JWT,前端公钥验签)**: 付款成功才解锁,不可伪造、不可免费绕过。部署与密钥配置见 **`functions/README.md`**。 (Functions 目录 `website/functions/api/` 自动映射为 `/api/*`;站点根仍是 `website/`。)iOS 走 Apple 内购。 ## 付费墙与作者权限(B 方案 · 无 URL 后门) - **URL 参数不再解锁**:`?unlock=master` / `?beta` / `?tier` 一律无效(历史后门已从 `app/js/author_unlock.js`、`js/author_unlock.js`、`js/kr_settings.js` 全部切断)。付费内容只认「Stripe 付款后服务端签发、前端验签通过」的许可。 - **作者本人预览(隐藏管理员入口)**:排盘页连点顶部 LOGO 5 次,或打开 `/app/zeisen.html?admin=1` → 输入管理员账号 + 口令。 - 登录材料已移出公开文档,部署时请通过内部运维配置或安全密钥管理下发。 - 登录后本机(同一浏览器)全站自动解锁;换浏览器需重登。 - 口令以 **SHA-256** 存于 `app/js/zeisen.js` 的 `ADMIN_PW_SHA256`(源码不含明文)。改口令:浏览器控制台运行 `crypto.subtle.digest('SHA-256',new TextEncoder().encode('新口令')).then(b=>console.log([...new Uint8Array(b)].map(x=>x.toString(16).padStart(2,'0')).join('')))` 把输出的 64 位十六进制粘回 `ADMIN_PW_SHA256`。 - 说明:纯前端静态站,内容随包下发,管理员口令只挡「分享链接一键解锁」这类随手绕过;要真正防扒需改为服务端按许可下发。 ## 环境变量(Cloudflare Pages → Settings → Environment variables) | 变量 | 用途 | 必需 | |---|---|---| | `STRIPE_SECRET_KEY` | Stripe 结账/付款核验(测试用 `sk_test_…`,正式用 `sk_live_…`) | 是 | | `LICENSE_PRIVATE_KEY_PKCS8` | RS256 许可签名私钥(PKCS8 base64) | 是 | | `REDEEM_SECRET` | 换设备找回通行码(HMAC,无状态、无数据库) | 是 | | `RESEND_API_KEY` | 通过 Resend 发送「解锁通行码」邮件 | 邮箱找回需要 | | `EMAIL_FROM` | 发件地址,如 `no-reply@keyresonance.com`(域名需在 Resend 验证) | 邮箱找回需要 | | `CASEBOARD_TEAM_TOKEN` | 案例沟通区团队通行码(查看全部线程 / 回复 / 内部备注) | 团队收件箱需要 | | `CASEBOARD_NOTIFY_TO` | 新线程 / 客户追问通知收件邮箱 | 案例沟通区通知需要 | > 改环境变量后需 **Deployments → Retry deployment** 重新部署才生效。用 `/api/health` 核对各项是否为 `true`。 KV 绑定: | 绑定名 | 用途 | |---|---| | `CASEBOARD_KV` | 保存案例沟通区线程、状态、留言、内部备注与操作记录 | ## 换设备用邮箱找回权限 - 前端入口:排盘页「会员收藏」→「换设备找回(买断 · 无需密码)」,输入邮箱 + 通行码 → `/api/redeem` 验签 → 解锁。 - 买断(专业板/键共振)付款成功后,`/api/license` 会向付款邮箱发送通行码(需上表 `RESEND_API_KEY` + `EMAIL_FROM`)。单次判局 24h 设备内即时生效,无需找回。 - **开启邮箱发信的手把手步骤**(注册 Resend → 验证域名 → 拿 Key → 填变量 → 重部署 → `/api/health` 变 true)见 **`functions/RESEND_SETUP.md`**。 ## 案例沟通区(案件留言板) - 接口:`/api/case-board` - 客户侧入口:`app/zeisen.html` → 会员收藏 → 案例沟通区 - 团队侧入口:作者后台 → 案例收藏 → 案例沟通区收件箱 - 必配: - Pages KV 绑定 `CASEBOARD_KV` - 团队如需查看全部线程与写内部备注,再配 `CASEBOARD_TEAM_TOKEN` - 推荐再配: - `CASEBOARD_NOTIFY_TO`:收团队通知 - `RESEND_API_KEY` + `EMAIL_FROM`:向客户与团队发新留言通知 - 新设备恢复: - 建线程邮件会发专属链接,内含排盘参数、`case_thread`、`case_token` - 客户点开后会自动排盘并直达该线程 - `/api/health` 额外检查: - `caseboard` - `caseboard_team` - `caseboard_notify` ## 收客服信(Cloudflare Email Routing) `support@keyresonance.com` 用 Cloudflare Email Routing 免费收信(与 Resend 发信并存、不冲突:收在**根域** MX,发在 `send` 子域 + DKIM)。 1. Cloudflare → 选 `keyresonance.com` → **Email → Email Routing** → 启用;按提示让它**自动添加** DNS(根域 3 条 `route1/2/3.mx.cloudflare.net` + SPF + DKIM),状态变 **Active**。 2. **Destination Addresses** → 添加你的真实收件邮箱 → 点验证信里的链接变 **Verified**。 3. **Routing rules** → Create:Email pattern 只填 `support`(自动补 `@keyresonance.com`)→ Action **Send to an email** → 选已验证邮箱。可选再开 **Catch-all** 兜住所有地址(含客户回复 `no-reply@`)。 > 已生效记录:根域 MX(Cloudflare route1/2/3)收信;`send` MX(`feedback-smtp…amazonses.com`)供 Resend;两套 SPF/DKIM 各在其名下,互不影响。 > 可选加 DMARC:DNS 加 TXT `_dmarc` = `v=DMARC1; p=none;`(DNS only),提升进箱率。 ## 切换到正式收款(测试钥 → 正式钥) 结账用**动态价格**(`functions/api/checkout.js` 的 `price_data`),不依赖预建 Price ID,切换只改一个变量: 1. Stripe:先完成 **Activate payments**(公司/个人 + 收款银行信息),否则 live 收不了钱。 2. Stripe 关掉 Test mode(切 Live)→ **Developers → API keys** → 复制 `sk_live_…`。 3. Cloudflare → `key-resonance-destiny` → **Settings → Environment variables**(Production)→ 把 `STRIPE_SECRET_KEY` 的值改为 `sk_live_…` → Save。 4. **Deployments → Retry deployment** 重部署;`/api/health` 仍 `stripe:true`。 5. 用**真卡**买最便宜的**单次判局 $1.99** 实测解锁,再到 Stripe **Payments → Refund**(或 `tools/refund.mjs`)退给自己。 > 注意:`LICENSE_PRIVATE_KEY_PKCS8` / `REDEEM_SECRET` / `RESEND_API_KEY` / `EMAIL_FROM` 与 Stripe 模式无关,**不用改**;不要设 `PRICE_`(保持动态价格);test 与 live 数据各自独立。 ## 已知仍缺(见 `docs/STILL_MISSING.md`) 断语库自动选句引擎、作者后台、EN/JA 教程全文页、商店截图/512 图标、Flutter 干净仓库构建产物。 © 2026 键共振 Destiny