- 创建自定义信用授权(代币)和自动扣除的计量器
- 将信用附加到订阅计划(有或没有超额使用)和一次性充值产品
- 连接真正的 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.
Navigate to Credits
- 登录您的 Dodo Payments 仪表板
- 在左侧栏中点击 Products
- 选择 Credits 标签
- 点击 Create Credit
Configure the credit unit
API TokensCredit Type: 选择 Custom UnitUnit Name: tokenPrecision: 0 (代币始终为整数)Credit Expiry: 30 days (信用在每个计费周期重置)Skip overage at the credit level
Save and copy the credit ID
cent_xxxxxxxxxxxx。API Tokens 信用授权已准备好。接下来,创建一个计量器,以便使用事件能自动驱动扣除。第二步:为代币使用创建计量器
计量器聚合传入的使用事件,并将其转换为信用扣除。您需要在创建计划产品之前准备好这个,因为您将在步骤 3 的产品创建期间附加它。Open the Meters section
- 在仪表板侧边栏中,转到 Products → Meters
- 点击 Create Meter
Configure the meter
Token Usage MeterEvent Name: api.tokens_used (此名称必须与您的应用程序发送的内容完全匹配)Aggregation Type: Sum —— 我们对来自每个事件的代币数量进行求和Over Property: tokens —— 每个事件中的元数据键,其值将被求和Measurement Unit: tokens保存计量器并复制其 ID —— 您将在附加到产品时引用它。第三步:创建计划产品
两个计划需要是使用计费产品,而不是普通订阅——计量器只能附加到 UBB 产品,您需要计量器在客户调用 API 时自动扣除信用。UBB 产品仍支持循环基础费用($29 / $99);在此基础上的使用以信用计费。

Usage Based Billing pricing type with meter configuration.
入门计划 ($29/月 — 10M 代币,无超额使用)
Create the Starter UBB product
- 转到 Products → Create Product
- 选择 Usage Based Billing 作为定价类型
- 填写:
NeuralAPI StarterDescription: 10 million API tokens per month. Perfect for individual developers and small projects.Fixed Price: 29.00 (循环基础费用——即使在使用前也每月收费)Billing Cycle: MonthlyCurrency: USDAttach the meter
Token Usage Meter。然后在计量器上:- 打开 Bill usage in Credits
- Credit Entitlement: 选择
API Tokens - Meter units per credit:
1—— 事件中的每个代币映射到扣除的 1 个信用 - Free Threshold:
0—— 信用分配本身是客户的“免费层级”;我们不需要额外的免费带宽

