{"id":27072668,"url":"https://github.com/jiusanzhou/payone","last_synced_at":"2026-03-15T16:03:33.315Z","repository":{"id":42582525,"uuid":"383983249","full_name":"jiusanzhou/payone","owner":"jiusanzhou","description":"简单地生成多合一的收款码。SaaS 无需部署，直接生成落地页和图片。","archived":false,"fork":false,"pushed_at":"2023-01-02T19:37:26.000Z","size":2645,"stargazers_count":10,"open_issues_count":5,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2023-03-04T09:39:59.254Z","etag":null,"topics":["alipay","qrcode","wechat","wechatpay","zoe-lab"],"latest_commit_sha":null,"homepage":"https://payone.wencai.app/","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/jiusanzhou.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-07-08T02:52:34.000Z","updated_at":"2023-02-06T16:05:01.000Z","dependencies_parsed_at":"2023-02-01T04:00:50.151Z","dependency_job_id":null,"html_url":"https://github.com/jiusanzhou/payone","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jiusanzhou%2Fpayone","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jiusanzhou%2Fpayone/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jiusanzhou%2Fpayone/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/jiusanzhou%2Fpayone/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/jiusanzhou","download_url":"https://codeload.github.com/jiusanzhou/payone/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247411646,"owners_count":20934719,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alipay","qrcode","wechat","wechatpay","zoe-lab"],"created_at":"2025-04-05T23:18:51.610Z","updated_at":"2026-03-15T16:03:33.310Z","avatar_url":"https://github.com/jiusanzhou.png","language":"JavaScript","funding_links":["https://paypal.me/","https://ko-fi.com/"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\n# `payone`\n\n**多合一收款码生成器**\n\n\u003c/div\u003e\n\n\n## ✨ 特性\n\n- 💾 多种存储后端：Cloudflare KV、is.gd、TinyURL\n- 📸 内置截图服务：生成分享图片\n- 🔴 简单高效使用\n- 🌎️ 支持 Vercel + Cloudflare Workers 部署\n- 👆 一键生成收款页面\n- 🖥️ 自动识别并生成对应平台二维码（支付宝自动跳转）\n- 🛠 支持支付宝、微信（受限）、QQ钱包、PayPal、Venmo、Ko-fi、爱发电、加密货币\n\n\n## 🖼️ 预览\n\n![editor](/assets/preview-editor.png)\n\n\n## 🏗️ 项目架构\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                         用户                                 │\n│                    (支付宝/微信/QQ 扫码)                      │\n└─────────────────────┬───────────────────────────────────────┘\n                      │\n                      ▼\n┌─────────────────────────────────────────────────────────────┐\n│                    Next.js 前端                             │\n│  ┌─────────────┐  ┌─────────────┐  ┌─────────────┐         │\n│  │  首页      │  │  编辑器    │  │  收款页面   │         │\n│  │  /         │  │  /editor   │  │  /s/[code]  │         │\n│  └─────────────┘  └─────────────┘  └─────────────┘         │\n└─────────────────────┬───────────────────────────────────────┘\n                      │\n                      ▼\n┌─────────────────────────────────────────────────────────────┐\n│               Cloudflare Worker API                         │\n│  GET  /api/s/:code       → 获取收款码数据/重定向             │\n│  POST /api/s/:code       → 创建新收款码                     │\n│  GET  /api/supports      → 列出支持的渠道                   │\n│  GET  /api/screenshot/:code → 生成分享图片                  │\n└─────────────────────┬───────────────────────────────────────┘\n                      │\n          ┌───────────┴───────────┐\n          ▼                       ▼\n┌─────────────────────┐   ┌─────────────────────┐\n│    存储后端         │   │    截图服务         │\n│  ┌───────────────┐  │   │  ┌───────────────┐  │\n│  │ Cloudflare KV │  │   │  │ Satori (默认) │  │\n│  │ is.gd / v.gd  │  │   │  │ Microlink     │  │\n│  │ TinyURL       │  │   │  │ Shotsapi      │  │\n│  └───────────────┘  │   │  └───────────────┘  │\n└─────────────────────┘   └─────────────────────┘\n```\n\n\n## 🔧 技术栈\n\n### 前端 (web/)\n\n| 技术 | 版本 | 说明 |\n|------|------|------|\n| Next.js | 15.x | React 框架，SSR/SSG |\n| React | 19.x | UI 库 |\n| Tailwind CSS | 4.x | 原子化 CSS 框架 |\n| qr-scanner | 1.4.x | 二维码解析 |\n| qrcode | 1.5.x | 二维码生成 |\n| react-confetti | 6.x | 创建成功庆祝动画 |\n\n### 后端 Worker (worker/)\n\n| 技术 | 说明 |\n|------|------|\n| Cloudflare Workers | 边缘计算平台 |\n| cloudworker-router | 路由处理 |\n| Satori | SVG 渲染引擎 |\n| Resvg-wasm | SVG 转 PNG |\n| TypeScript | 类型安全 |\n\n\n## 📂 项目结构\n\n```\npayone/\n├── README.md\n├── channels.json          # 支付渠道配置\n├── assets/                # 静态资源\n├── web/                   # Next.js 前端应用 (TypeScript)\n│   ├── components/        # React 组件 (.tsx)\n│   ├── config/           # 配置文件\n│   ├── lib/              # 工具库\n│   │   ├── api.ts        # API 调用\n│   │   ├── config.ts     # 环境配置\n│   │   ├── screenshot.ts # 截图服务注册\n│   │   ├── server.ts     # 服务端核心逻辑\n│   │   ├── store.ts      # 存储后端实现（工厂模式）\n│   │   └── utils.ts      # 工具函数\n│   ├── pages/            # 页面路由 (.tsx)\n│   │   ├── editor.tsx    # 编辑器页面\n│   │   ├── s/[code].tsx  # 收款码展示页\n│   │   └── usage/        # 使用说明页\n│   └── views/            # 视图组件 (.tsx)\n└── worker/               # Cloudflare Worker\n    ├── src/ts/           # TypeScript 源码\n    │   ├── index.ts      # Worker 入口\n    │   └── screenshot/   # 截图服务\n    │       ├── satori.ts # Satori 渲染\n    │       └── external.ts # 外部服务\n    └── wrangler.toml     # Wrangler 配置\n```\n\n\n## 💳 支持的支付渠道\n\n| 渠道 | URL 模式 | 状态 | 说明 |\n|------|----------|------|------|\n| 支付宝 | `https://qr.alipay.com/` | ✅ 完美支持 | 自动重定向，体验最佳 |\n| 微信支付 | `wxp://` | ⚠️ 受限 | 微信屏蔽了转账码识别，需长按保存后扫一扫 |\n| QQ钱包 | `https://i.qianbao.qq.com/` | ✅ 支持 | |\n| PayPal | `https://paypal.me/` | ✅ 支持 | 跳转 PayPal.Me 链接 |\n| Venmo | `https://venmo.com/` | ✅ 支持 | 美国用户常用 |\n| Ko-fi | `https://ko-fi.com/` | ✅ 支持 | 创作者打赏平台 |\n| 爱发电 | `https://afdian.com/a/` | ✅ 支持 | 国内创作者打赏平台 |\n| Bitcoin | `bitcoin:` | ✅ 支持 | 加密货币 |\n| Ethereum | `ethereum:` | ✅ 支持 | 加密货币 |\n| USDT (TRC20) | `tron:` | ✅ 支持 | 稳定币，TRC20 网络 |\n\n### ⚠️ 微信支付限制说明\n\n由于微信官方限制，个人转账二维码（`wxp://` 协议）在微信内被屏蔽识别，**无法实现扫码直接支付**。\n\n目前可行的方案：\n1. 用户用微信扫码后，显示引导页面\n2. 提示用户\"长按保存图片，返回微信首页扫一扫\"\n3. 用户从相册识别二维码完成支付\n\n如需微信内直接支付，需申请**微信支付商户**（需企业资质）或开发**小程序**承接。\n\n\n## 🚀 快速开始\n\n### 前端开发\n\n```bash\ncd web\nnpm install\nnpm run dev\n```\n\n### Worker 开发\n\n```bash\ncd worker\nnpm install\nnpm run build\nnpm run cf:dev  # 本地开发\n```\n\n\n## 🔧 部署指南\n\n### 前端部署\n\n#### 方式一：Vercel 部署（推荐）\n\n1. Fork 本仓库到你的 GitHub\n2. 在 [Vercel](https://vercel.com) 导入项目\n3. 设置根目录为 `web`\n4. 配置环境变量（见下文）\n5. 部署\n\n#### 方式二：自托管\n\n```bash\ncd web\nnpm install\nnpm run build\nnpm run start\n```\n\n#### 前端环境变量\n\n| 变量名 | 说明 | 默认值 | 示例 |\n|--------|------|--------|------|\n| `WORKER_API_URL` | Worker API 地址 | `http://localhost:8787` | `https://your-worker.workers.dev` |\n| `SCREENSHOT_PROVIDER` | 截图服务提供者 | `microlink` | `microlink` / `worker` / `thumio` |\n\n在 `web/.env.local` 中配置：\n\n```env\nWORKER_API_URL=https://your-worker.workers.dev\nSCREENSHOT_PROVIDER=microlink\n```\n\n---\n\n### Worker 部署\n\n#### 1. 安装 Wrangler CLI\n\n```bash\nnpm install -g wrangler\nwrangler login\n```\n\n#### 2. 配置 wrangler.toml\n\n复制示例配置并修改：\n\n```bash\ncd worker\ncp wrangler.example.toml wrangler.toml\n```\n\n编辑 `wrangler.toml`：\n\n```toml\nname = \"payone\"\nmain = \"src/ts/index.ts\"\ncompatibility_date = \"2024-01-01\"\ncompatibility_flags = [\"nodejs_compat\"]\n\n[vars]\nSCREENSHOT_PROVIDER = \"satori\"  # 截图服务\nBASE_URL = \"https://your-domain.com\"  # 你的域名\n\n[[kv_namespaces]]\nbinding = \"PAYONE_KV\"  # 绑定名称必须是 PAYONE_KV\nid = \"你的KV命名空间ID\"\n```\n\n\u003e **注意**：`binding` 必须设置为 `PAYONE_KV`，不要在 `[vars]` 中设置 `PAYONE_KV`，否则会覆盖 KV 绑定。\n\n#### 3. 创建 KV 命名空间（如使用 Cloudflare KV）\n\n```bash\nwrangler kv:namespace create PAYONE_KV\n```\n\n将输出的 `id` 填入 `wrangler.toml`。\n\n#### 4. 部署\n\n```bash\nnpm run build\nwrangler deploy\n```\n\n\n## 💾 存储后端配置\n\n项目支持多种存储后端，通过 KV 绑定或 `STORE_TYPE` 环境变量配置。代码会优先检查 `PAYONE_KV` 绑定，如果存在则使用 Cloudflare KV，否则根据 `STORE_TYPE` 选择其他存储后端。\n\n### Cloudflare KV（推荐）\n\n最稳定可靠的存储方案。\n\n```toml\n# wrangler.toml\n[vars]\nSCREENSHOT_PROVIDER = \"satori\"\nBASE_URL = \"https://your-domain.com\"\n\n[[kv_namespaces]]\nbinding = \"PAYONE_KV\"  # 必须使用此名称\nid = \"你的KV命名空间ID\"\n```\n\n**特点：**\n- 读写速度快，全球边缘节点\n- 支持 list/count 操作\n- 需要 Cloudflare Workers 计划\n\n---\n\n### is.gd / v.gd（免费）\n\n使用短链接服务存储数据，无需付费。不配置 KV 绑定时使用。\n\n```toml\n# wrangler.toml\n[vars]\nSTORE_TYPE = \"isgd\"\nSCREENSHOT_PROVIDER = \"satori\"\nBASE_URL = \"https://your-domain.com\"\n\n# 不配置 [[kv_namespaces]]\n```\n\n**特点：**\n- 完全免费\n- 无需额外配置\n- 短码只允许 `a-z`、`0-9`、下划线\n- 依赖第三方服务稳定性\n\n---\n\n### TinyURL\n\n使用 TinyURL 短链接服务。不配置 KV 绑定时使用。\n\n```toml\n# wrangler.toml\n[vars]\nSTORE_TYPE = \"tinyurl\"\nTINYURL_API_TOKEN = \"你的API令牌\"  # 可选，使用官方API时需要\nSCREENSHOT_PROVIDER = \"satori\"\nBASE_URL = \"https://your-domain.com\"\n\n# 不配置 [[kv_namespaces]]\n```\n\n**特点：**\n- 基础功能免费\n- API 访问需要令牌\n- 自定义短码可能受限\n\n---\n\n### git.io（已废弃）\n\n\u003e ⚠️ GitHub 已停止 git.io 新链接创建，仅保留用于读取历史数据。\n\n```toml\n[vars]\nSTORE_TYPE = \"gitio\"\n```\n\n\n## 📸 截图服务配置\n\n项目支持为收款码生成分享图片，通过 `SCREENSHOT_PROVIDER` 配置：\n\n### Microlink（默认）\n\n使用 Microlink 截图服务，真实浏览器渲染。\n\n```env\nSCREENSHOT_PROVIDER=microlink\n```\n\n**特点：**\n- 真实浏览器渲染\n- 免费额度有限\n- 无需配置即可使用\n\n---\n\n### Worker / Satori\n\n使用 Satori + Resvg 在 Worker 内直接渲染，无外部依赖。\n\n```env\nSCREENSHOT_PROVIDER=worker\n```\n\n**特点：**\n- 速度快，无外部 API 调用\n- 支持 SVG 和 PNG 格式\n- 完全离线运行\n\n---\n\n### Thum.io（免费）\n\n完全免费的截图服务，无需注册。\n\n```env\nSCREENSHOT_PROVIDER=thumio\n```\n\n**特点：**\n- 完全免费，无限制\n- 无需 API Key\n- 支持自定义尺寸\n\n---\n\n### Shotsapi\n\n使用 screenshotapi.net 服务。\n\n```env\nSCREENSHOT_PROVIDER=shotsapi\n```\n\n**特点：**\n- 高质量截图\n- 需要 API 密钥（付费）\n\n---\n\n### ApiFlash\n\n使用 ApiFlash 截图服务（100次/月免费）。\n\n```env\nSCREENSHOT_PROVIDER=apiflash\nAPIFLASH_ACCESS_KEY=your_access_key\n```\n\n**特点：**\n- 100次/月免费额度\n- 需要注册获取 API Key\n- 高质量 Chrome 渲染\n\n\n## 🖼️ 截图 API 使用\n\n生成收款码分享图片：\n\n```\nGET /api/screenshot/:code\nGET /api/screenshot/:code.png\nGET /api/screenshot/:code-banner.png\n```\n\n**参数：**\n\n| 参数 | 说明 | 默认值 |\n|------|------|--------|\n| `width` | 图片宽度 | 640（banner: 1200） |\n| `height` | 图片高度 | 960（banner: 630） |\n| `format` | 输出格式 `png`/`svg` | `png` |\n| `banner` | 是否为横幅模式 | `false` |\n\n**示例：**\n\n```bash\n# 默认尺寸\ncurl https://your-worker.dev/api/screenshot/mycode.png\n\n# 自定义尺寸\ncurl \"https://your-worker.dev/api/screenshot/mycode?width=800\u0026height=600\"\n\n# Banner 模式（适合社交分享）\ncurl https://your-worker.dev/api/screenshot/mycode-banner.png\n```\n\n\n## ⚙️ 完整配置示例\n\n### wrangler.toml（使用 Cloudflare KV）\n\n```toml\nname = \"payone\"\nmain = \"src/ts/index.ts\"\ncompatibility_date = \"2024-01-01\"\ncompatibility_flags = [\"nodejs_compat\"]\n\n[build]\ncommand = \"\"\n\n[vars]\nSCREENSHOT_PROVIDER = \"satori\"\nBASE_URL = \"https://payone.your-domain.com\"\n\n# 注意：不要在 [vars] 中设置 PAYONE_KV，否则会覆盖下面的 KV 绑定\n\n[[kv_namespaces]]\nbinding = \"PAYONE_KV\"\nid = \"你的KV命名空间ID\"\n\n[[rules]]\ntype = \"CompiledWasm\"\nglobs = [\"**/*.wasm\"]\n```\n\n### wrangler.toml（使用 is.gd 免费存储）\n\n```toml\nname = \"payone\"\nmain = \"src/ts/index.ts\"\ncompatibility_date = \"2024-01-01\"\ncompatibility_flags = [\"nodejs_compat\"]\n\n[build]\ncommand = \"\"\n\n[vars]\nSTORE_TYPE = \"isgd\"\nSCREENSHOT_PROVIDER = \"satori\"\nBASE_URL = \"https://payone.your-domain.com\"\n\n[[rules]]\ntype = \"CompiledWasm\"\nglobs = [\"**/*.wasm\"]\n```\n\n### web/.env.local\n\n```env\n# Worker API 地址\nWORKER_API_URL=https://payone.your-domain.workers.dev\n\n# 截图服务提供者: microlink (默认) | worker | thumio | shotsapi | apiflash\nSCREENSHOT_PROVIDER=microlink\n```\n\n\n## 🔌 API 参考\n\n| 端点 | 方法 | 说明 |\n|------|------|------|\n| `/api/s/:code` | GET | 获取收款码数据或重定向到支付页面 |\n| `/api/s/:code?type=json` | GET | 以 JSON 格式返回收款码数据 |\n| `/api/s/:code` | POST | 创建新收款码 |\n| `/api/supports` | GET | 获取支持的支付渠道列表 |\n| `/api/stat` | GET | 获取存储后端统计信息 |\n| `/api/screenshot/:code` | GET | 生成收款码截图 |\n\n\n## ❤️ 鼓励\n\n\u003cimg width=\"200\" src=\"https://payone.wencai.app/s/zoe.png\" alt=\"鼓励一下由 https://payone.wencai.app 赞助\"\u003e\n\n*鼓励一下由 https://payone.wencai.app 赞助*\n\n\n## 📄 License\n\nLA2\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjiusanzhou%2Fpayone","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjiusanzhou%2Fpayone","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjiusanzhou%2Fpayone/lists"}