跳转到主要内容
本教程以一个文档生成工具为例,演示如何通过袋袋 PER_USE 计费模型实现按次收费。

你将构建什么

一个文档生成 SaaS——用户每次执行付费操作时,袋袋自动从其账户扣除相应积分:
  • 生成报告(generate_report)→ 扣 10 积分
  • 导出 PDF(export_pdf)→ 扣 5 积分
  • 生成摘要(generate_summary)→ 扣 3 积分
整个扣费流程由你的应用调用 SDK 完成,袋袋保证幂等与原子性。

前置条件

Step 1: 在 Studio 中配置计费事件

进入 袋袋 Studio → 你的 App → 计费事件,添加以下 Meter:
事件名称一旦创建后不可修改,请使用 snake_case 命名。单价可随时调整,调整后立即生效。

Step 2: 安装和初始化 SDK

Step 3: 实现计费上报

用户触发付费操作时,调用 reportEvent 上报计费事件。
idempotencyKey 是必填参数(最长 128 字符)。缺失时 API 将返回 400 错误。
响应结构:

Step 4: 预检余额

在执行耗时操作前,先检查用户余额是否充足,避免执行完成后才发现无法扣费:
预检只是用户体验优化——实际扣费仍可能因并发操作失败。始终处理 InsufficientBalance 错误。

Step 5: 处理扣费失败

错误处理策略:

Step 6: 幂等性最佳实践

idempotencyKey 保证同一业务操作不会被重复扣费。当请求超时或网络抖动时,可以安全重试。

幂等键设计原则

安全重试模式

重试时必须复用同一个 idempotencyKey。每次重试生成新 key 会导致重复扣费。

完整示例

一个文档生成服务的完整实现:

计费事件设计指南

单事件 vs 多事件

命名规范

  • 使用 snake_case
  • 以动词开头:generate_export_analyze_
  • 避免泛化命名(如 actionevent
  • 长度建议 ≤ 32 字符

粒度决策

一条经验法则:如果用户会把两个操作理解为”一件事”,它们应该合并为一个事件。如果用户会问”为什么这次扣了这么多”,说明粒度需要拆细。

常见问题

Q: 幂等键重复会怎样? API 返回 { idempotent_replay: true },不会重复扣费。charged 值为首次扣费金额。 Q: 预检余额后余额被其他操作扣光了怎么办? reportEvent 会返回 InsufficientBalance 错误。预检仅是用户体验优化,不能替代错误处理。 Q: 单价修改后已发出的请求按哪个价格? 按请求到达时的最新单价计算。修改立即生效,无过渡期。 Q: idempotencyKey 有过期时间吗? 有。相同 key 在 24 小时内有效,超过后视为新请求。 Q: 一次操作需要扣多个事件怎么办? 依次调用 reportEvent。每个事件使用独立的 idempotencyKey。如果中间失败,已扣费的事件不会自动退回——建议设计时尽量将一次用户操作映射为单个事件。

下一步

SDK 快速开始

OAuth 授权与基础事件上报

AI 按量计费

按 Token 用量计费的 AI 应用接入

调用平台专家

在你的 App 中嵌入 AI 专家能力

API 参考

Events API 完整端点文档