Skip to main content
让 Sentra 为您编写集成代码。
使用我们在 VS Code、Cursor 或 Windsurf 中的 AI 助手生成 SDK/API 代码、webhook 处理程序、信用授权等——只需描述您的需求即可。
试用 Sentra:AI 驱动的集成 →
在本教程中,您将构建 NeuralAPI —— 一个分级 AI 平台,每个订阅计划附带每月代币信用额度,当客户用完时可以购买充值包,您的后端会在 OpenAI 处理请求时自动扣除信用。
本教程使用 Node.js/Express + OpenAI SDK。Dodo Payments 的概念(信用、计量器、webhooks)适用于任何框架或 AI 提供商——可以自由调整。
通过本教程,您将学会如何:
  • 创建自定义信用授权(代币)和自动扣除的计量器
  • 将信用附加到订阅计划(有或没有超额使用)和一次性充值产品
  • 连接真正的 OpenAI 完成端点,通过 Dodo Payments 以代币计费
  • 通过 SDK 查询客户的实时信用余额
  • 验证 webhook 签名并路由 Dodo Payments 信用事件

我们要构建的内容

这是 NeuralAPI 的定价模型:
在开始之前,请确保您拥有:
  • Dodo Payments 账户(测试模式即可)
  • OpenAI API 密钥
  • Node.js 18+
  • 对 TypeScript/Node.js 的基本熟悉

第一步:创建代币信用授权

首先,创建订阅计划和充值包共享的信用授权。把这看作是定义平台使用的“代币”单位。
信用清单页面显示创建的信用授权

The Credits tab under Products shows all your credit entitlements.

1

Navigate to Credits

  1. 登录您的 Dodo Payments 仪表板
  2. 在左侧栏中点击 Products
  3. 选择 Credits 标签
  4. 点击 Create Credit
2

Configure the credit unit

填写代币信用的基本信息:Credit Name: API TokensCredit Type: 选择 Custom UnitUnit Name: tokenPrecision: 0 (代币始终为整数)Credit Expiry: 30 days (信用在每个计费周期重置)
创建信用后,精度无法更改。对于代币计数,0(整数)几乎总是正确的。
3

Skip overage at the credit level

此处保持超额使用禁用——在将信用附加到产品时,每个计划配置它。这允许入门计划在零时阻止使用,而专业计划允许超额使用。
在此处配置的超额使用设置是默认值。每个产品附件可以覆盖它们——这正是我们将在步骤 3 中做的。
4

Save and copy the credit ID

点击 Create Credit。保存后,打开信用并复制其 ID —— 它看起来像 cent_xxxxxxxxxxxx
您的 API Tokens 信用授权已准备好。接下来,创建一个计量器,以便使用事件能自动驱动扣除。

第二步:为代币使用创建计量器

计量器聚合传入的使用事件,并将其转换为信用扣除。您需要在创建计划产品之前准备好这个,因为您将在步骤 3 的产品创建期间附加它。
1

Open the Meters section

  1. 在仪表板侧边栏中,转到 Products → Meters
  2. 点击 Create Meter
2

Configure the meter

填写信息:Meter Name: Token Usage MeterEvent Name: api.tokens_used (此名称必须与您的应用程序发送的内容完全匹配)Aggregation Type: Sum —— 我们对来自每个事件的代币数量进行求和Over Property: tokens —— 每个事件中的元数据键,其值将被求和Measurement Unit: tokens
事件名称区分大小写。api.tokens_usedApi.Tokens.Used —— 选择一个并坚持使用它。
保存计量器并复制其 ID —— 您将在附加到产品时引用它。
计量器已创建。现在我们可以在配置产品时将其连接到信用上。

第三步:创建计划产品

两个计划需要是使用计费产品,而不是普通订阅——计量器只能附加到 UBB 产品,您需要计量器在客户调用 API 时自动扣除信用。UBB 产品仍支持循环基础费用($29 / $99);在此基础上的使用以信用计费。
基于使用的计费定价配置

Usage Based Billing pricing type with meter configuration.

入门计划 ($29/月 — 10M 代币,无超额使用)

1

Create the Starter UBB product

  1. 转到 Products → Create Product
  2. 选择 Usage Based Billing 作为定价类型
  3. 填写:
