在 Next.js + Supabase 应用中集成自托管加密支付结账,支持 ETH、BTC、SOL、USDC、USDT 及 9 条链的25+ 币种,无需支付处理机构。
自控加密支付
功能概述
自控加密支付是一项面向实际任务的技能,主要用于此技能会做什么;将一个完整的、 生产准备的加密支付系统添加到 Next. js 14+ App 路由器应用程序中, 由 Supabase 支持;
核心要点
- no strape, no CryptAPI, no paymen。
- 它将相关步骤、工具调用和结果整理方式集中到统一流程中,帮助使用者更快完成目标并减少重复操作。
- 使用时应结合输入条件选择合适的执行方式,核对必要参数、依赖环境与输出内容,并按原始要求处理异常情况。
使用与执行
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
结果检查与注意事项
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
自托管加密货币支付
该能力的作用
为任意基于 Supabase 的 Next.js 14+ App Router 应用添加一套完整、开箱即用的生产级加密货币支付系统。无需 Stripe、CryptAPI 或其他第三方支付处理器——您保留每一笔付款的 100% 收益。
支持的链与币种:ETH、Base、Polygon、Arbitrum、Optimism、BNB Chain、Avalanche、Solana、Bitcoin —— 同时支持各链上的 USDC/USDT/DAI 等稳定币。
系统架构:
- 用户选择币种 → 服务端基于 HD 钱包派生唯一地址(遵循 BIP44 / BIP84 / SLIP-0010)
- 服务端将该地址及预期收款金额写入数据库,并设置 1 小时过期时间
- 定时任务每分钟轮询真实区块链,校验余额并确认付款是否到账
- 确认到账后,原子化地为用户账户发放积分/升级订阅/启用附加功能
安全模型:助记词(mnemonic)永不触达客户端或源代码;用户无法干预目标地址或金额;付款确认由区块链本身验证,而非易被伪造的 Webhook。
需复制的文件
所有模板文件均位于 resources/ 目录下。请按如下路径将其复制到您的项目中:
| 资源文件 | 在您项目中的目标路径 |
|---|---|
crypto-wallets.ts |
src/lib/crypto-wallets.ts |
crypto-checkout-route.ts |
src/app/api/billing/crypto-checkout/route.ts |
crypto-checkout-status-route.ts |
src/app/api/billing/crypto-checkout/[id]/status/route.ts |
check-crypto-payments-route.ts |
src/app/api/cron/check-crypto-payments/route.ts |
crypto-payment-modal.tsx |
src/components/dashboard/crypto-payment-modal.tsx |
005_crypto_payments.sql |
supabase/migrations/005_crypto_payments.sql |
006_crypto_direct.sql |
supabase/migrations/006_crypto_direct.sql |
安装步骤
1. 安装依赖
npm install ethers @scure/bip32 @scure/bip39 @scure/base @noble/hashes @solana/web3.js qrcode npm install -D @types/qrcode
2. 执行数据库迁移
在 Supabase SQL 编辑器中(或通过 supabase db push 命令),按顺序执行以下两个迁移文件:
005_crypto_payments.sql006_crypto_direct.sql
3. 添加环境变量
# 生成助记词:https://iancoleman.io/bip39/(12 或 24 个单词 —— 绝对不可提交至代码库)
CRYPTO_MASTER_MNEMONIC=word1 word2 word3 ... word12
# 用于保护定时任务端点 —— 可通过以下命令生成:
# node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
CRON_SECRET=your-32-char-hex-string
4. 配置定时任务(cron job)
定时端点 POST /api/cron/check-crypto-payments 必须每 60 秒调用一次。
Vercel Cron(vercel.json):
{
"crons": [
{
"path": "/api/cron/check-crypto-payments",
"schedule": "* * * * *"
}
]
}
请在 cron 配置或 Vercel 控制台中添加 Authorization 请求头:
Authorization: Bearer
Fly.io machines / 自托管环境:使用调度任务或外部定时服务(例如 cron-job.org),以 Authorization: Bearer 头部请求该端点。
5. 自定义支付类型
结算路由(checkout route)支持三种支付 type 值,请根据您应用的数据模型进行调整:
| 类型 | 作用 | 必需的请求体字段 |
|---|---|---|
credits |
向用户档案添加积分 | packId |
plan |
升级用户订阅计划 | plan、months(终身订阅可选) |
addon |
应用一次性资源附加项 | addonId、botId(可选) |
如何自定义:在 crypto-checkout-route.ts 中,将 CREDIT_PACKS、PLANS 和 validAddons 替换为您自己的常量定义。金额必须始终来源于服务端常量,绝不可来自用户输入。
在 check-crypto-payments-route.ts 中,请更新 applyPayment() 函数,实现您应用在付款确认后所需执行的操作(如增加积分、解锁功能、更新订阅状态等)。
6. 接入支付弹窗组件
import { CryptoPaymentModal } from '@/components/dashboard/crypto-payment-modal'
// 示例:购买积分包
setModalOpen(false)}
/>
该弹窗组件自动处理币种选择、二维码展示、倒计时以及付款状态轮询。
地址派生原理
每笔支付都会从您的主助记词派生出一个唯一的充值地址:
- EVM 链(ETH、Base、Polygon 等):
m/44'/60'/0'/0/{index}—— 校验和格式的以太坊地址,兼容所有 EVM 兼容链 - Bitcoin:
m/84'/0'/0'/0/{index}—— 原生 SegWit P2WPKH 地址(bc1q...) - Solana:
m/44'/501'/{index}'/0'—— SLIP-0010 ed25519 格式(与 Phantom/Solflare 钱包一致)
derivation_index 每次支付递增,并持久化存储于数据库中。UNIQUE 约束确保不会有两个活跃支付共享同一地址。
注意事项:一个助记词控制全部收款钱包,请务必安全备份。如需清空资金(sweep funds),可将该助记词导入 MetaMask(EVM)、Phantom(SOL)或符合 BIP84 规范的钱包(BTC),然后派生对应子账户。
需要自定义的内容
| 内容 | 所在位置 |
|---|---|
| 支持的币种列表 | SUPPORTED_COINS,位于 crypto-checkout-route.ts |
| 优先展示的快捷币种 | QUICK_PICKS,位于 crypto-payment-modal.tsx |
| 支付有效期(默认 1 小时) | expiresAt,位于 crypto-checkout-route.ts |
| 余额容差(默认 0.5%) | minRequired,位于 check-crypto-payments-route.ts |
| 支付类型及履约逻辑 | applyPayment(),位于 check-crypto-payments-route.ts |
| 速率限制(默认 3 次请求 / 5 分钟) | checkRateLimit 调用,位于 crypto-checkout-route.ts |
安全说明
crypto-wallets.ts是纯服务端文件 —— 切勿在客户端组件或页面中导入CRYPTO_MASTER_MNEMONIC绝不可出现在源代码、Git 历史记录或日志中- 定时任务端点使用
timingSafeEqual对比CRON_SECRET,防止计时攻击 - 支付金额始终源自服务端常量,用户无法篡改
- 地址唯一性由数据库层面保障(
wallet_type + derivation_index字段组合建立唯一索引)
故障排查
“CRYPTO_MASTER_MNEMONIC 未设置” —— 环境变量缺失。请将其添加至 .env.local(开发环境)或部署平台的环境变量配置中(生产环境)。
付款未确认到账 —— 请检查定时任务是否正常运行,且请求头 Authorization: Bearer 是否完全匹配。同时查看 Vercel 或服务器日志中以 [check-crypto] 开头的日志行。
“Failed to allocate payment address” —— 极其罕见的并发冲突(已重试 3 次失败)。可安全重试。
EVM 链代币未被识别 —— 请确认该代币在对应链上的合约地址已加入 crypto-wallets.ts 中的 ERC20_CONTRACTS 映射表。可前往 etherscan.io 查询该链上 USDC/USDT 的官方合约地址。
热门AI工具
相关专题
Playwright测试失败专题汇集超时、定位器匹配、浏览器提前关闭、依赖与插件配置、文件上传、SSL及Docker启动等故障文章,并介绍通过截图、报告和Trace定位错误。
0
2026.10.21
Playwright页面操作专题汇集元素定位、点击与输入、等待响应、多页面切换、Iframe、事件监听及文件处理的已审核文章,便于按操作场景查阅示例与常见问题。
0
2026.10.21
Playwright入门专题汇集测试框架安装、VS Code配置、录制脚本、编写首个用例、运行调试及查看报告的已审核文章,帮助初学者搭建端到端测试流程。
0
2026.10.21
Java应用运行缓慢,如何调整JVM参数?本专题介绍OpenJDK JVM性能调优的基本流程,涵盖性能指标确认、运行数据采集、内存配置和垃圾回收分析,帮助你先定位瓶颈,再通过对照测试验证效果,避免直接套用参数而影响应用稳定性。
0
2026.10.16
怎样用OpenJDK搭建开发环境?本专题介绍版本选择、下载安装、环境变量配置和编译运行验证,帮助你理清JDK的作用及基本配置流程,并通过简单程序检查环境是否可用,为后续项目开发做好准备。
0
2026.10.16
Java项目开发完成后,怎样部署到目标环境并正常运行?本专题介绍OpenJDK应用部署流程,涵盖运行环境准备、版本兼容检查、应用打包、启动参数配置和日志查看,帮助你理清部署前后的操作顺序,减少环境差异造成的运行问题。
0
2026.10.16
本专题聚焦Revel框架MVC核心机制,讲解路由定义、控制器Action、参数绑定、请求响应和反向路由,并结合常见场景梳理接口请求处理流程。
0
2026.10.16
热门下载
相关下载
精品课程
共6课时 | 12.1万人学习
共79课时 | 161.4万人学习
共6课时 | 54.7万人学习

