Skip to main content
TypeScript SDK 为服务器端 TypeScript 和 JavaScript 代码提供对 Dodo Payments REST API 的类型化访问。它包含每个请求和响应的类型定义、类型化错误、自动重试、超时和自动分页。

安装

使用包管理器安装 dodopayments 包:

快速开始

创建客户端,然后创建结账会话:
如果省略 bearerToken,客户端会读取 DODO_PAYMENTS_API_KEY 环境变量。如果省略 environment,客户端会连接到 live mode。test mode API key 仅适用于 environment: 'test_mode'。
将 API key 保存在环境变量或 secrets manager 中。切勿将其提交到版本控制系统,或在客户端代码中公开。

核心功能

TypeScript First

编辑器中会显示每个请求参数和响应字段的类型定义。

Auto-Pagination

使用 for await...of 进行迭代时,List 方法会为你获取下一页。

Error Handling

每个 HTTP error status 都有对应的类型化错误类,其中包含 status、headers 和 response body。

Smart Retries

对于 connection errors 和可重试的 status codes,默认重试两次,并使用 exponential backoff。

配置

环境变量

将 API key 存储在环境变量中:
.env
如果未传入相应选项,客户端会读取这些变量: 如果设置了 base URL,同时又传入 environment,构造函数会抛出 “Ambiguous URL” 错误。在这种情况下要使用 environment,请传入 baseURL: null。 要验证 webhook,请将原始请求 body 和 headers 传入 client.webhooks.unwrap(rawBody, { headers })。它会使用你的 webhook key 检查签名,并返回解析后的 event。client.webhooks.unsafeUnwrap(rawBody) 会在不验证的情况下解析 body,因此只能用于测试。请参阅 Webhooks。

超时配置

请求默认在 1 分钟后超时。在客户端或单个请求上以毫秒为单位设置 timeout:
请求超时时,SDK 会抛出 APIConnectionTimeoutError。超时的请求会重试,因此调用失败前可能需要比 timeout 更长的时间。

重试配置

在客户端或单个请求上设置 maxRetries:
SDK 会重试 connection errors,以及 status 为 408、409、429 或 500 及以上的响应。默认重试两次,并使用 exponential backoff。
请求仍然失败时,SDK 会抛出 DodoPayments.APIError 的子类。每个错误都有 status、headers 和 error 属性(后者为 response body)。使用 instanceof 检查特定类,例如 err instanceof DodoPayments.RateLimitError:

常见操作

本节中的示例使用 快速开始 中的 client。

创建结账会话

创建结账会话,然后将客户重定向到返回的 checkout_url:
每个 checkout_url 只能使用一次,并会在 24 小时后过期。有关每个会话选项,请参阅 Checkout Sessions。

管理客户

使用 email address 和 name 创建客户,然后通过 ID 获取该客户:

处理订阅

创建订阅、为按需订阅收费,并读取订阅的用量历史记录。
POST /subscriptions(SDK 的 subscriptions.create method)已弃用。它仍可用于现有集成,但新集成应通过 Checkout Session 创建订阅。
billing 只需要 country,即两位 ISO 国家代码。customer 接受 { customer_id } 以关联现有客户,或接受 { email, name? } 以创建客户。charge 用于按需订阅,product_price 使用最小货币单位。retrieveUsageHistory 返回分页列表,你可以按照自动分页中的示例进行迭代。

基于用量的计费

摄取用量事件

为客户发送用量事件:
event_id 是幂等键,因此应为每个事件提供唯一值。如果同一个 event_id 在单个请求中出现两次,整个请求都会被拒绝。如果某个 event_id 已经被摄取,则会忽略新事件。单个请求最多接受 1,000 个事件。timestamp 默认为当前时间;如果其早于当前时间超过 1 小时,或晚于当前时间超过 5 分钟,则会被拒绝。

获取用量事件

通过 event_id 获取单个事件,或按 customer、event name 和 time range 筛选事件列表:
usageEvents.list 还接受 meter_id,并返回分页列表。

Proxy 配置

要通过 proxy 发送请求,请将运行时的 proxy settings 传入 fetchOptions。

Node.js(使用 Undici)

传入 undici ProxyAgent 作为 dispatcher:

Bun

设置 proxy 选项:

Deno

使用 Deno.createHttpClient 创建 HTTP client,并将其作为 client 传入:

日志记录

使用 logLevel client option 或 DODO_PAYMENTS_LOG environment variable 设置 log level。client option 会覆盖 environment variable。
在 debug level 下,SDK 会记录每个 HTTP request 和 response,包括 headers 和 bodies。某些 authentication headers 会被隐藏,但 bodies 中的敏感数据仍可能可见。
日志级别按详细程度从高到低依次为:
  • 'debug':Debug messages、info、warnings 和 errors。
  • 'info':Info messages、warnings 和 errors。
  • 'warn':Warnings 和 errors。这是默认级别。
  • 'error':仅 errors。
  • 'off':不记录日志。
SDK 默认将日志记录到 console。要使用 pino、winston 或其他 logging library,请将 logger 作为 logger option 传入;logLevel 仍控制哪些 messages 会传递给它。日志 messages 仅用于调试,其格式可能在不同版本之间发生变化。

从 Node.js SDK 迁移

如果你使用旧版 Node.js SDK,请按照迁移指南进行升级。当前 SDK 使用内置的 fetch API,而不是 node-fetch;它需要 Node.js 20、TypeScript 4.9 和 Jest 28 或更高版本,并包含一个可更新大部分代码的迁移工具。

View Migration Guide

了解如何从 Node.js SDK 迁移到 TypeScript SDK

自动分页

List methods 返回分页结果。使用 for await...of 进行迭代,以获取每一页中的项目。SDK 会在需要时请求下一页:
如需一次处理一页,请读取 page.items,并调用 hasNextPage() 和 getNextPage():
要设置页面大小,请将 page_size 传入 list method,例如 client.payments.list({ page_size: 50 })。

要求

SDK 支持 TypeScript 4.9 或更高版本,以及以下运行时:
  • Web browsers(最新版本的 Chrome、Firefox、Safari、Edge 及其他浏览器)
  • Node.js 20 LTS 或更高版本(non-EOL)
  • Deno 1.28.0 或更高版本
  • Bun 1.0 或更高版本
  • Cloudflare Workers
  • Vercel Edge Runtime
  • Jest 28 或更高版本,并使用 "node" environment(不支持 "jsdom" environment)
  • Nitro 2.6 或更高版本
不支持 React Native。

资源

GitHub Repository

源代码、发行版本和完整的方法列表。

API Reference

每个 endpoint、parameter 和 response。

Discord Community

提出问题并与其他开发者交流。

Report Issues

报告 bug 或请求功能。

支持

如需 TypeScript SDK 方面的帮助:

贡献

如需参与贡献,请阅读贡献指南。
最后修改于 2026年9月26日