Product Name: NeuralAPI StarterDescription: 10 million API tokens per month. Perfect for individual developers and small projects.Fixed Price: 29.00 (循环基础费用——即使在使用前也每月收费)Billing Cycle: MonthlyCurrency: USD
2

Attach the meter

Select meter 部分,点击 + 并添加 Token Usage Meter。然后在计量器上:
  1. 打开 Bill usage in Credits
  2. Credit Entitlement: 选择 API Tokens
  3. Meter units per credit: 1 —— 事件中的每个代币映射到扣除的 1 个信用
  4. Free Threshold: 0 —— 信用分配本身是客户的“免费层级”;我们不需要额外的免费带宽
启用 Bill usage in Credits 并选择 API Tokens 的计量器

Toggle 'Bill usage in Credits' on the meter and pick the credit entitlement.

这就是使传入的 api.tokens_used 事件实际扣除客户余额的连接。
3

Configure credit issuance for Starter

仍在产品上,向下滚动到信用配置部分,附加信用计费计量器后会出现:每个计费周期发放的信用额度: 10000000允许超额使用: 禁用 —— 入门客户在代币用尽时被阻止导入默认信用设置: 启用 —— 使用来自信用授权的 30 天到期
具有每周期金额和超额使用设置的信用配置表单

Configure credit issuance per cycle on the UBB product.

点击 Save 并复制产品 ID。
入门计划:$29/月基础费用,10M代币/周期,在零时阻止,通过计量器自动扣除。

专业计划 ($99/月 — 40M 代币,启用超额使用)

1

Create the Pro UBB product

与入门计划相同的流程,但数字更大:Product Name: NeuralAPI ProDescription: 40 million API tokens per month with overage. Built for production applications.Fixed Price: 99.00Billing Cycle: MonthlyCurrency: USD
2

Attach the meter

与入门计划相同:添加 Token Usage Meter,切换 Bill usage in Credits,选择 API TokensMeter units per credit 1Free Threshold 0
3

Configure credit issuance with overage

配置信用发行,这次启用超额使用:每个计费周期发放的信用额度: 40000000导入默认信用设置: 禁用 —— 我们需要每个产品自定义超额设置允许超额使用: 启用单位价格: 0.000005 美元每代币(即 0.005每千代币,或0.005 每千代币,或 5 每百万代币——高于计划的有效代币单价以防止外溢)超额行为: Bill overage at billing —— 超额将在下一个发票中收费,然后余额重置保存产品并复制产品 ID。
专业计划:99/月基础费用,40M代币/周期,超额使用为99/月基础费用,40M代币/周期,超额使用为 0.005/1K 代币,通过计量器自动扣除。

第四步:创建代币充值包

充值包是一次性购买,为现有客户余额增加 5,000,000 代币。
产品定价部分选择单次支付

Single Payment pricing selected for a one-time credit product.

1

Create a one-time product

  1. 转到 Products → Create Product
  2. 选择 Single Payment 作为定价类型
  3. 填写:
Product Name: Token Top-Up PackDescription: Instantly add 5 million tokens to your NeuralAPI balance.Price: 19.00Currency: USD
2

Attach the token credit

  1. Entitlements 部分,点击 AttachCredits 旁边
  2. 选择 API Tokens
  3. 设置 Credits issued: 5000000
  4. 禁用 导入默认信用设置 —— 我们希望覆盖默认的 30 天到期
  5. 设置 Credit Expiry: 365 days
  6. 保存产品
复制产品 ID。
为什么充值包的到期时间更长?订阅信用每 30 天重置一次,因为这就是周期。充值包是预付费购买——客户预先支付了 $19,合理预期这些代币将持续超过一个月。365 天的期限与 OpenAI、AWS 和 Anthropic 的真实预付费信用相匹配,同时仍然封顶您的责任,使客户无法无限期囤积。
充值包已配置——购买后即可授予 5,000,000 代币,这些代币在 365 天内有效。

第五步:构建后端

现在让我们构建一个 Express 服务器来处理订阅结账、充值结账、带有代币计费的真正 OpenAI 完成、余额查询和信用 webhook 事件。
1

Set up your project

