跳转到主要内容

你将构建什么

本教程将带你从零构建一个 Next.js 14+(App Router)全栈应用,实现袋袋 OAuth 登录、Token 安全存储、以及按量计费事件上报的完整流程。用户点击「Login with 袋袋」后完成授权,应用自动管理 Token 生命周期,并在用户触发付费动作时向袋袋上报计费事件。

前置条件

袋袋开发者账号

已注册袋袋账号并在开发者后台创建 App,获取 Client ID 和 Client Secret

开发环境

Node.js 18+、npm/pnpm/bun、基础 Next.js 和 React 经验

Step 1: 创建 Next.js 项目并安装依赖

如果需要使用 Drizzle 持久化 Token,还需安装:

Step 2: 配置环境变量

.env.local
永远不要将 .env.local 提交到版本控制。确保 .gitignore 包含该文件。

Step 3: 初始化 SDK

ProfyApp 实例应当作为单例在服务端使用。不要将 clientSecret 暴露给客户端。

Step 4: 创建 OAuth 登录页面

app/page.tsx

Step 5: 处理 OAuth 回调

exchangeCode 返回的 expiresAt 是 access token 的过期时间戳,用于判断何时刷新。

Step 6: Token 持久化

方案 A: 使用 DrizzleTokenStore(推荐)

SDK 提供了开箱即用的 Drizzle 集成:
在 schema 中导出 Token 表:
db/schema.ts
运行 migration 创建表后,回调中的 saveToken 实现:

方案 B: 加密 Cookie(轻量场景)

对于不需要数据库的简单场景,可以将 Token 加密后存入 HTTP-only cookie:
lib/token-cookie.ts
Cookie 方案在 Token 刷新时需要同步更新 cookie,且无法服务端主动吊销。生产环境推荐方案 A。

Step 7: 上报计费事件

客户端调用示例:
app/dashboard/page.tsx

Step 8: 错误处理

SDK 抛出的错误均为类型化异常,可精确捕获:
在 API Route 中统一处理:
app/api/report-event/route.ts

完整项目结构

常见问题

下一步

按次计费 SaaS

PER_USE 模式:固定价格按次扣费

AI 按量计费

METERED 模式:调用 AI 模型按 token 计费

Webhook 事件监听

接收袋袋平台推送的用户事件通知

Token 管理最佳实践

多用户、并发刷新、安全存储