> ## 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

> دمج مدفوعات دودي في تطبيقاتك المكتوبة بلغة كوتلن باستخدام الكوروتينات الحديثة والأمان من القيم الفارغة

يوفر SDK كوتلن وصولاً مريحًا إلى واجهة برمجة تطبيقات REST الخاصة بمدفوعات دودي من التطبيقات المكتوبة بلغة كوتلن. يتميز بقيم قابلة للتفريغ، وتسلسل، ودوال مؤجلة، وميزات أخرى خاصة بكوتلن للاستخدام المريح.

## التثبيت

### Gradle (Kotlin DSL)

أضف التبعية إلى `build.gradle.kts`:

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

### Maven

أضف التبعية إلى `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>
  استخدم دائمًا أحدث إصدار من SDK للوصول إلى أحدث ميزات Dodo Payments. تحقق من [Maven Central](https://central.sonatype.com/artifact/com.dodopayments.api/dodo-payments-kotlin) للحصول على الإصدار الأحدث.
</Tip>

<Info>
  يتطلب الـ SDK جافا 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>
  قم دائمًا بتخزين مفاتيح واجهة برمجة التطبيقات بأمان باستخدام متغيرات البيئة أو تكوين مشفر. لا تقم أبدًا بالتزامن إلى نظام التحكم في الإصدارات.
</Warning>

## الميزات الأساسية

<CardGroup cols={2}>
  <Card title="Coroutines" icon="bolt">
    دعم كامل لكوروتينات Kotlin للعمليات غير المتزامنة
  </Card>

  <Card title="Null Safety" icon="shield-check">
    استفد من أمان null في Kotlin لمعالجة أخطاء قوية
  </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 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>
  استخدم `runCatching` في Kotlin لمنهج أكثر وظيفية لمعالجة الأخطاء باستخدام أنواع Result.
</Tip>

## تكامل Android

استخدم مع تطبيقات Android:

```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">
    وثائق كاملة لواجهة برمجة التطبيقات
  </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>

## الدعم

تحتاج إلى مساعدة بشأن 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؟

* **ديكورد**: انضم إلى [الخادم المجتمعي](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) للبدء.