创建 tsconfig.json
tsconfig.json
更新 package.json 脚本:
package.json
2

Set up environment variables

使用您在前面步骤中获取的凭据和 ID 创建 .env
.env
切勿将 .env 提交到版本控制。立即将其添加到 .gitignore
您将在步骤 7 注册您的 webhook 端点后填写 DODO_PAYMENTS_WEBHOOK_KEY
3

Implement the server

创建 src/server.ts
后端完成:订阅结账、充值结账、带有计量代币计费的 OpenAI 完成、余额查询和经过验证的 webhook 处理程序。
@dodopayments/ingestion-blueprints 提供自动进行 usageEvents.ingest 调用的即插即用跟踪器,包括 LLM Blueprint, API gateway, object storage, streams, 和 time-range 使用。
4

A note on how deductions actually happen

您可能已经注意到,没有明确的“扣除 N 个信用”的调用。这是设计使然:
  1. 您的处理程序调用 OpenAI 并返回 usage.total_tokens(例如,1532)。
  2. 您摄入一个使用事件:event_name: api.tokens_used, metadata: { tokens: 1532 }
  3. Token Usage Meter 按客户聚合事件。
  4. 因为计量器连接到带有 Bill usage in CreditsAPI Tokens 信用,Dodo Payments 从客户的最早未过期授予中扣除 1532 个信用(FIFO)。
  5. 如果启用了超额使用且客户低于零,则赤字会在下一张发票中跟踪和计费。
计量器处理所有这些。您的代码只需摄入事件。

第六步:添加演示前端

创建 public/index.html 来测试您浏览器中的所有流程。我们将客户 ID 保存在 localStorage 中,以便订阅 → 生成 → 充值都共享相同身份,模拟登录应用程序:

第七步:连接 Webhook

Webhooks 使您的服务器能够响应余额变化——您将使用它们在客户达到零之前发送“余额不足”电子邮件。
1

Expose your local server

Webhooks 需要一个公共 URL。对于本地开发,使用 ngrok 或其他隧道:
复制 https://...ngrok-free.app URL。
2

Register the webhook in Dodo Payments

  1. 在仪表板中,转到 Developers → Webhooks → Add Endpoint
  2. URL: https://your-tunnel.ngrok-free.app/webhooks/dodo
  3. 至少订阅:
    • credit.added
    • credit.deducted
    • credit.overage_charged
  4. 保存并复制 Signing Secret
  5. 将其粘贴到 .env 中作为 DODO_PAYMENTS_WEBHOOK_KEY,然后重启 npm run dev
SDK 的 dodo.webhooks.unwrap() 使用您的签名秘密验证 webhook-id, webhook-timestampwebhook-signature 标头。您无需手动进行 HMAC 验证——而且您不应该,因为 Dodo Payments 使用 Standard Webhooks,签署 id.timestamp.body 而不仅仅是主体。

第八步:测试整个流程

1

Subscribe a test customer

  1. 运行 npm run dev
  2. 打开 http://localhost:3000
  3. 选择 Pro Plan,输入测试电子邮件 + 名称,点击 Get Checkout Link,使用 测试卡详情 完成结账
  4. 在仪表板中,转到 Customers → 最新 并复制 cus_... ID
  5. 将其粘贴到演示中的“登录客户 ID”字段并点击 Save
客户应拥有 40,000,000 代币。点击 Refresh Balance 以确认。
2

Generate a real AI response

输入提示并点击 Generate。服务器调用 OpenAI,获取实际的 total_tokens,摄入使用事件,并返回响应。
使用事件由后台工作程序每隔大约 1 分钟处理一次。余额不会立即减少——等待 30–90 秒,然后再次点击 Refresh Balance。如果第一次刷新没有显示变化,不要认为它已中断。
3

Test the top-up flow

点击 Buy 5M Tokens — $19 并完成结账。付款成功后,刷新余额——它应增加 5,000,000 代币。您的服务器日志应显示 credit.added 事件。

故障排除

可能的原因:
  • 计量器的事件名称与您发送的 event_name 不匹配(api.tokens_used 区分大小写)
  • 计量器未链接到产品上的 API Tokens 信用——转到产品的计量器配置并确认 Bill usage in Credits 已启用
  • metadata.tokens 键与计量器的“Over Property”字段不匹配
  • 客户的授予已过期(查看客户的信用历史)
