Hoppa till huvudinnehåll
Rust SDK ger bekväm, async-first tillgång till Dodo Payments REST API från applikationer skrivna i Rust. Det erbjuder starkt typade requests och svar, inbyggda pagineringshjälpare och konfigurerbara tidsgränser och miljöer.

Installation

Lägg till SDK till ditt projekt med Cargo:
cargo add dodopayments
Eller lägg till det manuellt i din Cargo.toml:
[dependencies]
dodopayments = "1.106.0"
tokio = { version = "1", features = ["full"] }
serde_json = "1"
futures = "0.3" # required for streaming paginated results
SDK kräver Rust 1.75 eller senare och använder moderna async-funktioner för optimal prestanda.

Snabbstart

Klienten läser din API-nyckel från miljövariabeln DODO_PAYMENTS_API_KEY som standard. Initiera klienten och skapa din första checkout-session:
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(())
}
Förvara alltid dina API-nycklar säkert med miljövariabler. Hårdkoda dem aldrig i din källkod.

Kärnfunktioner

Async First

Byggd på Tokio och reqwest med async/await-stöd genomgående

Strong Typing

Starkt typade requests och svar för säkerhet vid kompilering

Auto-Pagination

Strömma varje objekt över sidor eller gå vidare en sida i taget

Configurable

Konfigurera miljöer, tidsgränser och bas-URL:er per klient

Konfiguration

Miljövariabler

Som standard läser Client::from_env() din API-nyckel från miljövariabeln DODO_PAYMENTS_API_KEY och använder standard bas-URL om du inte ställer in DODO_PAYMENTS_BASE_URL:
export DODO_PAYMENTS_API_KEY="your_api_key"
export DODO_PAYMENTS_BASE_URL="https://test.dodopayments.com" # optional
Du kan också konfigurera klienten explicit. Client::new returnerar en Result, så avkoda den med ? inuti en funktion som returnerar 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(())
}

Miljöer

NamnBas-URL
live_modehttps://live.dodopayments.com
test_modehttps://test.dodopayments.com
Standard bas-URL är https://live.dodopayments.com. Välj en annan miljö med enum Environment istället för att hårdkoda URL:er:
use dodopayments::{Client, ClientConfig, Environment};

let client = Client::new(
    ClientConfig::from_environment(Environment::TestMode).with_api_key("My API Key"),
)?;
För att fortsätta läsa API-nyckeln från DODO_PAYMENTS_API_KEY via from_env() när du riktar in dig på en icke-standardmiljö, åsidosätt den i konfigurationen:
use dodopayments::{Client, ClientConfig, Environment};

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

Tidsgränser

Standard tidsgräns för förfrågningar är 30 sekunder. Åsidosätt det per klient:
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)),
)?;

Vanliga operationer

Skapa en Checkout-session

Generera en checkout-session:
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:?}");

Hantera Kunder

Skapa och hämta kundinformation:
// 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:?}");

Hantera Prenumerationer

Skapa och hantera återkommande prenumerationer:
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 kräver minst den tvåbokstaviga ISO-koden country. customer är en CustomerRequest enum — pass AttachExisting för en befintlig kund eller New för en ny. Beloppsfält som product_price är i den lägsta valutadenominationen (t.ex., 2500 = $25.00 USD).

Användningsbaserad Fakturering

Samla in Användningshändelser

Spåra anpassade händelser:
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:?}");

Lista Användningshändelser

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:?}");
}

Paginering

Listendpunkter returnerar en typad sida vars items-fält håller den aktuella sidan av resultat. Strömma varje objekt över alla sidor med 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:?}");
}
Eller gå vidare en sida i taget med 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,
    }
}

Felhantering

Varje metod returnerar en dodopayments::Result<T>. Fel representeras av enum dodopayments::Error. Matcha på den för att hantera API-fel åtskilt från transportfel:
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}"),
}

Odokumenterade Endpunkter

För att anropa en endpunkt som ännu inte exponeras som en typad metod, använd den låg-nivå request-byggaren, som tillämpar autentisering och bas-URL:
let response = client
    .request(reqwest::Method::GET, "/some/path")
    .send()
    .await?;

Resurser

GitHub Repository

Visa källkod och bidra

Crates.io

Visa det publicerade packet och versionerna

API Reference

Komplett API-dokumentation

Discord Community

Få hjälp och anslut med utvecklare

Support

Behöver du hjälp med Rust SDK?

Bidra

Vi välkomnar bidrag! Kolla in bidragsriktlinjerna för att komma igång.
Senast ändrad 26 juni 2026