SDK Kotlin menyediakan akses yang nyaman ke Dodo Payments REST API dari aplikasi yang ditulis dalam Kotlin. Ini memiliki nilai nullable, Sequence, fungsi suspend, dan fitur khusus Kotlin lainnya untuk penggunaan yang ergonomis.
Instalasi
Gradle (Kotlin DSL)
Tambahkan dependensi ke build.gradle.kts Anda:
implementation ( "com.dodopayments.api:dodo-payments-kotlin:1.61.5" )
Maven
Tambahkan dependensi ke pom.xml Anda:
< dependency >
< groupId > com.dodopayments.api </ groupId >
< artifactId > dodo-payments-kotlin </ artifactId >
< version > 1.61.5 </ version >
</ dependency >
Selalu gunakan versi SDK terbaru untuk mengakses fitur Dodo Payments terbaru. Periksa Maven Central untuk versi terbaru.
SDK memerlukan Kotlin 1.6 atau lebih tinggi dan kompatibel dengan platform JVM dan Android.
Memulai Cepat
Inisialisasi klien dan buat sesi checkout:
import com.dodopayments.api.client.DodoPaymentsClient
import com.dodopayments.api.client.okhttp.DodoPaymentsOkHttpClient
import com.dodopayments.api.models.checkoutsessions.CheckoutSessionRequest
import com.dodopayments.api.models.checkoutsessions.CheckoutSessionResponse
// 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 (CheckoutSessionRequest.ProductCart. builder ()
. productId ( "product_id" )
. quantity ( 1 )
. build ())
. build ()
val checkoutSessionResponse: CheckoutSessionResponse = client. checkoutSessions (). create (params)
println (checkoutSessionResponse. sessionId ())
Selalu simpan kunci API Anda dengan aman menggunakan variabel lingkungan atau konfigurasi terenkripsi. Jangan pernah mengkomitnya ke kontrol versi.
Fitur Utama
Coroutines Dukungan penuh untuk coroutine Kotlin untuk operasi asinkron
Null Safety Manfaatkan keamanan null Kotlin untuk penanganan kesalahan yang kuat
Extension Functions Ekstensi idiomatik Kotlin untuk fungsionalitas yang lebih baik
Data Classes Kelas data yang aman tipe dengan dukungan salin dan destrukturisasi
Konfigurasi
Dari Variabel Lingkungan
Inisialisasi dari variabel lingkungan atau properti sistem:
val client: DodoPaymentsClient = DodoPaymentsOkHttpClient. fromEnv ()
Konfigurasi Manual
Konfigurasi secara manual dengan semua opsi:
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 ()
Mode Uji
Konfigurasi untuk lingkungan uji/sandbox:
val testClient = DodoPaymentsOkHttpClient. builder ()
. fromEnv ()
. testMode ()
. build ()
Timeout dan Pengulangan
Konfigurasi secara global atau per permintaan:
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 ()
)
Operasi Umum
Buat Sesi Checkout
Hasilkan sesi checkout:
val params = CheckoutSessionRequest. builder ()
. addProductCart (CheckoutSessionRequest.ProductCart. builder ()
. productId ( "prod_123" )
. quantity ( 1 )
. build ())
. returnUrl ( "https://yourdomain.com/return" )
. build ()
val session = client. checkoutSessions (). create (params)
println ( "Checkout URL: ${ session. url () } " )
Buat Produk
Buat produk dengan konfigurasi terperinci:
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_GOODS)
. build ()
val product: Product = client. products (). create (createParams)
println ( "Created product ID: ${ product. productId () } " )
Aktifkan Kunci Lisensi
Aktifkan kunci lisensi untuk pelanggan:
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 } " )
}
Penagihan Berdasarkan Penggunaan
Catat Peristiwa Penggunaan
Lacak penggunaan untuk meter:
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" )
Operasi Asinkron
Klien Asinkron
Gunakan klien asinkron untuk operasi berbasis coroutine:
import com.dodopayments.api.client.DodoPaymentsClientAsync
import com.dodopayments.api.client.okhttp.DodoPaymentsOkHttpClientAsync
import kotlinx.coroutines.runBlocking
val asyncClient: DodoPaymentsClientAsync = DodoPaymentsOkHttpClientAsync. fromEnv ()
runBlocking {
val customer = asyncClient. customers (). retrieve ( "cust_123" )
println ( "Customer email: ${ customer. email () } " )
}
Penanganan Kesalahan
Tangani kesalahan dengan penanganan pengecualian Kotlin:
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 } " )
}
Penanganan Kesalahan Fungsional
Gunakan Result untuk penanganan kesalahan fungsional:
fun safeCreatePayment (client: DodoPaymentsClient ): Result < Payment > = runCatching {
client. payments (). create (params)
}
// Usage
safe CreatePayment (client)
. onSuccess { payment -> println ( "Created: ${ payment. id () } " ) }
. onFailure { error -> println ( "Error: ${ error.message } " ) }
Gunakan runCatching untuk pendekatan yang lebih fungsional dalam penanganan kesalahan dengan tipe Result.
Integrasi Android
Gunakan dengan aplikasi Android:
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)
}
}
}
}
Validasi Respons
Aktifkan validasi respons:
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 ()
Fitur Lanjutan
Konfigurasi Proxy
Konfigurasi pengaturan proxy:
import java.net.InetSocketAddress
import java.net.Proxy
val client = DodoPaymentsOkHttpClient. builder ()
. fromEnv ()
. proxy (
Proxy (
Proxy.Type.HTTP,
InetSocketAddress ( "proxy.example.com" , 8080 )
)
)
. build ()
Konfigurasi Sementara
Modifikasi konfigurasi klien sementara:
val customClient = client. withOptions {
it. baseUrl ( "https://example.com" )
it. maxRetries ( 5 )
}
Integrasi Ktor
Integrasikan dengan aplikasi server Ktor:
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))
}
}
}
}
Sumber Daya
Dukungan
Butuh bantuan dengan SDK Kotlin?
Kontribusi
Kami menyambut kontribusi! Periksa pedoman kontribusi untuk memulai.