检查内容:
  1. Products → Meters:打开计量器并确认其在产品附件上显示链接的信用名称
  2. 计量器上的 Events 标签 —— 即使在扣除之前,已摄入的事件也应显示在那里
  3. Customers → [Customer] → Credits:分类帐条目应在一到两分钟内出现
可能的原因:
  • 客户尚未完成结账 —— 信用在成功付款后才会发放
  • 您使用的 customer_id 查询不正确(使用来自仪表板的 cus_... ID,而不是您自己的数据库 ID)
  • CREDIT_ENTITLEMENT_ID.env 中与附加到产品的信用不匹配
检查内容: 打开 Customers → [Customer] → Credits。如果没有信用出现在那里,则产品授权未附加或付款未完成。
可能的原因:
  • Pro 产品的信用附件 上未启用超额使用(信用级别设置只是默认值)
  • 客户实际上在入门计划,而不是专业计划
  • 超额使用限制设置为 0
检查内容: 编辑 Pro → Entitlements → Credits → 确认 Allow Overage 已启用并且 单位价格0.000005 (= 每百万代币 $5;再次检查前导零——字段填的是每代币价格,而不是每千)
可能的原因:
  • 身体解析顺序:express.json()/webhooks/dodo 之前应用于 express.raw() —— SDK 需要请求的原始字节,而不是解析的 JSON
  • DODO_PAYMENTS_WEBHOOK_KEY 中的签名秘钥错误
  • 反向代理正在重写标头
检查内容: 确认 app.use('/webhooks/dodo', express.raw(...)) 行在 app.use(express.json()) 之前server.ts 中。

需要帮助?

恭喜!您已为 NeuralAPI 构建基于信用的计费

您的平台现在拥有完整、生产就绪的信用计费系统:

Token Credit Entitlement

可重复使用的 API Tokens 信用,30 天到期,适用于所有计划和充值包

Tiered Plans, One Credit

入门计划(10M,硬限制)和专业计划(40M + 超额)按产品配置,无需重复信用

One-Time Top-Up Pack

客户添加 5M 代币,费用为 $19,无需更改订阅

Auto-Deduction via Meter

真正的 OpenAI 代币计数作为事件摄入;计量器在不进行手动跟踪的情况下按 FIFO 扣除信用

Live Balance API

通过 SDK 提供的实时余额以限制访问、显示使用情况或在应用程序中警告客户

Verified Webhook Pipeline

信用分类帐事件(credit.added, credit.deducted, credit.overage_charged)通过使用 SDK 的标准 Webhook 助手进行签名验证的处理程序路由
准备上线? 收紧以下内容:
  • /credits/:customerId/api/generate 上进行身份验证——目前任何人都可以使用任何客户 ID 访问这些接口。验证用户并在服务器端查找他们的客户 ID。
  • 稳定的 event_id——示例使用 Date.now() + random。在生产中,使用您的请求 ID 以便重试时幂等(Dodo Payments 通过 event_id 进行去重)。
  • 持久化客户↔用户映射——在首次结账后将 customer_id 存储在数据库中,以便您不需要手动粘贴步骤。
  • 决定订阅结束时会发生什么。 计划信用在其自然到期(自发放之日起 30 天)前将在客户的分类帐中保留,而充值信用在 365 天内保持有效——但食谱中的 /api/generate 仅检查余额,而不是订阅状态。因此,已取消的客户仍可以使用他们剩余的代币。这是消费者友好的默认设置。如果您想要更严格的权限控制,则可以 (a) 听 subscription.cancelled webhook 并限制 /api/generate 的订阅状态,或者 (b) 调用 Dodo 的分类帐 API 以在取消时借记未使用的计划信用,同时保留充值信用不变。
  • 监控使用计费仪表板以便及早发现计量异常。

Credit-Based Billing Reference

完整的 CBB 文档:滚动、超额模式、分类帐管理、所有 API 端点。

Credit Webhook Events

您的服务器可能接收到的每个信用事件的有效负载模式。
最后修改于 2026年7月21日