{"id":"b6bbc85c-0ffc-4c15-be2d-0fb93578238d","entityType":"agent","slug":"clawhub-williswu-personal-health-archive-trend-paid","name":"Personal Health Archive Trend","canonicalUrl":"https://www.xpersona.co/agent/clawhub-williswu-personal-health-archive-trend-paid","canonicalPath":"/agent/clawhub-williswu-personal-health-archive-trend-paid","generatedAt":"2026-10-10T05:14:08.525Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-09T15:28:44.615Z","emptyReason":null},"description":"本地运行的成人健康档案趋势分析 Skill，付费解锁高级排版与跨年度对比功能。在用户本地根据提供的体检/住院报告生成结构化档案，通过微信支付按次（5.99 元）完成付费，健康资料全程仅在本地处理，不向任何外部服务器上传。 Skill: Personal Health Archive Trend Owner: williswu Summary: 本地运行的成人健康档案趋势分析 Skill，付费解锁高级排版与跨年度对比功能。在用户本地根据提供的体检/住院报告生成结构化档案，通过微信支付按次（5.99 元）完成付费，健康资料全程仅在本地处理，不向任何外部服务器上传。 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-07T08:37:18.750Z | auto - Initial release of \"personal-health-archive-trend\" (付费解锁版): a local adult health archive trend analysis skill. - Paid features (advanced layout, cross-year comparison)","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.4K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17d5037aa7p5ccwmxhaa5ch1n8c1m7j:personal-health-archive-trend-paid","sourceUrl":"https://clawhub.ai/williswu/personal-health-archive-trend-paid","homepage":"https://clawhub.ai/williswu/skills/personal-health-archive-trend-paid","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/williswu/personal-health-archive-trend-paid","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/williswu/skills/personal-health-archive-trend-paid","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":68,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"本地运行的成人健康档案趋势分析 Skill，付费解锁高级排版与跨年度对比功能。在用户本地根据提供的体检/住院报告生成结构化档案，通过微信支付按次（5.99 元）完成付费，健康资料全程仅在本地处理，不向任何外部服务器上传。 Skill: Personal Health Archive Trend Owner: willi"},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T15:28:44.615Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T15:28:44.615Z","emptyReason":null},"stars":null,"forks":null,"downloads":2391,"packageName":null,"latestVersion":"0.1.0","tractionLabel":"2.4K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T15:28:44.615Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T15:28:44.615Z","lastCrawledAt":"2026-10-09T15:28:44.615Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T15:28:44.615Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.0","createdAt":"2026-08-07T08:37:18.750Z","changelog":"- Initial release of \"personal-health-archive-trend\" (付费解锁版): a local adult health archive trend analysis skill. - Paid features (advanced layout, cross-year comparison) require WeChat Pay (5.99元/次), processed entirely on the user's device. - No health data is ever uploaded—processing and analysis remain strictly local. - Enforced user consent, local-only data handling, and plugin installation required before activation. - Robust payment workflow detailed; includes handling for payment, unlock, and automatic refunds in case of exceptions.","fileCount":15,"zipByteSize":26665}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17d5037aa7p5ccwmxhaa5ch1n8c1m7j:personal-health-archive-trend-paid","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-williswu-personal-health-archive-trend-paid/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-williswu-personal-health-archive-trend-paid/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-williswu-personal-health-archive-trend-paid/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-williswu-personal-health-archive-trend-paid/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-williswu-personal-health-archive-trend-paid/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-williswu-personal-health-archive-trend-paid/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T05:14:08.524Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-williswu-personal-health-archive-trend-paid/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-williswu-personal-health-archive-trend-paid/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-williswu-personal-health-archive-trend-paid/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-williswu-personal-health-archive-trend-paid/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-09T15:28:44.615Z","emptyReason":null},"readme":"Skill: Personal Health Archive Trend\n\nOwner: williswu\n\nSummary: 本地运行的成人健康档案趋势分析 Skill，付费解锁高级排版与跨年度对比功能。在用户本地根据提供的体检/住院报告生成结构化档案，通过微信支付按次（5.99 元）完成付费，健康资料全程仅在本地处理，不向任何外部服务器上传。\n\nTags: latest:0.1.0\n\nVersion history:\n\nv0.1.0 | 2026-08-07T08:37:18.750Z | auto\n\n- Initial release of \"personal-health-archive-trend\" (付费解锁版): a local adult health archive trend analysis skill.\n- Paid features (advanced layout, cross-year comparison) require WeChat Pay (5.99元/次), processed entirely on the user's device.\n- No health data is ever uploaded—processing and analysis remain strictly local.\n- Enforced user consent, local-only data handling, and plugin installation required before activation.\n- Robust payment workflow detailed; includes handling for payment, unlock, and automatic refunds in case of exceptions.\n\nArchive index:\n\nArchive v0.1.0: 15 files, 26665 bytes\n\nFiles: .gitignore (189b), mch-demo-adult (0b), mch-demo-adult/.dockerignore (28b), mch-demo-adult/.env.example (926b), mch-demo-adult/Caddyfile (316b), mch-demo-adult/docker-compose.yml (674b), mch-demo-adult/Dockerfile (420b), mch-demo-adult/requirements.txt (34b), mch-demo-adult/server.py (33897b), mch-demo-adult/部署-群晖NAS.md (6899b), mch-demo-adult/部署说明.md (4074b), README.md (1935b), skill-card.md (2652b), SKILL.md (4760b), _meta.json (153b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: personal-health-archive-trend\ndescription: 本地运行的成人健康档案趋势分析 Skill，付费解锁高级排版与跨年度对比功能。在用户本地根据提供的体检/住院报告生成结构化档案，通过微信支付按次（5.99 元）完成付费，健康资料全程仅在本地处理，不向任何外部服务器上传。\nversion: 1.0.0\nauthor: 苏州澹宸信息科技有限公司\npricing:\n  model: per_call\n  amount_fen: 599   # 单位：分。599 = 5.99 元/次，请在 SkillHub 商家后台填一致价格\n---\n\n# 成人健康档案趋势分析（付费解锁版）\n\n## 个人信息保护与授权声明\n\n- 本 Skill 仅在用户本人或已取得明确授权时使用。\n- 调用前必须向用户披露处理方式并取得明确同意。\n- 所有健康资料**仅在用户本地处理**，不向任何外部服务器上传。\n\n## 付费与接口说明\n\n本 Skill 的高级功能通过微信支付按次计费。付费由运行环境的 `weixinpay` 插件按 X402 协议自动完成。\n\n- 付费校验接口地址（仅用于完成支付，不接收健康资料）：\n\n      https://mch.1001058.xyz/api/adult/resource\n\n- 该接口通过 **HTTPS/TLS 1.2+** 加密，仅传递付费所需信息（Skill 调用标识与订单信息），**不传递任何健康资料**。\n\n## 调用前确认（必须执行）\n\n调用本 Skill 之前，Agent 必须同时完成以下确认：\n\n1. 确认当前 Agent 已安装 `weixinpay` 插件（未安装则终止）。\n2. 向用户披露：「本服务在您本地根据提供的报告生成档案，需通过微信支付完成 5.99 元/次付费以解锁；您的健康资料全程仅在本地处理，不会上传至任何外部服务器。」取得明确同意。\n3. 用户拒绝、犹豫或身份不符：终止流程，不再调用接口。\n\n## 功能描述\n\n- **输入**：用户本地的体检/住院报告（文字或 PDF）。\n- **处理**：在**本地**完成结构化录入、异常标注、跨年度趋势对比。\n- **输出**：结构化成人健康档案（主档、异常标注、趋势对比）。\n- **边界**：仅做档案结构化与录入，不做诊断、不解读异常数值的临床意义；医学提醒为通用健康信息，不能替代医生诊断。\n\n## 工作流程\n\n> 说明：本 Skill 的付费校验接口仅做按次计费，所有网络请求由运行环境（Agent + weixinpay 插件）按 X402 付费协议自动完成，无需、也不应手工构造 HTTP 请求。\n\n### 第一步：发起付费校验\n\n在用户确认同意的前提下，运行环境向付费校验接口以 `POST` 方式提交一个 `application/json` 请求体，仅含 Skill 调用标识，例如：\n\n    {\"skill\": \"personal-health-archive-trend\"}\n\n> 注意：健康资料不进入该请求体，仅在用户本地使用，用于后续本地生成档案。\n\n### 第二步：处理 402 响应（支付由插件完成）\n\n如果接口返回 HTTP 402，`weixinpay` 插件会拦截响应并引导完成支付流程，无需手动调用支付接口。\n\n402 响应中会通过 Header 和 Body 返回支付信息：\n\n- Header `WeixinPay-Required`：支付凭证码（插件用于完成支付）\n- Header `X-Out-Trade-No`：商户订单号\n\n> 支付过程由 `weixinpay` 插件处理，Skill 无需关心支付细节。\n\n### 第三步：支付成功后解锁（⚠️ 必须执行）\n\n支付成功后，运行环境**必须**再次向同一接口发起请求以完成解锁。重试要求：\n\n- **JSON body 保持不变**：与首次请求完全一致（仅含 Skill 调用标识）\n- **通过 Header 携带支付信息**：将 402 响应中的 `WeixinPay-Required` 和 `X-Out-Trade-No` 原样带在请求 Header 中\n\n接口返回 200 即表示已解锁；随后 Agent **在本地**根据用户资料生成结构化档案并交付。\n\n### 第四步：处理退款响应\n\n如果第三步返回 `\"code\": \"REFUNDED\"`，说明服务异常无法提供内容，已自动退款：\n\n- 向用户说明：「抱歉，该服务暂时无法提供内容，已自动退款至原支付账户。」\n- **不要**再次尝试支付或重新请求\n\n## 注意事项\n\n1. 必须先确认 `weixinpay` 插件已安装，否则不要进入支付流程\n2. 调用前必须向用户披露处理方式、并取得明确同意\n3. 收到 402 响应时，支付由 `weixinpay` 插件完成，Skill 无需关心支付细节\n4. 支付成功后必须主动发起重试请求，body 保持不变，通过 Header `X-Out-Trade-No` 传递订单号\n5. 如果返回 `NOT_PAID`，说明支付尚未完成，请等待后重试\n6. 如果返回 `REFUNDED`，说明服务异常已退款，告知用户并终止流程\n7. 如果返回 `FULFILL_AND_REFUND_FAILED`，说明服务异常且退款失败，建议用户联系客服\n\nFile v0.1.0:README.md\n\n# 个人健康档案与趋势分析（付费解锁版）\n\nSkillHub 付费 skill 源码 + 微信支付商户服务器实现。对应 SkillHub 上架项：`@org-vnlatddn/personal-health-archive-trend`（付费解锁版）。\n\n## 结构\n\n```\nSKILL.md              # 付费 skill 定义（即发布到 SkillHub 的内容）。按次计费 5.99 元，本地生成档案、仅付费校验走云端\nmch-demo-adult/       # 微信支付商户服务器（部署于 NAS，监听 8081，经 Cloudflare tunnel 暴露为 https://mch.1001058.xyz/api/adult/resource）\n  server.py           # 付费校验接口（X402 / WeixinPay-Required 402 流程），不接收健康资料\n  Dockerfile          # 容器化构建\n  Caddyfile           # 反向代理 + TLS 终止\n  docker-compose.yml  # 编排\n  requirements.txt    # Python 依赖\n  .env.example        # 环境变量样例（真实 .env 不入库）\n  .dockerignore\n  部署-群晖NAS.md      # 群晖 NAS 部署说明\n  部署说明.md          # 通用部署说明\n```\n\n## 部署前准备（本地补齐，不入库）\n\n商户服务器运行需要以下私钥与配置，**不会进入本仓库**，请在各 `mch-demo-adult/` 目录本地放置：\n\n- `apiclient_key.pem`、`skillhub_private_key.pem`、`wechat_pub_key.pem`（微信支付 / SkillHub 私钥）\n- `.env`（参照 `.env.example` 填入 `APP_ID` / `MCH_ID` / `SERIAL_NO` / `SKILLHUB_TOKEN` 等真实值）\n\n## 计费与隐私\n\n- 计费模型：`per_call`，5.99 元/次（SkillHub 商家后台需填一致价格）。\n- 健康资料**全程仅在用户本地处理**，付费校验接口仅传递 Skill 调用标识与订单信息，不上传任何健康资料。\n- 详见 `SKILL.md` 内的《个人信息保护与授权声明》。\n\n## 端口 / 连通性\n\n- 本地端口：`8081`\n- 公网入口：`https://mch.1001058.xyz/api/adult/resource`（Cloudflare tunnel）\n- 健康档案主项目见 `个人健康档案/健康档案/`\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn76g9kz0gtex6q62a6kbqzmyh8c0jfc\",\n  \"slug\": \"personal-health-archive-trend-paid\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1786091838750\n}\n\nFile v0.1.0:mch-demo-adult/部署-群晖NAS.md\n\n# 部署到群晖 NAS（Container Manager + 反代 + 证书）\n\n适用：已有 Synology DS218 / 任意群晖 + 套件中心「Container Manager」。\n\n## ⚠️ 部署前必查（决定能不能成，先确认这 3 条）\n1. **有没有公网 IP（最关键）**\n   - 看路由器 WAN 口 IP，再去 https://www.ip.cn 查到的 IP。两者一致 = 有公网 IPv4。\n   - 若不一致（运营商给的是内网/大内网 CGNAT），端口转发就废了。解决办法：① 打运营商电话要「公网 IPv4」（多数免费）；② 或看光猫/路由器有没有 **IPv6 公网地址**（有就走 AAAA + 防火墙放通）；③ 或用 Cloudflare Tunnel / frp 内网穿透（见文末兜底）。\n2. **80 / 443 端口能否转发到 NAS**\n   - 部分家庭宽带封 80，Let's Encrypt 的 HTTP-01 验证需要 80 临时可达。若 80 死活不通，改用 DNS-01 验证（见步骤 3 备选）。\n   - 443 必须长期可达（回调和买家请求走它）。\n3. **域名**\n   - 没有的话先用群晖免费 DDNS：`xxx.synology.me`（控制面板 → 外部访问 → DDNS 一键申请）。\n   - 想用自有域名（如 `mch.example.com`）：去域名商把 **A 记录**指向你家公网 IP（或 CNAME 到上面的 `xxx.synology.me`）。\n\n另外：给 NAS 在路由器做 **DHCP 保留 / 静态 LAN IP**，不然 LAN IP 一变端口转发就错。\n\n---\n\n## 步骤 1：把 mch-demo 文件夹弄到 NAS 上\n你这台 Mac 的工作区本身就是 Synology Drive 同步盘（`SynologyDrive-DS218`），所以最省事的办法：\n- 保证 `mch-demo/` 整个目录（含 `server.py` / `Dockerfile` / `docker-compose.yml` / `requirements.txt`）在这个同步盘里——它通常已经自动同步到 NAS 的对应共享文件夹。\n- 在 NAS 的 **File Station** 里确认能看到这个目录，记下它的共享文件夹路径（如 `workbuddy/个人健康档案/邬致远健康档案/payskill-build/mch-demo`）。\n- **单独把 `.env` 也放进该目录**（它含私钥，未同步的话手动复制过去；Container Manager 的 `env_file: .env` 需要它）。⚠️ `.env` 里有商户私钥和 APIv3 Key，只在你自己 NAS 上存，别同步到第三方。\n\n> 备选：用 SMB / scp 把整个目录传到 NAS 某个共享文件夹也行。\n\n## 步骤 2：Container Manager 起容器\n1. 套件中心装 **Container Manager**。\n2. 打开 Container Manager → **项目** → **创建**。\n3. 项目路径选步骤 1 里那个 `mch-demo` 目录；来源选「Docker Compose 文件」，会自动读到我们的 `docker-compose.yml`。\n4. 点「下一步」构建并启动。Container Manager 会在 NAS 上 `docker build` 出 `mch-demo` 镜像，并跑容器，把 **8080** 发布到 NAS 本机。\n5. 验证：在 NAS 上 `curl http://localhost:8080/health` 应返回 `ok`（可用 Container Manager 的终端，或 SSH 进 NAS 执行）。\n\n> 若 NAS 上没有 Docker 构建缓存、拉 `python:3.11-slim` 慢，属正常，等几分钟。\n\n## 步骤 3：申请证书（Let's Encrypt）\n- **用 synology.me DDNS**：在「外部访问 → DDNS」创建时勾选「从 Let's Encrypt 获取证书」，自动完成。\n- **用自有域名**：控制面板 → 安全性 → 证书 → 新增 → 获取 Let's Encrypt 证书，填域名 + 邮箱。\n  - 默认走 **HTTP-01**：需要 80 端口此刻对外可达（见步骤 5）。\n  - 若 80 不通：选 **DNS-01**（需你的域名商在 Synology 支持列表里，或手动加 TXT 记录）。\n- 把证书**绑定到你的域名**（证书列表里「配置」→ 选该域名）。\n\n## 步骤 4：反向代理（外部 443 → 容器 8080）\n控制面板 → 外部访问 → 高级 → 反向代理（或 登录门户 → 高级 → 反向代理，依 DSM 版本）：\n- **来源**：协议 HTTPS，主机名 = 你的域名（如 `mch.example.com` 或 `mch.xxx.synology.me`），端口 `443`。\n- **目的地**：协议 HTTP，主机名 `localhost`，端口 `8080`。\n- 保存。这一步让公网 `https://你的域名/` 被群晖用证书解密后，转发给容器里的 `server.py`。\n\n## 步骤 5：路由器端口转发\n进你家路由器（光猫/路由器管理页）：\n- 外部 `443` → NAS 的 LAN IP `443`\n- 外部 `80` → NAS 的 LAN IP `80`（仅 Let's Encrypt HTTP-01 验证时需要，验证完可关，但建议常开以免证书续期失败）\n\n## 步骤 6：改 .env 并重启容器\n在 NAS 上把 `mch-demo/.env` 里的占位改成真实公网地址，然后重启容器（Container Manager → 项目 → 重新部署 / 容器 → 重启）：\n```\nPAY_NOTIFY_URL=https://<你的域名>/api/pay/notify\nREFUND_NOTIFY_URL=https://<你的域名>/api/refund/notify\n```\n\n## 步骤 7：验证\n- 公网验证（手机切 4G/5G，或用外部机器）：\n  ```bash\n  curl -k https://<你的域名>/health      # 期望 ok\n  curl -k -X POST https://<你的域名>/api/resource -H 'Content-Type: application/json' -d '{\"query\":\"建档\"}'   # 期望 402 + WeixinPay-Required\n  ```\n- 真支付后带 `X-Out-Trade-No` 重试应返回 `200 + content`（之前已本地验证过逻辑）。\n\n---\n\n## 兜底方案（无公网 IP / 端口被封）\n- **Cloudflare Tunnel（推荐）**：免费，不用开端口。在 NAS 或一台内网机跑 `cloudflared tunnel`，把 `https://你的域名` 指到 `localhost:8080`。Cloudflare 自动签证书，微信回调和买家都能通。注意免费版 Cloudflare 会做 HTTPS 代理，对微信回调这种普通 POST 没问题。\n- **frp / ngrok**：有公网服务器的可用 frp 反代；ngrok 临时测试方便但不适合长期生产。\n\n## 生产前还要补的（当前是占位）\n- `server.py` 的 `/api/pay/notify` 现在直接回 200，未校验微信回调签名。上线前需按微信 v3 验签 + 用 `MCH_APIV3_KEY` 解密报文，确认 `trade_state=SUCCESS` 后再标记订单（避免伪造通知）。\n- `execute_business()` 目前是占位文案，需接入真实 AI 建档逻辑。\n- 多副本需把内存 `_orders` 换成 Redis。\n\n## 你的实际方案：Cloudflare Tunnel（已打通，采用此方式）\n- **不需要**路由器开 80/443，也**不需要**群晖自己签证书。Cloudflare 在边缘终止 TLS，NAS 上只把容器 8080 暴露给本机 `localhost` 即可。\n- 容器已在 NAS 跑起来并发布 `8080` 到本机（docker-compose 已加 `apiclient_key.pem` 挂载，证书路径与 .env 一致）。\n- 在 **Cloudflare Zero Trust → Access → Tunnels → 你的 tunnel → Public Hostname** 添加一条：\n  - Subdomain：`mch`　Domain：`1001058.xyz`　Type：`HTTP`　URL：`http://localhost:8080`\n  - （子域名随意，只要和 `.env` 的 `PAY_NOTIFY_URL` 对应；当前已设为 `https://mch.1001058.xyz`）\n- 保存后，公网 `https://mch.1001058.xyz` 即转发到 NAS 容器 8080。\n- 验证：手机切 4G/5G 访问 `https://mch.1001058.xyz/health` 应返回 `ok`；`POST /api/resource` 应返回 402。\n\nFile v0.1.0:mch-demo-adult/部署说明.md\n\n# 商户服务端 · 部署公网 HTTPS 说明\n\n## 0. 为什么必须公网 HTTPS\n- 微信支付**回调通知**（`PAY_NOTIFY_URL` / `REFUND_NOTIFY_URL`）由微信服务器**主动访问**你的服务端，且必须是公网可访问的 **https** 地址。\n- 买家（SkillHub / WorkBuddy）调用你的 `/api/resource` 也必须公网触达，走 https 更安全。\n- 结论：`server.py` 要跑在**有公网 IP 的机器**上，前面有**合法 TLS 证书**。\n\n> 注意：WorkBuddy 的「CloudStudio 部署」只支持静态站点，跑不了这个 Python 后端，别走那条路。\n\n## 1. 三种落地方案（任选其一）\n\n| 方案 | 适合 | 成本 | HTTPS 方式 |\n|---|---|---|---|\n| A. 云服务器 + Caddy | 想稳定、独立可控 | ¥几十/月 | Caddy 自动申请 Let's Encrypt |\n| B. 群晖 NAS + 反代 | 已有 NAS、零额外成本 | 0 | 群晖自带反代 + Let's Encrypt |\n| C. PaaS（Render / Fly / 腾讯云函数）| 不想管服务器 | 免费~低 | 平台自动 https |\n\n## 2. 通用：构建并运行容器（三种方案都先做这步）\n```bash\ncd payskill-build/mch-demo\ndocker build -t mch-demo .\ndocker run -d --name mch-demo --restart unless-stopped \\\n  --env-file .env -p 8080:8080 mch-demo\ncurl http://localhost:8080/health   # 期望返回 ok\n```\n或用 docker-compose：`docker compose up -d`。\n\n## 3. 方案 A：云服务器（腾讯云轻量 / CVM）+ Caddy\n1. 一台有公网 IP 的轻量服务器，装好 docker。\n2. 准备一个域名，把 **A 记录**指向该服务器公网 IP。\n3. 安装 Caddy（Debian/Ubuntu）：`sudo apt install -y caddy`。\n4. 用本目录的 `Caddyfile`，把 `<你的域名>` 改成真实域名。\n5. 启动：`sudo systemctl enable --now caddy`（或 `caddy run`）。Caddy 自动申请并续期证书。\n6. 验证：`curl https://<你的域名>/health` 应返回 `ok` 且为 https。\n\n## 4. 方案 B：群晖 NAS（Container Manager + 反代）\n1. 套件中心装「Container Manager」（Docker）。\n2. 在 NAS 上 build 本目录镜像，或用「项目」导入 `docker-compose.yml`（只保留 mch-demo 服务，去掉端口冲突）。\n3. 控制面板 → 外部访问 → 反向代理：新增规则，来源 `<你的域名>:443` → 目的地 `localhost:8080`。\n4. 同一页「证书」用 Let's Encrypt 给域名签发（需先配好 DDNS / 自有域名 + 验证）。\n5. 路由器把 **80/443** 转发到 NAS（或仅 443 + DNS 验证签发证书）。\n\n## 5. 方案 C：PaaS（以 Render 为例）\n1. 把 `mch-demo` 目录推到 GitHub 仓库。\n2. Render 新建 Web Service，连仓库：Build `pip install -r requirements.txt`，Start `python server.py`，端口 8080。\n3. Render 自动给 `*.onrender.com` 发 https；如需自有域名，在 Render 绑定并验证。\n4. 其余 PaaS（Fly.io /  Railway / 腾讯云函数 SCF+APIGW）同理，函数型需把 `ThreadingHTTPServer` 改为平台 handler。\n\n## 6. 部署后必做\n1. 把 `.env` 里两行改成你的真实公网地址，然后重启容器：\n   ```\n   PAY_NOTIFY_URL=https://<你的域名>/api/pay/notify\n   REFUND_NOTIFY_URL=https://<你的域名>/api/refund/notify\n   ```\n2. 在 SkillHub 商家后台发布团队 Skill：slug 须 = `SKILL_ID`（`pediatric-health-record`），并把服务端地址 `https://<你的域名>/api/resource` 填到对应配置。\n\n## 7. 验证完整链路\n```bash\n# 首次请求 → 应返回 402 + WeixinPay-Required\ncurl -X POST https://<你的域名>/api/resource -H 'Content-Type: application/json' -d '{\"query\":\"建档\"}'\n# 真实支付后带 X-Out-Trade-No 重试 → 应返回 200 + content\ncurl -X POST https://<你的域名>/api/resource -H 'Content-Type: application/json' \\\n  -H 'X-Out-Trade-No: <支付后的单号>' -d '{\"query\":\"建档\"}'\n```\n\n## 备注\n- `server.py` 用内存 `_orders` 记录订单，单副本足够；多副本需外接 Redis。\n- 已修复 `_load_dotenv` 改用脚本所在目录的绝对路径，容器/任意目录运行都能加载 `.env`。\n- 真实 `execute_business()` 目前是占位文案，上线前替换为真实 AI 建档逻辑。\n\nFile v0.1.0:skill-card.md\n\n## Description:\n\nPersonal Health Archive Trend helps an agent create a local adult health archive from user-provided physical exam or hospitalization reports, with paid access to advanced formatting and cross-year comparisons.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[williswu](https://clawhub.ai/user/williswu)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nExternal users use this skill to turn their own adult health report data into a structured archive with abnormal-item flags and cross-year trend comparisons. It is for record organization and general wellness reminders, not diagnosis or clinical interpretation.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Sensitive health records may be sent to the payment backend despite local-only claims.\n\nMitigation: Use payment-only requests that exclude health records; the publisher should enforce a strict request schema that rejects profile, reports, and free-text health fields.\n\nRisk: Mock payment mode or incomplete payment configuration may weaken the expected paid unlock flow.\n\nMitigation: Disable mock mode in production and require complete WeChat Pay and SkillHub credentials before public use.\n\nRisk: Key handling, callback processing, logging, and data retention are not fully documented for sensitive-health use.\n\nMitigation: Document key storage, callback verification, log contents, and retention practices before using the skill with real health records.\n\n## Reference(s):\n\n- [ClawHub Skill Listing](https://clawhub.ai/williswu/skills/personal-health-archive-trend-paid)\n- [Publisher Profile](https://clawhub.ai/user/williswu)\n- [Server-Resolved GitHub Provenance](https://github.com/williswu/personal-health-archive-trend-paid)\n- [Artifact README](artifact/README.md)\n- [Deployment Guide](artifact/mch-demo-adult/部署说明.md)\n- [Synology NAS Deployment Guide](artifact/mch-demo-adult/部署-群晖NAS.md)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, guidance]\n\n**Output Format:** [Markdown with structured sections, tables, and payment status messages]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [May include refund or payment status guidance; health output is informational and not a medical diagnosis.]\n\n## Skill Version(s):\n\n0.1.0 (source: server release metadata; artifact frontmatter says 1.0.0)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.1.0:mch-demo-adult/docker-compose.yml\n\nservices:\n  mch-demo-adult:\n    build: .\n    container_name: mch-demo-adult\n    restart: unless-stopped\n    env_file:\n      - .env\n    ports:\n      - \"8081:8080\"\n    volumes:\n      # 把微信支付私钥挂进容器，路径与 .env 的 PRIVATE_KEY_PATH 一致\n      - \"./apiclient_key.pem:/Users/weiwu/cert/1749040075_20260805_cert/apiclient_key.pem:ro\"\n      # SkillHub 开发者私钥（PEM），对应 .env 的 SKILLHUB_PRIVATE_KEY_FILE\n      - \"./skillhub_private_key.pem:/app/skillhub_private_key.pem:ro\"\n      # 微信支付公钥（公钥模式验签用），对应 .env 的 WX_PUB_KEY_FILE / WX_PUB_KEY_ID\n      - \"./wechat_pub_key.pem:/app/wechat_pub_key.pem:ro\"\n\nFile v0.1.0:mch-demo-adult/requirements.txt\n\nrequests>=2.31\ncryptography>=42.0","readmeExcerpt":"Skill: Personal Health Archive Trend Owner: williswu Summary: 本地运行的成人健康档案趋势分析 Skill，付费解锁高级排版与跨年度对比功能。在用户本地根据提供的体检/住院报告生成结构化档案，通过微信支付按次（5.99 元）完成付费，健康资料全程仅在本地处理，不向任何外部服务器上传。 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-07T08:37:18.750Z | auto - Initial release of \"personal-health-archive-trend\" (付费解锁版): a local adult health archive trend analysis skill. - Paid features (advanced layout, cross-year comparison) ","codeSnippets":[],"executableExamples":[{"language":"text","snippet":"SKILL.md              # 付费 skill 定义（即发布到 SkillHub 的内容）。按次计费 5.99 元，本地生成档案、仅付费校验走云端\nmch-demo-adult/       # 微信支付商户服务器（部署于 NAS，监听 8081，经 Cloudflare tunnel 暴露为 https://mch.1001058.xyz/api/adult/resource）\n  server.py           # 付费校验接口（X402 / WeixinPay-Required 402 流程），不接收健康资料\n  Dockerfile          # 容器化构建\n  Caddyfile           # 反向代理 + TLS 终止\n  docker-compose.yml  # 编排\n  requirements.txt    # Python 依赖\n  .env.example        # 环境变量样例（真实 .env 不入库）\n  .dockerignore\n  部署-群晖NAS.md      # 群晖 NAS 部署说明\n  部署说明.md          # 通用部署说明"},{"language":"text","snippet":"PAY_NOTIFY_URL=https://<你的域名>/api/pay/notify\nREFUND_NOTIFY_URL=https://<你的域名>/api/refund/notify"},{"language":"bash","snippet":"curl -k https://<你的域名>/health      # 期望 ok"},{"language":"bash","snippet":"curl -k -X POST https://<你的域名>/api/resource -H 'Content-Type: application/json' -d '{\"query\":\"建档\"}'   # 期望 402 + WeixinPay-Required"},{"language":"bash","snippet":"curl -k https://<你的域名>/health      # 期望 ok\n  curl -k -X POST https://<你的域名>/api/resource -H 'Content-Type: application/json' -d '{\"query\":\"建档\"}'   # 期望 402 + WeixinPay-Required"},{"language":"bash","snippet":"curl http://localhost:8080/health   # 期望返回 ok"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: personal-health-archive-trend\ndescription: 本地运行的成人健康档案趋势分析 Skill，付费解锁高级排版与跨年度对比功能。在用户本地根据提供的体检/住院报告生成结构化档案，通过微信支付按次（5.99 元）完成付费，健康资料全程仅在本地处理，不向任何外部服务器上传。\nversion: 1.0.0\nauthor: 苏州澹宸信息科技有限公司\npricing:\n  model: per_call\n  amount_fen: 599   # 单位：分。599 = 5.99 元/次，请在 SkillHub 商家后台填一致价格\n---\n\n# 成人健康档案趋势分析（付费解锁版）\n\n## 个人信息保护与授权声明\n\n- 本 Skill 仅在用户本人或已取得明确授权时使用。\n- 调用前必须向用户披露处理方式并取得明确同意。\n- 所有健康资料**仅在用户本地处理**，不向任何外部服务器上传。\n\n## 付费与接口说明\n\n本 Skill 的高级功能通过微信支付按次计费。付费由运行环境的 `weixinpay` 插件按 X402 协议自动完成。\n\n- 付费校验接口地址（仅用于完成支付，不接收健康资料）：\n\n      https://mch.1001058.xyz/api/adult/resource\n\n- 该接口通过 **HTTPS/TLS 1.2+** 加密，仅传递付费所需信息（Skill 调用标识与订单信息），**不传递任何健康资料**。\n\n## 调用前确认（必须执行）\n\n调用本 Skill 之前，Agent 必须同时完成以下确认：\n\n1. 确认当前 Agent 已安装 `weixinpay` 插件（未安装则终止）。\n2. 向用户披露：「本服务在您本地根据提供的报告生成档案，需通过微信支付完成 5.99 元/次付费以解锁；您的健康资料全程仅在本地处理，不会上传至任何外部服务器。」取得明确同意。\n3. 用户拒绝、犹豫或身份不符：终止流程，不再调用接口。\n\n## 功能描述\n\n- **输入**：用户本地的体检/住院报告（文字或 PDF）。\n- **处理**：在**本地**完成结构化录入、异常标注、跨年度趋势对比。\n- **输出**：结构化成人健康档案（主档、异常标注、趋势对比）。\n- **边界**：仅做档案结构化与录入，不做诊断、不解读异常数值的临床意义；医学提醒为通用健康信息，不能替代医生诊断。\n\n## 工作流程\n\n> 说明：本 Skill 的付费校验接口仅做按次计费，所有网络请求由运行环境（Agent + weixinpay 插件）按 X402 付费协议自动完成，无需、也不应手工构造 HTTP 请求。\n\n### 第一步：发起付费校验\n\n在用户确认同意的前提下，运行环境向付费校验接口以 `POST` 方式提交一个 `application/json` 请求体，仅含 Skill 调用标识，例如：\n\n    {\"skill\": \"personal-health-archive-trend\"}\n\n> 注意：健康资料不进入该请求体，仅在用户本地使用，用于后续本地生成档案。\n\n### 第二步：处理 402 响应（支付由插件完成）\n\n如果接口返回 HTTP 402，`weixinpay` 插件会拦截响应并引导完成支付流程，无需手动调用支付接口。\n\n402 响应中会通过 Header 和 Body 返回支付信息：\n\n- Header `WeixinPay-Required`：支付凭证码（插件用于完成支付）\n- Header `X-Out-Trade-No`：商户订单号\n\n> 支付过程由 `weixinpay` 插件处理，Skill 无需关心支付细节。\n\n### 第三步：支付成功后解锁（⚠️ 必须执行）\n\n支付成功后，运行环境**必须**再次向同一接口发起请求以完成解锁。重试要求：\n\n- **JSON body 保持不变**：与首次请求完全一致（仅含 Skill 调用标识）\n- **通过 Header 携带支付信息**：将 402 响应中的 `WeixinPay-Required` 和 `X-Out-Trade-No` 原样带在请求 Header 中\n\n接口返回 200 即表示已解锁；随后 Agent **在本地**根据用户资料生成结构化档案并交付。\n\n### 第四步：处理退款响应\n\n如果第三步返回 `\"code\": \"REFUNDED\"`，说明服务异常无法提供内容，已自动退款：\n\n- 向用户说明：「抱歉，该服务暂时无法提供内容，已自动退款至原支付账户。」\n- **不要**再次尝试支付或重新请求\n\n## 注意事项\n\n1. 必须先确认 `weixinpay` 插件已安装，否则不要进入支付流程\n2. 调用前必须向用户披露处理方式、并取得明确同意\n3. 收到 402 响应时，支付由 `weixinpay` 插件完成，Skill 无需关心支付细节\n4. 支付成功后必须主动发起重试请求，body 保持不变，通过 Header `X-Out-Trade-No` 传递订单号\n5. 如果返回 `NOT_PAID`，说明支付尚未完成，请等待后重试\n6. 如果返回 `REFUNDED`，说明服务异常已退款，告知用户并终止流程\n7. 如果返回 `FULFILL_AND_REFUND_FAILED`，说明服务异常且退款失败，建议用户联系客服"},{"path":"README.md","content":"# 个人健康档案与趋势分析（付费解锁版）\n\nSkillHub 付费 skill 源码 + 微信支付商户服务器实现。对应 SkillHub 上架项：`@org-vnlatddn/personal-health-archive-trend`（付费解锁版）。\n\n## 结构\n\n```\nSKILL.md              # 付费 skill 定义（即发布到 SkillHub 的内容）。按次计费 5.99 元，本地生成档案、仅付费校验走云端\nmch-demo-adult/       # 微信支付商户服务器（部署于 NAS，监听 8081，经 Cloudflare tunnel 暴露为 https://mch.1001058.xyz/api/adult/resource）\n  server.py           # 付费校验接口（X402 / WeixinPay-Required 402 流程），不接收健康资料\n  Dockerfile          # 容器化构建\n  Caddyfile           # 反向代理 + TLS 终止\n  docker-compose.yml  # 编排\n  requirements.txt    # Python 依赖\n  .env.example        # 环境变量样例（真实 .env 不入库）\n  .dockerignore\n  部署-群晖NAS.md      # 群晖 NAS 部署说明\n  部署说明.md          # 通用部署说明\n```\n\n## 部署前准备（本地补齐，不入库）\n\n商户服务器运行需要以下私钥与配置，**不会进入本仓库**，请在各 `mch-demo-adult/` 目录本地放置：\n\n- `apiclient_key.pem`、`skillhub_private_key.pem`、`wechat_pub_key.pem`（微信支付 / SkillHub 私钥）\n- `.env`（参照 `.env.example` 填入 `APP_ID` / `MCH_ID` / `SERIAL_NO` / `SKILLHUB_TOKEN` 等真实值）\n\n## 计费与隐私\n\n- 计费模型：`per_call`，5.99 元/次（SkillHub 商家后台需填一致价格）。\n- 健康资料**全程仅在用户本地处理**，付费校验接口仅传递 Skill 调用标识与订单信息，不上传任何健康资料。\n- 详见 `SKILL.md` 内的《个人信息保护与授权声明》。\n\n## 端口 / 连通性\n\n- 本地端口：`8081`\n- 公网入口：`https://mch.1001058.xyz/api/adult/resource`（Cloudflare tunnel）\n- 健康档案主项目见 `个人健康档案/健康档案/`"},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn76g9kz0gtex6q62a6kbqzmyh8c0jfc\",\n  \"slug\": \"personal-health-archive-trend-paid\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1786091838750\n}"},{"path":"mch-demo-adult/部署-群晖NAS.md","content":"# 部署到群晖 NAS（Container Manager + 反代 + 证书）\n\n适用：已有 Synology DS218 / 任意群晖 + 套件中心「Container Manager」。\n\n## ⚠️ 部署前必查（决定能不能成，先确认这 3 条）\n1. **有没有公网 IP（最关键）**\n   - 看路由器 WAN 口 IP，再去 https://www.ip.cn 查到的 IP。两者一致 = 有公网 IPv4。\n   - 若不一致（运营商给的是内网/大内网 CGNAT），端口转发就废了。解决办法：① 打运营商电话要「公网 IPv4」（多数免费）；② 或看光猫/路由器有没有 **IPv6 公网地址**（有就走 AAAA + 防火墙放通）；③ 或用 Cloudflare Tunnel / frp 内网穿透（见文末兜底）。\n2. **80 / 443 端口能否转发到 NAS**\n   - 部分家庭宽带封 80，Let's Encrypt 的 HTTP-01 验证需要 80 临时可达。若 80 死活不通，改用 DNS-01 验证（见步骤 3 备选）。\n   - 443 必须长期可达（回调和买家请求走它）。\n3. **域名**\n   - 没有的话先用群晖免费 DDNS：`xxx.synology.me`（控制面板 → 外部访问 → DDNS 一键申请）。\n   - 想用自有域名（如 `mch.example.com`）：去域名商把 **A 记录**指向你家公网 IP（或 CNAME 到上面的 `xxx.synology.me`）。\n\n另外：给 NAS 在路由器做 **DHCP 保留 / 静态 LAN IP**，不然 LAN IP 一变端口转发就错。\n\n---\n\n## 步骤 1：把 mch-demo 文件夹弄到 NAS 上\n你这台 Mac 的工作区本身就是 Synology Drive 同步盘（`SynologyDrive-DS218`），所以最省事的办法：\n- 保证 `mch-demo/` 整个目录（含 `server.py` / `Dockerfile` / `docker-compose.yml` / `requirements.txt`）在这个同步盘里——它通常已经自动同步到 NAS 的对应共享文件夹。\n- 在 NAS 的 **File Station** 里确认能看到这个目录，记下它的共享文件夹路径（如 `workbuddy/个人健康档案/邬致远健康档案/payskill-build/mch-demo`）。\n- **单独把 `.env` 也放进该目录**（它含私钥，未同步的话手动复制过去；Container Manager 的 `env_file: .env` 需要它）。⚠️ `.env` 里有商户私钥和 APIv3 Key，只在你自己 NAS 上存，别同步到第三方。\n\n> 备选：用 SMB / scp 把整个目录传到 NAS 某个共享文件夹也行。\n\n## 步骤 2：Container Manager 起容器\n1. 套件中心装 **Container Manager**。\n2. 打开 Container Manager → **项目** → **创建**。\n3. 项目路径选步骤 1 里那个 `mch-demo` 目录；来源选「Docker Compose 文件」，会自动读到我们的 `docker-compose.yml`。\n4. 点「下一步」构建并启动。Container Manager 会在 NAS 上 `docker build` 出 `mch-demo` 镜像，并跑容器，把 **8080** 发布到 NAS 本机。\n5. 验证：在 NAS 上 `curl http://localhost:8080/health` 应返回 `ok`（可用 Container Manager 的终端，或 SSH 进 NAS 执行）。\n\n> 若 NAS 上没有 Docker 构建缓存、拉 `python:3.11-slim` 慢，属正常，等几分钟。\n\n## 步骤 3：申请证书（Let's Encrypt）\n- **用 synology.me DDNS**：在「外部访问 → DDNS」创建时勾选「从 Let's Encrypt 获取证书」，自动完成。\n- **用自有域名**：控制面板 → 安全性 → 证书 → 新增 → 获取 Let's Encrypt 证书，填域名 + 邮箱。\n  - 默认走 **HTTP-01**：需要 80 端口此刻对外可达（见步骤 5）。\n  - 若 80 不通：选 **DNS-01**（需你的域名商在 Synology 支持列表里，或手动加 TXT 记录）。\n- 把证书**绑定到你的域名**（证书列表里「配置」→ 选该域名）。\n\n## 步骤 4：反向代理（外部 443 → 容器 8080）\n控制面板 → 外部访问 → 高级 → 反向代理（或 登录门户 → 高级 → 反向代理，依 DSM 版本）：\n- **来源**：协议 HTTPS，主机名 = 你的域名（如 `mch.example.com` 或 `mch.xxx.synology.me`），端口 `443`。\n- **目的地**：协议 HTTP，主机名 `localhost`，端口 `8080`。\n- 保存。这一步让公网 `https://你的域名/` 被群晖用证书解密后，转发给容器里的 `server.py`。\n\n## 步骤 5：路由器端口转发\n进你家路由器（光猫/路由器管理页）：\n- 外部 `443` → NAS 的 LAN IP `443`\n- 外部 `80` → NAS 的 LAN IP `80`（仅 Let's Encrypt HTTP-01 验证时需要，验证完可关，但建议常开以免证书续期失败）\n\n## 步骤 6：改 .env 并重启容器\n在 NAS 上把 `mch-demo/.env` 里的占位改成真实公网地址，然后重启容器（Container Manager → 项目 → 重新部署 / 容器 → 重启）：\n```\nPAY_NOTIFY_URL=https://<你的域名>/api/pay/notify\nREFUND_NOTIFY_URL=https://<你的域名>/api/refund/notify\n```\n\n## 步骤 7：验证\n- 公网验证（手机切 4G/5G，或用外部机器）：\n  ```bash\n  curl -k https://<你的域名>/health      # 期望 ok\n  curl -k -X POST https://<你的域名>/api/resource -H 'Content-Type: application/json' -d '{\"query\":\"建档\"}'   # 期望 402 + WeixinPay-Required\n  ```\n- 真支付后带 `X-Out-Trade-No` 重试应返回 `200 + content`（之前已本地验证过逻辑）。\n\n---\n\n## 兜底方案（无公网 IP / 端口被封）\n- **Cloudflare Tunnel（推荐）**：免费，不用开"},{"path":"mch-demo-adult/部署说明.md","content":"# 商户服务端 · 部署公网 HTTPS 说明\n\n## 0. 为什么必须公网 HTTPS\n- 微信支付**回调通知**（`PAY_NOTIFY_URL` / `REFUND_NOTIFY_URL`）由微信服务器**主动访问**你的服务端，且必须是公网可访问的 **https** 地址。\n- 买家（SkillHub / WorkBuddy）调用你的 `/api/resource` 也必须公网触达，走 https 更安全。\n- 结论：`server.py` 要跑在**有公网 IP 的机器**上，前面有**合法 TLS 证书**。\n\n> 注意：WorkBuddy 的「CloudStudio 部署」只支持静态站点，跑不了这个 Python 后端，别走那条路。\n\n## 1. 三种落地方案（任选其一）\n\n| 方案 | 适合 | 成本 | HTTPS 方式 |\n|---|---|---|---|\n| A. 云服务器 + Caddy | 想稳定、独立可控 | ¥几十/月 | Caddy 自动申请 Let's Encrypt |\n| B. 群晖 NAS + 反代 | 已有 NAS、零额外成本 | 0 | 群晖自带反代 + Let's Encrypt |\n| C. PaaS（Render / Fly / 腾讯云函数）| 不想管服务器 | 免费~低 | 平台自动 https |\n\n## 2. 通用：构建并运行容器（三种方案都先做这步）\n```bash\ncd payskill-build/mch-demo\ndocker build -t mch-demo .\ndocker run -d --name mch-demo --restart unless-stopped \\\n  --env-file .env -p 8080:8080 mch-demo\ncurl http://localhost:8080/health   # 期望返回 ok\n```\n或用 docker-compose：`docker compose up -d`。\n\n## 3. 方案 A：云服务器（腾讯云轻量 / CVM）+ Caddy\n1. 一台有公网 IP 的轻量服务器，装好 docker。\n2. 准备一个域名，把 **A 记录**指向该服务器公网 IP。\n3. 安装 Caddy（Debian/Ubuntu）：`sudo apt install -y caddy`。\n4. 用本目录的 `Caddyfile`，把 `<你的域名>` 改成真实域名。\n5. 启动：`sudo systemctl enable --now caddy`（或 `caddy run`）。Caddy 自动申请并续期证书。\n6. 验证：`curl https://<你的域名>/health` 应返回 `ok` 且为 https。\n\n## 4. 方案 B：群晖 NAS（Container Manager + 反代）\n1. 套件中心装「Container Manager」（Docker）。\n2. 在 NAS 上 build 本目录镜像，或用「项目」导入 `docker-compose.yml`（只保留 mch-demo 服务，去掉端口冲突）。\n3. 控制面板 → 外部访问 → 反向代理：新增规则，来源 `<你的域名>:443` → 目的地 `localhost:8080`。\n4. 同一页「证书」用 Let's Encrypt 给域名签发（需先配好 DDNS / 自有域名 + 验证）。\n5. 路由器把 **80/443** 转发到 NAS（或仅 443 + DNS 验证签发证书）。\n\n## 5. 方案 C：PaaS（以 Render 为例）\n1. 把 `mch-demo` 目录推到 GitHub 仓库。\n2. Render 新建 Web Service，连仓库：Build `pip install -r requirements.txt`，Start `python server.py`，端口 8080。\n3. Render 自动给 `*.onrender.com` 发 https；如需自有域名，在 Render 绑定并验证。\n4. 其余 PaaS（Fly.io /  Railway / 腾讯云函数 SCF+APIGW）同理，函数型需把 `ThreadingHTTPServer` 改为平台 handler。\n\n## 6. 部署后必做\n1. 把 `.env` 里两行改成你的真实公网地址，然后重启容器：\n   ```\n   PAY_NOTIFY_URL=https://<你的域名>/api/pay/notify\n   REFUND_NOTIFY_URL=https://<你的域名>/api/refund/notify\n   ```\n2. 在 SkillHub 商家后台发布团队 Skill：slug 须 = `SKILL_ID`（`pediatric-health-record`），并把服务端地址 `https://<你的域名>/api/resource` 填到对应配置。\n\n## 7. 验证完整链路\n```bash\n# 首次请求 → 应返回 402 + WeixinPay-Required\ncurl -X POST https://<你的域名>/api/resource -H 'Content-Type: application/json' -d '{\"query\":\"建档\"}'\n# 真实支付后带 X-Out-Trade-No 重试 → 应返回 200 + content\ncurl -X POST https://<你的域名>/api/resource -H 'Content-Type: application/json' \\\n  -H 'X-Out-Trade-No: <支付后的单号>' -d '{\"query\":\"建档\"}'\n```\n\n## 备注\n- `server.py` 用内存 `_orders` 记录订单，单副本足够；多副本需外接 Redis。\n- 已修复 `_load_dotenv` 改用脚本所在目录的绝对路径，容器/任意目录运行都能加载 `.env`。\n- 真实 `execute_business()` 目前是占位文案，上线前替换为真实 AI 建档逻辑。"}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"本地运行的成人健康档案趋势分析 Skill，付费解锁高级排版与跨年度对比功能。在用户本地根据提供的体检/住院报告生成结构化档案，通过微信支付按次（5.99 元）完成付费，健康资料全程仅在本地处理，不向任何外部服务器上传。 Skill: Personal Health Archive Trend Owner: williswu Summary: 本地运行的成人健康档案趋势分析 Skill，付费解锁高级排版与跨年度对比功能。在用户本地根据提供的体检/住院报告生成结构化档案，通过微信支付按次（5.99 元）完成付费，健康资料全程仅在本地处理，不向任何外部服务器上传。 Tags: latest:0.1.0 Version history: v0.1.0 | 2026-08-07T08:37:18.750Z | auto - Initial release of \"personal-health-archive-trend\" (付费解锁版): a local adult health archive trend analysis skill. - Paid features (advanced layout, cross-year comparison)","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":949,"uniquenessScore":49,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T15:28:44.615Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T15:28:44.615Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T05:14:08.525Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}