这套工程不是模板改皮,而是一条能跑通交易的链路:用户注册 → 充值(比索代收或 USDT)→ 买商品 → 扣库存 → 订单进后台 → 管理员发货 → 用户在「我的密钥」里拿到 API Key。代码 120 个文件、0.52 MB,没有一处加密混淆。
技术栈
- Next.js 16.3.4(App Router)+ React 19.2.8 + TypeScript
- Prisma 5.22 + SQLite(
file:./prod.db,单文件数据库,备份就是拷一个文件) - Tailwind CSS 4 + 自绘组件,无 UI 框架依赖
- 依赖极少:
@prisma/client、bcryptjs、jsonwebtoken,加上框架本身
8 张数据表,把「卖密钥」这件事拆干净
| 模型 | 作用 |
|---|---|
User | 账号、密码摘要、角色、余额、VIP 等级 |
UserKyc | 实名资料与审核状态 |
VipTier | VIP 等级与「每月可下单数」 |
Deposit | 充值单:金额、币种、支付地址、txHash、状态 |
Product | 商品:价格、库存、上游 Key 池、限购 |
Order | 订单:订单号、联系方式、支付方式、状态 |
ApiKey | 已发放的密钥(与订单、用户挂钩) |
Setting | 站点设置、支付配置、USDT 地址等键值 |
迁移文件齐全(6 个 migration.sql,从 init 到 add_user_kyc、usdt_deposit),prisma migrate deploy 一条命令建库。
两条收款通道,逻辑分开写
- NekPayment 代收(墨西哥比索):下单生成
payUrl,用户跳转支付;回调统一进/api/pay/notify,先验签再处理。订单号和充值单号共用一个回调入口——D开头的单号走「充值到账」,其余走「订单置为已支付」,靠前缀分流,避免两套回调各自出错。 - USDT-TRC20 充值:1 USDT = 1 USD,用户提交金额与
txHash,系统校验哈希格式后登记为待审,由管理员在后台人工核对到账。这点要说清楚:它是「人工审核到账」,不是链上自动监听,别指望打款秒到。
付款方式还支持余额直扣:余额够就直接扣款并把订单置为已支付,不经过第三方。所有下单都受 VIP 每月可购单数限制(按当月已支付订单统计),超限直接拒单。
密钥安全:上游 Key 加密落库
src/lib/aes.ts 用 AES-256-GCM 加密上游 Key,主密钥来自环境变量 ENC_KEY;库里存的是密文,管理员在后台点「发货」时才解密写进 ApiKey 表并绑定用户。也就是说:数据库被拖走,没有 ENC_KEY 也拿不到上游 Key。这是同类小系统里很少见的一步。
鉴权是常规但正确的写法:bcryptjs 存密码(cost 10)、jsonwebtoken 签会话、后台入口校验 role === "admin",不是只判断「有没有登录」。
前台 8 页 / 后台 9 个模块
- 前台:首页(商品列表)、登录、注册、商品详情、订单详情、充值、KYC 验证、我的订单 / 我的密钥
- 后台:总览、商品、订单(发货 / 改状态 / 退款)、充值(通过 / 驳回)、会员(改余额 / 改 VIP)、KYC 审核、密钥库、VIP 等级、站点设置
- API 路由 30+:
auth4 个、orders4 个、deposits3 个、kyc2 个、pay/notify1 个、admin20 个,全部 App Router 风格
三语 + 部署脚本
src/i18n/dictionaries.ts 内置 中文 / 英文 / 西班牙文 三套词条(33 KB),西语不是凑数——配合比索收款,显然是给拉美市场用的。上线脚本也备齐了:
scripts/create-admin.mjs建管理员、seed-products.mjs灌演示商品、backup-db.sh备份 SQLiteecosystem.config.js(PM2)或 systemd + nginx 反代,next start -p 3000- 自带
.gitea/workflows/deploy.yml,push 到 main 就自动部署 - 环境变量三个必改项:
JWT_SECRET(openssl rand -base64 48)、ENC_KEY(openssl rand -base64 32)、DATABASE_URL
体检结论(工具实测)
- 120 个文件 / 0.52 MB,0 处高危执行调用、0 处中危注入入口、0 处硬编码密钥
- 无加密无混淆,
src/全量 TypeScript 可读可改 .env.example里三个密钥都是空值占位,没有把真实配置打进包(这点很关键,很多包会带.env)- 无
node_modules,装依赖约 600 个包,Node 20 以上可跑
要注意的三件事
- SQLite 是单机方案:并发高、或要多实例部署时换成 Postgres,改动集中在
prisma/schema.prisma的datasource与连接串。 - 回调必须公网可达且 https:
NEKPAY_NOTIFY_URL填错会导致「付了钱订单不置位」,本地调试建议用内网穿透。 - USDT 充值靠人工:审核环节在
/admin/deposits,没有链上监听,量大了要么加节点监听、要么接第三方回调。
适合谁:做 API 转售、卡密/额度类虚拟商品、需要「充值 → 下单 → 发货」闭环的人。要改的东西也很明确——换商品、换支付通道、换语言,业务层几乎不用动。
同类逻辑的系统可以对照 综合源码栏目;如果想看带后台控盘的商城风格,可参考 Web3 抢单 DApp 站 v2.0 的数据层做法。