मुख्य सामग्री पर जाएं
Rust SDK Rust में लिखी गई एप्लिकेशनों से Dodo Payments REST API तक सुविधाजनक, async-प्रथम पहुँच प्रदान करता है। यह सख्ती से टाइप की गई अनुरोध और प्रतिक्रियाएँ, निर्मित पृष्ठांकन हेल्पर्स, और कॉन्फ़िगरेबल टाइमआउट्स और पर्यावरण प्रदान करता है।

इंस्टालेशन

Cargo के साथ अपने प्रोजेक्ट में SDK जोड़ें:
cargo add dodopayments
या इसे अपने Cargo.toml में मैन्युअल रूप से जोड़ें:
[dependencies]
dodopayments = "1.106.0"
tokio = { version = "1", features = ["full"] }
serde_json = "1"
futures = "0.3" # required for streaming paginated results
SDK को Rust 1.75 या बाद के संस्करण की आवश्यकता होती है, जो इष्टतम प्रदर्शन के लिए आधुनिक async सुविधाओं का लाभ उठाता है।

त्वरित प्रारंभ

क्लाइंट डिफ़ॉल्ट रूप से आपका API कुंजी DODO_PAYMENTS_API_KEY परिवेश वेरिएबल से पढ़ता है। क्लाइंट को प्रारंभ करें और अपनी पहली चेकआउट सेशन बनाएँ:
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(())
}
अपने API कुंजी को हमेशा सुरक्षित रूप से परिवेश वेरिएबल्स का उपयोग करके स्टोर करें। कभी भी इसे अपने स्रोत कोड में हार्ड कोड न करें।

मुख्य विशेषताएं

Async First

Tokio और reqwest पर आधारित कई समर्थन के साथ

Strong Typing

कंपाइल-टाइम सुरक्षा के लिए सख्ती से टाइप की गई अनुरोध और प्रतिक्रियाएँ

Auto-Pagination

पृष्ठों में हर आइटम को स्ट्रीम करें या एक समय में एक पृष्ठ को आगे बढ़ाएँ

Configurable

पर्यावरण, टाइमआउट्स, और बेस URL को प्रति क्लाइंट कॉन्फ़िगर करें

कॉन्फ़िगरेशन

पर्यावरण वेरिएबल्स

डिफ़ॉल्ट रूप से, Client::from_env() आपके API कुंजी को DODO_PAYMENTS_API_KEY परिवेश वेरिएबल से पढ़ता है और डिफ़ॉल्ट बेस URL का उपयोग करता है जब तक कि आप DODO_PAYMENTS_BASE_URL सेट नहीं करते:
export DODO_PAYMENTS_API_KEY="your_api_key"
export DODO_PAYMENTS_BASE_URL="https://test.dodopayments.com" # optional
आप क्लाइंट को स्पष्ट रूप से भी कॉन्फ़िगर कर सकते हैं। Client::new एक Result लौटाता है, इसलिए इसे ? के साथ अनलॉक करें जो एक 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(())
}

पर्यावरण

नामआधार URL
live_modehttps://live.dodopayments.com
test_modehttps://test.dodopayments.com
डिफ़ॉल्ट आधार URL https://live.dodopayments.com है। URLs को हार्ड-कोड करने के बजाय, Environment एनम का उपयोग करके किसी और पर्यावरण का चयन करें:
use dodopayments::{Client, ClientConfig, Environment};

let client = Client::new(
    ClientConfig::from_environment(Environment::TestMode).with_api_key("My API Key"),
)?;
एक गैर-डिफ़ॉल्ट पर्यावरण को लक्ष्य करने के दौरान DODO_PAYMENTS_API_KEY से API कुंजी की रीडिंग जारी रखने के लिए, इसे विन्यास में ओवरराइड करें:
use dodopayments::{Client, ClientConfig, Environment};

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

टाइमआउट्स

डिफ़ॉल्ट अनुरोध समय समाप्ति 30 सेकंड है। इसे प्रति क्लाइंट ओवरराइड करें:
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)),
)?;

सामान्य संचालन

एक चेकआउट सत्र बनाएँ

एक चेकआउट सत्र उत्पन्न करें:
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:?}");

ग्राहकों को प्रबंधित करें

ग्राहक जानकारी बनाएं और पुनः प्राप्त करें:
// 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:?}");

सब्सक्रिप्शन्स को संभालें

आवर्ती सब्सक्रिप्शन्स बनाएँ और प्रबंधित करें:
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 के लिए कम से कम दो-अक्षर का ISO country कोड जरूरी है। customer एक CustomerRequest एनम है - एक मौजूदा ग्राहक के लिए AttachExisting पास करें या एक नए के लिए New। राशि क्षेत्रों, जैसे product_price को न्यूनतम मुद्रा विभाजन में रखें (उदाहरण: 2500 = $25.00 USD)।

उपयोग-आधारित बिलिंग

उपयोग घटनाएँ इनजेस्ट करें

कस्टम इवेंट ट्रैक करें:
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:?}");

उपयोग घटनाएँ सूचीबद्ध करें

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

पृष्ठांकन

सूची अंत बिंदु एक टाइप की गई पृष्ठ लौटाते हैं जिसकी items फ़ील्ड वर्तमान परिणामों के पृष्ठ को रखती है। हर पृष्ठ के पार प्रत्येक आइटम को स्ट्रीम करें 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:?}");
}
या एक समय में एक पृष्ठ आगे बढ़ाएं 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,
    }
}

त्रुटि हैंडलिंग

प्रत्येक विधि एक dodopayments::Result<T> लौटाती है। असफलताओं का प्रतिनिधित्व dodopayments::Error एनम द्वारा किया जाता है। इसे हैंडल करने के लिए API त्रुटियों को ट्रांसपोर्ट त्रुटियों से अलग से मिलाएँ:
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}"),
}

अप्रलेखित अंत बिंदु

किसी अंत बिंदु को कॉल करने के लिए जो अभी तक टाइप की गई विधि के रूप में उजागर नहीं किया गया है, निम्न-स्तरीय request बिल्डर का उपयोग करें, जो प्रमाणीकरण और आधार URL लागू करता है:
let response = client
    .request(reqwest::Method::GET, "/some/path")
    .send()
    .await?;

संसाधन

GitHub Repository

स्रोत कोड देखें और योगदान करें

Crates.io

प्रकाशित क्रेट और संस्करण देखें

API Reference

पूर्ण API दस्तावेज़ीकरण

Discord Community

सहायता प्राप्त करें और डेवलपर्स के साथ जुड़ें

सहायता

Rust SDK के साथ मदद की जरूरत है?

योगदान

हम योगदान का स्वागत करते हैं! आरंभ करने के लिए योगदान दिशानिर्देश देखें।
अंतिम संशोधन 26 जून 2026