在 Next.js + Supabase 应用中集成自托管加密支付结账,支持 ETH、BTC、SOL、USDC、USDT 及 9 条链的25+ 币种,无需支付处理机构。
自控加密支付是一项面向实际任务的技能,主要用于此技能会做什么;将一个完整的、 生产准备的加密支付系统添加到 Next. js 14+ App 路由器应用程序中, 由 Supabase 支持;
从功能定位来看,该技能强调把分散的操作要求整理成清晰、可复用的处理流程,使用户能够围绕既定目标快速准备输入、选择执行方式并获得结构化结果。实际使用前应先确认任务范围、数据来源、运行环境、必要权限和关键参数,再依据技能说明逐步执行;若输入条件不完整,应先补齐信息或采用保守配置,避免因错误假设导致结果偏离需求。
执行过程中需要关注工具调用是否成功、接口或依赖是否可用、输出格式是否符合预期,并对异常提示、缺失字段和边界情况进行处理;涉及批量任务时,还应保存进度,避免中断后重复操作。该技能适合用于一次性任务,也可以接入自动化工作流,与其他技能或上层代理配合完成更完整的业务链路;在组合使用时,应明确每一步的输入输出关系,并避免不同步骤之间出现参数冲突。
为任意基于 Supabase 的 Next.js 14+ App Router 应用添加一套完整、开箱即用的生产级加密货币支付系统。无需 Stripe、CryptAPI 或其他第三方支付处理器——您保留每一笔付款的 100% 收益。
支持的链与币种:ETH、Base、Polygon、Arbitrum、Optimism、BNB Chain、Avalanche、Solana、Bitcoin —— 同时支持各链上的 USDC/USDT/DAI 等稳定币。
系统架构:
安全模型:助记词(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 |
npm install ethers @scure/bip32 @scure/bip39 @scure/base @noble/hashes @solana/web3.js qrcode npm install -D @types/qrcode
在 Supabase SQL 编辑器中(或通过 supabase db push 命令),按顺序执行以下两个迁移文件:
005_crypto_payments.sql006_crypto_direct.sql# 生成助记词: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
定时端点 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 头部请求该端点。
结算路由(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() 函数,实现您应用在付款确认后所需执行的操作(如增加积分、解锁功能、更新订阅状态等)。
import { CryptoPaymentModal } from '@/components/dashboard/crypto-payment-modal'
// 示例:购买积分包
setModalOpen(false)}
/>
该弹窗组件自动处理币种选择、二维码展示、倒计时以及付款状态轮询。
每笔支付都会从您的主助记词派生出一个唯一的充值地址:
m/44'/60'/0'/0/{index} —— 校验和格式的以太坊地址,兼容所有 EVM 兼容链m/84'/0'/0'/0/{index} —— 原生 SegWit P2WPKH 地址(bc1q...)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 的官方合约地址。
相关专题
热门下载
相关下载
精品课程
共6课时 | 54.7万人学习
共89课时 | 133.9万人学习
共49课时 | 82.5万人学习