Toggle 'Bill usage in Credits' on the meter and pick the credit entitlement.
api.tokens_used 事件实际扣除客户余额的连接。Configure credit issuance for Starter
10000000允许超额使用: 禁用 —— 入门客户在代币用尽时被阻止导入默认信用设置: 启用 —— 使用来自信用授权的 30 天到期
Configure credit issuance per cycle on the UBB product.
专业计划 ($99/月 — 40M 代币,启用超额使用)
Create the Pro UBB product
NeuralAPI ProDescription: 40 million API tokens per month with overage. Built for production applications.Fixed Price: 99.00Billing Cycle: MonthlyCurrency: USDAttach the meter
Token Usage Meter,切换 Bill usage in Credits,选择 API Tokens,Meter units per credit 1, Free Threshold 0。Configure credit issuance with overage
40000000导入默认信用设置: 禁用 —— 我们需要每个产品自定义超额设置允许超额使用: 启用单位价格: 0.000005 美元每代币(即 5 每百万代币——高于计划的有效代币单价以防止外溢)超额行为: Bill overage at billing —— 超额将在下一个发票中收费,然后余额重置保存产品并复制产品 ID。第四步:创建代币充值包
充值包是一次性购买,为现有客户余额增加 5,000,000 代币。
Single Payment pricing selected for a one-time credit product.
Create a one-time product
- 转到 Products → Create Product
- 选择 Single Payment 作为定价类型
- 填写:
Token Top-Up PackDescription: Instantly add 5 million tokens to your NeuralAPI balance.Price: 19.00Currency: USDAttach the token credit
- 在 Entitlements 部分,点击 Attach 在 Credits 旁边
- 选择
API Tokens - 设置 Credits issued:
5000000 - 禁用 导入默认信用设置 —— 我们希望覆盖默认的 30 天到期
- 设置 Credit Expiry:
365 days - 保存产品
第五步:构建后端
现在让我们构建一个 Express 服务器来处理订阅结账、充值结账、带有代币计费的真正 OpenAI 完成、余额查询和信用 webhook 事件。Set up your project
tsconfig.json:package.json 脚本:Set up environment variables
.env:DODO_PAYMENTS_WEBHOOK_KEY。Implement the server
src/server.ts:A note on how deductions actually happen
- 您的处理程序调用 OpenAI 并返回
usage.total_tokens(例如,1532)。 - 您摄入一个使用事件:
event_name: api.tokens_used,metadata: { tokens: 1532 }。 Token Usage Meter按客户聚合事件。- 因为计量器连接到带有 Bill usage in Credits 的
API Tokens信用,Dodo Payments 从客户的最早未过期授予中扣除 1532 个信用(FIFO)。 - 如果启用了超额使用且客户低于零,则赤字会在下一张发票中跟踪和计费。
第六步:添加演示前端
创建public/index.html 来测试您浏览器中的所有流程。我们将客户 ID 保存在 localStorage 中,以便订阅 → 生成 → 充值都共享相同身份,模拟登录应用程序:
第七步:连接 Webhook
Webhooks 使您的服务器能够响应余额变化——您将使用它们在客户达到零之前发送“余额不足”电子邮件。Expose your local server
Register the webhook in Dodo Payments
- 在仪表板中,转到 Developers → Webhooks → Add Endpoint
- URL:
https://your-tunnel.ngrok-free.app/webhooks/dodo - 至少订阅:
credit.addedcredit.deductedcredit.overage_charged
- 保存并复制 Signing Secret
- 将其粘贴到
.env中作为DODO_PAYMENTS_WEBHOOK_KEY,然后重启npm run dev
第八步:测试整个流程
Subscribe a test customer
- 运行
npm run dev - 打开
http://localhost:3000 - 选择 Pro Plan,输入测试电子邮件 + 名称,点击 Get Checkout Link,使用 测试卡详情 完成结账
- 在仪表板中,转到 Customers → 最新 并复制
cus_...ID - 将其粘贴到演示中的“登录客户 ID”字段并点击 Save
Generate a real AI response
total_tokens,摄入使用事件,并返回响应。Test the top-up flow
credit.added 事件。故障排除
Credits not deducting after usage events
Credits not deducting after usage events
- 计量器的事件名称与您发送的
event_name不匹配(api.tokens_used区分大小写) - 计量器未链接到产品上的
API Tokens信用——转到产品的计量器配置并确认 Bill usage in Credits 已启用 metadata.tokens键与计量器的“Over Property”字段不匹配- 客户的授予已过期(查看客户的信用历史)
- Products → Meters:打开计量器并确认其在产品附件上显示链接的信用名称
- 计量器上的 Events 标签 —— 即使在扣除之前,已摄入的事件也应显示在那里
- Customers → [Customer] → Credits:分类帐条目应在一到两分钟内出现
Balance always shows 0 or 'customer not found'
Balance always shows 0 or 'customer not found'
- 客户尚未完成结账 —— 信用在成功付款后才会发放
- 您使用的
customer_id查询不正确(使用来自仪表板的cus_...ID,而不是您自己的数据库 ID) CREDIT_ENTITLEMENT_ID在.env中与附加到产品的信用不匹配
Overage not working for Pro plan customers
Overage not working for Pro plan customers
- 在 Pro 产品的信用附件 上未启用超额使用(信用级别设置只是默认值)
- 客户实际上在入门计划,而不是专业计划
- 超额使用限制设置为 0
0.000005 (= 每百万代币 $5;再次检查前导零——字段填的是每代币价格,而不是每千)`Webhook verification failed` in logs
`Webhook verification failed` in logs
- 身体解析顺序:
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
One-Time Top-Up Pack
Auto-Deduction via Meter
Live Balance API
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.cancelledwebhook 并限制/api/generate的订阅状态,或者 (b) 调用 Dodo 的分类帐 API 以在取消时借记未使用的计划信用,同时保留充值信用不变。 - 监控使用计费仪表板以便及早发现计量异常。