> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Kotlin

> अपने Kotlin अनुप्रयोगों में Dodo Payments को आधुनिक कोरूटीन और नल-सुरक्षा के साथ एकीकृत करें

Kotlin SDK Kotlin में लिखे गए अनुप्रयोगों से Dodo Payments REST API तक सुविधाजनक पहुंच प्रदान करता है। इसमें नल-संभाव्य मान, अनुक्रम, निलंबित कार्य और अन्य Kotlin-विशिष्ट सुविधाएँ शामिल हैं जो उपयोग में आरामदायक हैं।

## स्थापना

### ग्रेडल (Kotlin DSL)

अपने `build.gradle.kts` में निर्भरता जोड़ें:

```kotlin build.gradle.kts theme={null}
implementation("com.dodopayments.api:dodo-payments-kotlin:1.86.3")
```

### मेवेन

अपने `pom.xml` में निर्भरता जोड़ें:

```xml pom.xml theme={null}
<dependency>
  <groupId>com.dodopayments.api</groupId>
  <artifactId>dodo-payments-kotlin</artifactId>
  <version>1.86.3</version>
</dependency>
```

<Tip>
  नवीनतम Dodo Payments सुविधाओं को एक्सेस करने के लिए हमेशा नवीनतम SDK संस्करण का उपयोग करें। नवीनतम संस्करण के लिए [Maven Central](https://central.sonatype.com/artifact/com.dodopayments.api/dodo-payments-kotlin) देखें।
</Tip>

<Info>
  SDK को Java 8 या उससे ऊपर की आवश्यकता होती है और यह JVM और Android प्लेटफार्म दोनों के साथ संगत है।
</Info>

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

क्लाइंट को प्रारंभ करें और एक चेकआउट सत्र बनाएं:

```kotlin theme={null}
import com.dodopayments.api.client.DodoPaymentsClient
import com.dodopayments.api.client.okhttp.DodoPaymentsOkHttpClient
import com.dodopayments.api.models.checkoutsessions.CheckoutSessionCreateParams
import com.dodopayments.api.models.checkoutsessions.CheckoutSessionRequest
import com.dodopayments.api.models.checkoutsessions.ProductItemReq

// Configure using environment variables (DODO_PAYMENTS_API_KEY, DODO_PAYMENTS_BASE_URL)
// Or system properties (dodopayments.apiKey, dodopayments.baseUrl)
val client: DodoPaymentsClient = DodoPaymentsOkHttpClient.fromEnv()

val params: CheckoutSessionRequest = CheckoutSessionRequest.builder()
    .addProductCart(ProductItemReq.builder()
        .productId("product_id")
        .quantity(1)
        .build())
    .build()
    
val checkoutSessionResponse: CheckoutSessionResponse = client.checkoutSessions().create(params)
println(checkoutSessionResponse.sessionId())
```

<Warning>
  अपने API कुंजियों को हमेशा पर्यावरण चर या एन्क्रिप्टेड कॉन्फ़िगरेशन का उपयोग करके सुरक्षित रूप से संग्रहीत करें। उन्हें संस्करण नियंत्रण में कभी कमिट न करें।
</Warning>

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

<CardGroup cols={2}>
  <Card title="Coroutines" icon="bolt">
    असिंक्रोनस संचालन के लिए Kotlin कोरूटीन का पूर्ण समर्थन
  </Card>

  <Card title="Null Safety" icon="shield-check">
    मजबूत त्रुटि हैंडलिंग के लिए Kotlin की null सुरक्षा का लाभ उठाएँ
  </Card>

  <Card title="Extension Functions" icon="code">
    बेहतर कार्यक्षमता के लिए प्रासंगिक Kotlin एक्सटेंशन
  </Card>

  <Card title="Data Classes" icon="layer-group">
    कॉपी और डीस्ट्रक्चरिंग समर्थन के साथ टाइप-सुरक्षित डेटा क्लास
  </Card>
</CardGroup>

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

### पर्यावरण चर से

पर्यावरण चर या सिस्टम प्रॉपर्टीज़ से प्रारंभ करें:

```kotlin theme={null}
val client: DodoPaymentsClient = DodoPaymentsOkHttpClient.fromEnv()
```

### मैनुअल कॉन्फ़िगरेशन

सभी विकल्पों के साथ मैन्युअल रूप से कॉन्फ़िगर करें:

```kotlin theme={null}
import java.time.Duration

val client = DodoPaymentsOkHttpClient.builder()
    .bearerToken("your_api_key_here")
    .baseUrl("https://live.dodopayments.com")
    .maxRetries(3)
    .timeout(Duration.ofSeconds(30))
    .build()
```

### परीक्षण मोड

परीक्षण/सैंडबॉक्स वातावरण के लिए कॉन्फ़िगर करें:

```kotlin theme={null}
val testClient = DodoPaymentsOkHttpClient.builder()
    .fromEnv()
    .testMode()
    .build()
```

### टाइमआउट और पुनः प्रयास

वैश्विक या प्रति-निवेदन कॉन्फ़िगर करें:

```kotlin theme={null}
import com.dodopayments.api.core.RequestOptions

// Global configuration
val client = DodoPaymentsOkHttpClient.builder()
    .fromEnv()
    .timeout(Duration.ofSeconds(45))
    .maxRetries(3)
    .build()

// Per-request timeout override
val product = client.products().retrieve(
    "prod_123",
    RequestOptions.builder()
        .timeout(Duration.ofSeconds(10))
        .build()
)
```

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

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

एक चेकआउट सत्र उत्पन्न करें:

```kotlin theme={null}
val params = CheckoutSessionRequest.builder()
    .addProductCart(ProductItemReq.builder()
        .productId("prod_123")
        .quantity(1)
        .build())
    .returnUrl("https://yourdomain.com/return")
    .build()

val session = client.checkoutSessions().create(params)
println("Checkout URL: ${session.checkoutUrl()}")
```

### उत्पाद बनाएं

विस्तृत कॉन्फ़िगरेशन के साथ उत्पाद बनाएं:

```kotlin theme={null}
import com.dodopayments.api.models.products.Product
import com.dodopayments.api.models.products.ProductCreateParams
import com.dodopayments.api.models.misc.Currency
import com.dodopayments.api.models.misc.TaxCategory

val createParams = ProductCreateParams.builder()
    .name("Premium Subscription")
    .description("Monthly subscription with all features")
    .price(
        ProductCreateParams.RecurringPrice.builder()
            .currency(Currency.USD)
            .preTaxAmount(2999) // $29.99 in cents
            .paymentFrequencyInterval(ProductCreateParams.RecurringPrice.TimeInterval.MONTH)
            .paymentFrequencyCount(1)
            .build()
    )
    .taxCategory(TaxCategory.DIGITAL_PRODUCTS)
    .build()

val product: Product = client.products().create(createParams)
println("Created product ID: ${product.productId()}")
```

### लाइसेंस कुंजी सक्रिय करें

ग्राहकों के लिए लाइसेंस कुंजी सक्रिय करें:

```kotlin theme={null}
import com.dodopayments.api.models.licenses.LicenseActivateParams
import com.dodopayments.api.models.licenses.LicenseActivateResponse

val activateParams = LicenseActivateParams.builder()
    .licenseKey("XXXX-XXXX-XXXX-XXXX")
    .instanceName("user-laptop-01")
    .build()

try {
    val activationResult: LicenseActivateResponse = client.licenses()
        .activate(activateParams)

    println("License activated successfully")
    println("Instance ID: ${activationResult.instanceId()}")
    println("Expires at: ${activationResult.expiresAt()}")
} catch (e: UnprocessableEntityException) {
    println("License activation failed: ${e.message}")
}
```

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

### उपयोग घटनाओं को रिकॉर्ड करें

मीटर के लिए उपयोग को ट्रैक करें:

```kotlin theme={null}
import com.dodopayments.api.models.usageevents.UsageEventCreateParams
import java.time.OffsetDateTime

val usageParams = UsageEventCreateParams.builder()
    .meterId("meter_123")
    .customerId("cust_456")
    .value(150)
    .timestamp(OffsetDateTime.now())
    .build()

client.usageEvents().create(usageParams)
println("Usage event recorded")
```

## असिंक्रोनस संचालन

### असिंक्रोनस क्लाइंट

कोरूटीन-आधारित संचालन के लिए असिंक्रोनस क्लाइंट का उपयोग करें:

```kotlin theme={null}
import com.dodopayments.api.models.usageevents.EventInput
import com.dodopayments.api.models.usageevents.UsageEventIngestParams

val usageParams = UsageEventIngestParams.builder()
    .addEvent(EventInput.builder()
        .customerId("cust_456")
        .eventId("event_123")
        .eventName("api_call")
        .build())
    .build()

client.usageEvents().ingest(usageParams)
println("Usage event recorded")
```

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

Kotlin की अपवाद हैंडलिंग के साथ त्रुटियों को संभालें:

```kotlin theme={null}
import com.dodopayments.api.errors.*

try {
    val payment = client.payments().create(params)
    println("Success: ${payment.id()}")
} catch (e: AuthenticationException) {
    println("Authentication failed: ${e.message}")
} catch (e: InvalidRequestException) {
    println("Invalid request: ${e.message}")
    e.parameter?.let { println("Parameter: $it") }
} catch (e: RateLimitException) {
    println("Rate limit exceeded, retry after: ${e.retryAfter}")
} catch (e: DodoPaymentsServiceException) {
    println("API error: ${e.statusCode()} - ${e.message}")
}
```

### कार्यात्मक त्रुटि हैंडलिंग

सूचकात्मक त्रुटि हैंडलिंग के लिए `Result` का उपयोग करें:

```kotlin theme={null}
fun safeCreatePayment(client: DodoPaymentsClient): Result<Payment> = runCatching {
    client.payments().create(params)
}

// Usage
safeCreatePayment(client)
    .onSuccess { payment -> println("Created: ${payment.id()}") }
    .onFailure { error -> println("Error: ${error.message}") }
```

<Tip>
  Result प्रकारों के साथ त्रुटि हैंडलिंग के लिए अधिक कार्यात्मक दृष्टिकोण के लिए Kotlin के `runCatching` का उपयोग करें।
</Tip>

## एंड्रॉइड एकीकरण

एंड्रॉइड अनुप्रयोगों के साथ उपयोग करें:

```kotlin theme={null}
import android.app.Application
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.dodopayments.api.client.DodoPaymentsClient
import kotlinx.coroutines.launch

class PaymentViewModel(application: Application) : ViewModel() {
    private val client = DodoPaymentsOkHttpClient.builder()
        .bearerToken(BuildConfig.DODO_API_KEY)
        .build()
    
    fun createCheckout(productId: String) {
        viewModelScope.launch {
            try {
                val session = client.async().checkoutSessions().create(params)
                // Open checkout URL in browser or WebView
                openUrl(session.url())
            } catch (e: Exception) {
                handleError(e)
            }
        }
    }
}
```

## प्रतिक्रिया सत्यापन

प्रतिक्रिया सत्यापन सक्षम करें:

```kotlin theme={null}
import com.dodopayments.api.core.RequestOptions

// Per-request validation
val product = client.products().retrieve(
    "prod_123",
    RequestOptions.builder()
        .responseValidation(true)
        .build()
)

// Or validate explicitly
val validatedProduct = product.validate()
```

```kotlin theme={null}
import android.app.Application
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.dodopayments.api.client.DodoPaymentsClient
import kotlinx.coroutines.launch

class PaymentViewModel(application: Application) : ViewModel() {
    private val client = DodoPaymentsOkHttpClient.builder()
        .bearerToken(BuildConfig.DODO_API_KEY)
        .build()
    
    fun createCheckout(productId: String) {
        viewModelScope.launch {
            try {
                val session = client.async().checkoutSessions().create(params)
                // Open checkout URL in browser or WebView
                openUrl(session.checkoutUrl())
            } catch (e: Exception) {
                handleError(e)
            }
        }
    }
}
```

### प्रॉक्सी कॉन्फ़िगरेशन

प्रॉक्सी सेटिंग्स कॉन्फ़िगर करें:

```kotlin theme={null}
import java.net.InetSocketAddress
import java.net.Proxy

val client = DodoPaymentsOkHttpClient.builder()
    .fromEnv()
    .proxy(
        Proxy(
            Proxy.Type.HTTP,
            InetSocketAddress("proxy.example.com", 8080)
        )
    )
    .build()
```

### अस्थायी कॉन्फ़िगरेशन

क्लाइंट कॉन्फ़िगरेशन को अस्थायी रूप से संशोधित करें:

```kotlin theme={null}
val customClient = client.withOptions {
    it.baseUrl("https://example.com")
    it.maxRetries(5)
}
```

## Ktor एकीकरण

Ktor सर्वर अनुप्रयोगों के साथ एकीकृत करें:

```kotlin theme={null}
import io.ktor.server.application.*
import io.ktor.server.request.*
import io.ktor.server.response.*
import io.ktor.server.routing.*

fun Application.configureRouting() {
    val client = DodoPaymentsOkHttpClient.builder()
        .bearerToken(environment.config.property("dodo.apiKey").getString())
        .build()
    
    routing {
        post("/create-checkout") {
            try {
                val request = call.receive<CheckoutRequest>()
                val session = client.checkoutSessions().create(params)
                call.respond(mapOf("checkout_url" to session.url()))
            } catch (e: DodoPaymentsServiceException) {
                call.respond(HttpStatusCode.BadRequest, mapOf("error" to e.message))
            }
        }
    }
}
```

## संसाधन

<CardGroup cols={2}>
  <Card title="GitHub Repository" icon="github" href="https://github.com/dodopayments/dodopayments-kotlin">
    स्रोत कोड देखें और योगदान करें
  </Card>

  <Card title="API Reference" icon="book" href="/api-reference/introduction">
    पूर्ण API दस्तावेज़
  </Card>

  ```kotlin theme={null}
  import io.ktor.server.application.*
  import io.ktor.server.request.*
  import io.ktor.server.response.*
  import io.ktor.server.routing.*

  fun Application.configureRouting() {
      val client = DodoPaymentsOkHttpClient.builder()
          .bearerToken(environment.config.property("dodo.apiKey").getString())
          .build()
      
      routing {
          post("/create-checkout") {
              try {
                  val request = call.receive<CheckoutRequest>()
                  val session = client.checkoutSessions().create(params)
                  call.respond(mapOf("checkout_url" to session.checkoutUrl()))
              } catch (e: DodoPaymentsServiceException) {
                  call.respond(HttpStatusCode.BadRequest, mapOf("error" to e.message))
              }
          }
      }
  }
  ```

  <Card title="Report Issues" icon="bug" href="https://github.com/dodopayments/dodopayments-kotlin/issues">
    बग रिपोर्ट करें या सुविधाओं का अनुरोध करें
  </Card>
</CardGroup>

## समर्थन

Kotlin SDK के साथ मदद चाहिए?

* **Discord**: वास्तविक समय समर्थन के लिए हमारे [समुदाय सर्वर](https://discord.gg/bYqAp4ayYh) में शामिल हों
* **ईमेल**: [support@dodopayments.com](mailto:support@dodopayments.com) पर हमसे संपर्क करें
* **GitHub**: [रिपॉजिटरी](https://github.com/dodopayments/dodopayments-kotlin) पर एक समस्या खोलें

## योगदान

हम योगदान का स्वागत करते हैं! प्रारंभ करने के लिए [योगदान दिशानिर्देशों](https://github.com/dodopayments/dodopayments-kotlin/blob/main/CONTRIBUTING.md) की जांच करें.

Kotlin SDK में मदद चाहिए?

* **Discord**: वास्तविक समय समर्थन के लिए हमारे [समुदाय सर्वर](https://discord.gg/bYqAp4ayYh) से जुड़ें
* **Email**: हमें [support@dodopayments.com](mailto:support@dodopayments.com) पर संपर्क करें
* **GitHub**: [repository](https://github.com/dodopayments/dodopayments-kotlin) पर एक issue खोलें

## योगदान

हम योगदान का स्वागत करते हैं! शुरू करने के लिए [योगदान दिशानिर्देश](https://github.com/dodopayments/dodopayments-kotlin/blob/main/CONTRIBUTING.md) देखें।
