SDK Kotlin cung cấp quyền truy cập thuận tiện vào API REST Dodo Payments từ các ứng dụng viết bằng Kotlin. Nó có các giá trị có thể null, Sequence, các hàm suspend và các tính năng đặc trưng khác của Kotlin để sử dụng một cách dễ dàng.
Cài đặt
Gradle (Kotlin DSL)
Thêm phụ thuộc vào build.gradle.kts:
implementation ( "com.dodopayments.api:dodo-payments-kotlin:1.61.5" )
Maven
Thêm phụ thuộc vào pom.xml:
< dependency >
< groupId > com.dodopayments.api </ groupId >
< artifactId > dodo-payments-kotlin </ artifactId >
< version > 1.61.5 </ version >
</ dependency >
Luôn sử dụng phiên bản SDK mới nhất để truy cập các tính năng mới nhất của Dodo Payments. Kiểm tra Maven Central để biết phiên bản mới nhất.
SDK yêu cầu Kotlin 1.6 trở lên và tương thích với cả nền tảng JVM và Android.
Bắt đầu nhanh
Khởi tạo client và tạo một phiên giao dịch thanh toán:
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 ())
Luôn lưu trữ các khóa API của bạn một cách an toàn bằng cách sử dụng biến môi trường hoặc cấu hình mã hóa. Không bao giờ cam kết chúng vào kiểm soát phiên bản.
Tính năng chính
Coroutines Hỗ trợ đầy đủ cho coroutines Kotlin cho các hoạt động bất đồng bộ
Null Safety Tận dụng tính năng an toàn với null của Kotlin để xử lý lỗi mạnh mẽ
Extension Functions Các hàm mở rộng theo kiểu idiomatic Kotlin để tăng cường chức năng
Data Classes Các lớp dữ liệu an toàn kiểu với hỗ trợ sao chép và phân tách
Cấu hình
Từ biến môi trường
Khởi tạo từ biến môi trường hoặc thuộc tính hệ thống:
val client: DodoPaymentsClient = DodoPaymentsOkHttpClient. fromEnv ()
Cấu hình thủ công
Cấu hình thủ công với tất cả các tùy chọn:
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 ()
Chế độ thử nghiệm
Cấu hình cho môi trường thử nghiệm/sandbox:
val testClient = DodoPaymentsOkHttpClient. builder ()
. fromEnv ()
. testMode ()
. build ()
Thời gian chờ và thử lại
Cấu hình toàn cục hoặc theo yêu cầu:
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 ()
)
Các hoạt động thông thường
Tạo một phiên giao dịch thanh toán
Tạo một phiên giao dịch thanh toán:
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 () } " )
Tạo một sản phẩm
Tạo sản phẩm với cấu hình chi tiết:
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 () } " )
Kích hoạt khóa bản quyền
Kích hoạt các khóa bản quyền cho khách hàng:
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 } " )
}
Thanh toán dựa trên mức sử dụng
Ghi lại sự kiện sử dụng
Theo dõi mức sử dụng cho các đồng hồ đo:
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" )
Các hoạt động bất đồng bộ
Client bất đồng bộ
Sử dụng client bất đồng bộ cho các hoạt động dựa trên 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 () } " )
}
Xử lý lỗi
Xử lý lỗi với xử lý ngoại lệ của 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 } " )
}
Xử lý lỗi chức năng
Sử dụng Result cho xử lý lỗi chức năng:
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 } " ) }
Sử dụng runCatching của Kotlin để có cách tiếp cận chức năng hơn trong việc xử lý lỗi với các loại Result.
Tích hợp Android
Sử dụng với các ứng dụng 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)
}
}
}
}
Xác thực phản hồi
Bật xác thực phản hồi:
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 ()
Tính năng nâng cao
Cấu hình proxy
Cấu hình các thiết lập 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 ()
Cấu hình tạm thời
Thay đổi cấu hình client tạm thời:
val customClient = client. withOptions {
it. baseUrl ( "https://example.com" )
it. maxRetries ( 5 )
}
Tích hợp Ktor
Tích hợp với các ứng dụng máy chủ 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))
}
}
}
}
Tài nguyên
Hỗ trợ
Cần trợ giúp với SDK Kotlin?
Đóng góp
Chúng tôi hoan nghênh các đóng góp! Kiểm tra hướng dẫn đóng góp để bắt đầu.