Chuyển đến nội dung chính
Rust SDK cung cấp khả năng truy cập tiện lợi, ưu tiên bất đồng bộ đến REST API của Dodo Payments từ các ứng dụng viết bằng Rust. Nó cung cấp các yêu cầu và phản hồi định kiểu mạnh mẽ, công cụ phân trang tích hợp sẵn, và khả năng cấu hình thời gian chờ và môi trường.

Cài đặt

Thêm SDK vào dự án của bạn với Cargo:
cargo add dodopayments
Hoặc thêm nó vào Cargo.toml của bạn thủ công:
[dependencies]
dodopayments = "1.106.0"
tokio = { version = "1", features = ["full"] }
serde_json = "1"
futures = "0.3" # required for streaming paginated results
SDK yêu cầu Rust 1.75 hoặc mới hơn, tận dụng các tính năng bất đồng bộ hiện đại để đạt hiệu suất tối ưu.

Bắt đầu nhanh

Client đọc khóa API của bạn từ biến môi trường DODO_PAYMENTS_API_KEY theo mặc định. Khởi tạo client và tạo phiên checkout đầu tiên của bạn:
use dodopayments::Client;

#[tokio::main]
async fn main() -> dodopayments::Result<()> {
    let client = Client::from_env()?;

    let result = client
        .checkout_sessions()
        .create()
        .body(dodopayments::models::CheckoutSessionsCreateParams {
            product_cart: Some(vec![dodopayments::models::ProductItemReq {
                product_id: "product_id".to_string(),
                quantity: 1,
                addons: None,
                amount: None,
                credit_entitlements: None,
            }]),
            ..Default::default()
        })
        .await?;

    println!("{result:?}");
    Ok(())
}
Luôn lưu trữ khóa API của bạn một cách an toàn bằng cách sử dụng biến môi trường. Không bao giờ mã hóa cứng chúng trong mã nguồn của bạn.

Tính năng cốt lõi

Async First

Được xây dựng trên Tokio và reqwest với hỗ trợ async/await xuyên suốt

Strong Typing

Yêu cầu và phản hồi định kiểu mạnh mẽ cho an toàn khi biên dịch

Auto-Pagination

Truyền trực tiếp mọi mục qua các trang hoặc tiến từng trang một

Configurable

Cấu hình môi trường, thời gian chờ, và URL nền tảng theo từng client

Cấu hình

Biến môi trường

Theo mặc định, Client::from_env() đọc khóa API của bạn từ biến môi trường DODO_PAYMENTS_API_KEY và sử dụng URL nền tảng mặc định trừ khi bạn đặt DODO_PAYMENTS_BASE_URL:
export DODO_PAYMENTS_API_KEY="your_api_key"
export DODO_PAYMENTS_BASE_URL="https://test.dodopayments.com" # optional
Bạn cũng có thể cấu hình client rõ ràng. Client::new trả về một Result, vì vậy hãy mở nó ra với ? bên trong một hàm trả về dodopayments::Result:
use dodopayments::{Client, ClientConfig};

#[tokio::main]
async fn main() -> dodopayments::Result<()> {
    let client = Client::new(
        ClientConfig::new("https://live.dodopayments.com").with_api_key("My API Key"),
    )?;
    println!("{}", client.base_url());
    Ok(())
}

Môi trường

NameBase URL
live_modehttps://live.dodopayments.com
test_modehttps://test.dodopayments.com
URL nền tảng mặc định là https://live.dodopayments.com. Chọn một môi trường khác với enum Environment thay vì mã hóa URL:
use dodopayments::{Client, ClientConfig, Environment};

let client = Client::new(
    ClientConfig::from_environment(Environment::TestMode).with_api_key("My API Key"),
)?;
Để tiếp tục đọc khóa API từ DODO_PAYMENTS_API_KEY qua from_env() trong khi nhắm mục tiêu đến một môi trường không mặc định, ghi đè nó trên cấu hình:
use dodopayments::{Client, ClientConfig, Environment};

let client = Client::new(ClientConfig::from_env()?.with_environment(Environment::TestMode))?;

Thời gian chờ

Thời gian chờ mặc định của yêu cầu là 30 giây. Ghi đè nó theo từng client:
use std::time::Duration;
use dodopayments::{Client, ClientConfig};

let client = Client::new(
    ClientConfig::new("https://live.dodopayments.com")
        .with_api_key("My API Key")
        .with_timeout(Duration::from_secs(60)),
)?;

Hoạt động phổ biến

Tạo phiên Checkout

Tạo một phiên checkout:
let session = client
    .checkout_sessions()
    .create()
    .body(dodopayments::models::CheckoutSessionsCreateParams {
        product_cart: Some(vec![dodopayments::models::ProductItemReq {
            product_id: "prod_123".to_string(),
            quantity: 1,
            addons: None,
            amount: None,
            credit_entitlements: None,
        }]),
        return_url: Some("https://yourdomain.com/return".to_string()),
        ..Default::default()
    })
    .await?;

println!("{session:?}");

Quản lý Khách hàng

Tạo và lấy thông tin khách hàng:
// Create a customer
let customer = client
    .customers()
    .create()
    .body(dodopayments::models::CustomerCreateParams {
        email: "customer@example.com".to_string(),
        name: "John Doe".to_string(),
        ..Default::default()
    })
    .await?;

// Retrieve a customer
let customer = client
    .customers()
    .retrieve("cus_123")
    .await?;

println!("{customer:?}");

Xử lý Đăng ký

Tạo và quản lý đăng ký định kỳ:
let subscription = client
    .subscriptions()
    .create()
    .body(dodopayments::models::SubscriptionCreateParams {
        billing: dodopayments::models::BillingAddress {
            country: "US".to_string(),
            city: "San Francisco".to_string(),
            state: "CA".to_string(),
            street: "1 Market St".to_string(),
            zipcode: "94105".to_string(),
        },
        customer: dodopayments::models::CustomerRequest::AttachExisting(
            dodopayments::models::AttachExistingCustomer {
                customer_id: "cus_123".to_string(),
            },
        ),
        product_id: "pdt_456".to_string(),
        quantity: 1,
        ..Default::default()
    })
    .await?;

println!("{subscription:?}");
billing yêu cầu tối thiểu mã ISO hai chữ country. customer là định danh CustomerRequest — truyền AttachExisting cho một khách hàng hiện có hoặc New cho một khách hàng mới. Các trường số lượng như product_price ở đơn vị tiền tệ thấp nhất (ví dụ: 2500 = $25.00 USD).

Thanh toán Dựa trên Sử dụng

Thu thập Sự kiện Sử dụng

Theo dõi các sự kiện tùy chỉnh:
let response = client
    .usage_events()
    .ingest()
    .body(dodopayments::models::UsageEventsIngestParams {
        events: vec![dodopayments::models::EventInput {
            event_id: "api_call_12345".to_string(),
            customer_id: "cus_abc123".to_string(),
            event_name: "api_request".to_string(),
            ..Default::default()
        }],
    })
    .await?;

println!("{response:?}");

Danh sách Sự kiện Sử dụng

let events = client
    .usage_events()
    .list()
    .query(serde_json::json!({
        "customer_id": "cus_abc123",
        "event_name": "api_request",
    }))
    .await?;

for event in &events.items {
    println!("{event:?}");
}

Phân trang

List endpoints trả về một trang có kiểu mà trường items giữ trang kết quả hiện tại. Truyền trực tiếp mọi mục qua tất cả các trang với into_stream:
use futures::StreamExt;

let mut items = Box::pin(
    client
        .payments()
        .list()
        .query(serde_json::json!({}))
        .await?
        .into_stream(),
);

while let Some(item) = items.next().await {
    let item = item?;
    println!("{item:?}");
}
Hoặc tiến từng trang một với get_next_page:
let mut page = client
    .payments()
    .list()
    .query(serde_json::json!({}))
    .await?;

loop {
    for item in &page.items {
        println!("{item:?}");
    }
    match page.get_next_page().await? {
        Some(next) => page = next,
        None => break,
    }
}

Xử lý Lỗi

Mỗi phương thức trả về một dodopayments::Result<T>. Các thất bại được đại diện bởi enum dodopayments::Error. Kiểm tra nó để xử lý lỗi API tách biệt khỏi lỗi truyền tải:
let result = client
    .checkout_sessions()
    .create()
    .body(dodopayments::models::CheckoutSessionsCreateParams {
        product_cart: Some(vec![dodopayments::models::ProductItemReq {
            product_id: "product_id".to_string(),
            quantity: 1,
            addons: None,
            amount: None,
            credit_entitlements: None,
        }]),
        ..Default::default()
    })
    .await;

match result {
    Ok(value) => println!("{value:?}"),
    Err(dodopayments::Error::Api { status, message }) => {
        eprintln!("API returned {status}: {message}");
    }
    Err(err) => eprintln!("request failed: {err}"),
}

Endpoint không Tài liệu

Để gọi một endpoint chưa được lộ ra dưới dạng phương thức có kiểu, sử dụng builder thấp request, áp dụng xác thực và URL nền tảng:
let response = client
    .request(reqwest::Method::GET, "/some/path")
    .send()
    .await?;

Tài nguyên

GitHub Repository

Xem mã nguồn và đóng góp

Crates.io

Xem crate và các phiên bản đã công bố

API Reference

Tài liệu API hoàn chỉnh

Discord Community

Nhận trợ giúp và kết nối với các nhà phát triển

Hỗ trợ

Cần hỗ trợ với Rust SDK?

Đóng góp

Chúng tôi hoan nghênh các đóng góp! Kiểm tra hướng dẫn đóng góp để bắt đầu.
Lần sửa đổi cuối 9 tháng 7, 2026