Skip to main content
Kotlin SDK cung cấp cho các ứng dụng Kotlin quyền truy cập có kiểu vào REST API của Dodo Payments. SDK sử dụng các kiểu Kotlin xuyên suốt: giá trị nullable cho những field có thể bị thiếu, Sequence để lặp qua các kết quả và suspend function cho các lệnh gọi bất đồng bộ.

Cài đặt

Gradle (Kotlin DSL)

Thêm phụ thuộc vào build.gradle.kts:
build.gradle.kts

Maven

Thêm phụ thuộc vào pom.xml:
pom.xml
Các bản phát hành SDK bổ sung khả năng hỗ trợ cho những thay đổi của API. Để tìm phiên bản mới nhất, hãy kiểm tra Maven Central.
SDK yêu cầu Java 8 trở lên. SDK chạy trên JVM và Android, đồng thời đi kèm các quy tắc keep cho ProGuard và R8.

Bắt đầu nhanh

Tạo client, sau đó tạo checkout session:
fromEnv() kết nối với live mode trừ khi DODO_PAYMENTS_BASE_URL hoặc dodopayments.baseUrl chỉ định khác. Để sử dụng test mode, xem Test Mode. API key của test mode chỉ hoạt động trong test mode.
Lưu API key trong environment variable hoặc secrets manager. Không bao giờ commit chúng vào version control.

Tính năng chính

Coroutines

Các method của async client là suspend function mà bạn gọi từ một coroutine.

Null Safety

Các field có thể bị thiếu là nullable type, không phải Optional.

Sequences

Trên synchronous client, autoPager() trả về một Sequence để tải thêm các page khi bạn lặp qua kết quả. Trên async client, method này trả về một Flow.

Immutable Models

Các model class là immutable, và toBuilder() trả về một builder cho bản sao đã được sửa đổi.

Cấu hình

Từ Environment Variable

fromEnv() đọc các setting của bạn từ environment variable hoặc system property. System property được ưu tiên:
API key được lấy từ DODO_PAYMENTS_API_KEY hoặc dodopayments.apiKey. Webhook signing secret được lấy từ DODO_PAYMENTS_WEBHOOK_KEY hoặc dodopayments.webhookKey, còn base URL được lấy từ DODO_PAYMENTS_BASE_URL hoặc dodopayments.baseUrl. Hãy tạo một client và tái sử dụng client đó, vì mỗi client có connection pool và thread pool riêng. Để xác thực webhook, truyền raw request body và header vào client.webhooks().unwrap(UnwrapWebhookParams.builder().body(rawBody).headers(headers).build()), trong đó headers là một com.dodopayments.api.core.http.Headers. Method này kiểm tra signature bằng webhook key của bạn và trả về event đã được parse, hoặc throw DodoPaymentsWebhookException. Nếu không có header, unwrap sẽ không xác minh signature. client.webhooks().unsafeUnwrap(rawBody) parse body mà không xác minh, vì vậy chỉ sử dụng method này để testing. Xem Webhooks.

Cấu hình thủ công

Thiết lập từng option trên builder:

Test Mode

Để sử dụng test mode (https://test.dodopayments.com), hãy gọi testMode() trên builder:

Timeout và Retry

Theo mặc định, client retry hai lần và timeout sau 1 phút. Client retry các lỗi kết nối và response có status 408, 409, 429 hoặc 500 trở lên, với exponential backoff. Thiết lập giá trị mặc định trên client hoặc truyền RequestOptions vào một call riêng lẻ:

Các thao tác phổ biến

Các ví dụ trong phần này sử dụng client từ Quick Start.

Tạo Checkout Session

Tạo checkout session, sau đó redirect customer đến checkout URL được trả về:
checkoutUrl() trả về một String? nullable. Mỗi checkout URL chỉ hoạt động một lần và hết hạn sau 24 giờ. Để xem mọi option của session, hãy xem Checkout Sessions.

Tạo Product

Tạo một product subscription hàng tháng có giá $29.99:
price sử dụng đơn vị nhỏ nhất của currency. discountBps thiết lập discount theo basis point và thay thế field discount đã deprecated.

Kích hoạt License Key

Kích hoạt license key cho một device hoặc installation. Nếu key đã đạt giới hạn kích hoạt, API trả về 422 và SDK throw UnprocessableEntityException. Key chưa được kích hoạt trả về 403 (PermissionDeniedException), còn key không xác định trả về 404 (NotFoundException):

Xử lý Subscription

Tạo subscription, sau đó charge subscription nếu đây là on-demand subscription.
POST /subscriptions (method subscriptions().create() của SDK) đã deprecated. Method này vẫn hoạt động với các integration hiện có, nhưng integration mới nên tạo subscription thông qua Checkout Session.
billing chỉ yêu cầu country, là mã quốc gia ISO gồm hai chữ cái. Sử dụng AttachExistingCustomer để gắn customer hiện có hoặc NewCustomer để tạo customer. charge dành cho on-demand subscriptions, còn productPrice sử dụng đơn vị nhỏ nhất của currency.

Tính phí dựa trên Usage

Ghi nhận Usage Event

Gửi usage event cho một customer. Các meter theo dõi eventName của event sẽ aggregate event đó:
eventId là idempotency key, vì vậy hãy cung cấp một giá trị duy nhất cho mỗi event. Một request chấp nhận tối đa 1.000 event.

Thao tác bất đồng bộ

Async Client

Async client có các method giống synchronous client, nhưng hầu hết là suspend function. Gọi các method này từ một coroutine:
Bạn cũng có thể gọi client.async() trên synchronous client để lấy phiên bản async của client đó.

Xử lý lỗi

Với error status, SDK throw một subclass của DodoPaymentsServiceException, chứa statusCode(), headers() và body(). Các subclass gồm BadRequestException (400), UnauthorizedException (401), PermissionDeniedException (403), NotFoundException (404), UnprocessableEntityException (422), RateLimitException (429), InternalServerException (5xx) và UnexpectedStatusCodeException cho các status khác, chẳng hạn 409:
Lỗi network throw DodoPaymentsIoException, còn response mà SDK không thể diễn giải sẽ throw DodoPaymentsInvalidDataException. Tất cả exception của SDK đều extend DodoPaymentsException.

Xử lý lỗi theo chức năng

Sử dụng Result để xử lý lỗi theo chức năng:
runCatching bắt mọi exception, bao gồm exception của SDK, và trả về chúng dưới dạng Result thất bại.

Tích hợp Android

Kotlin SDK là một server SDK. SDK xác thực bằng secret API key của bạn, và bất kỳ ai có APK của bạn đều có thể trích xuất key được biên dịch bên trong đó, vì vậy không bao giờ sử dụng SDK này bên trong ứng dụng Android. Để thực hiện thanh toán trong ứng dụng Android:
  1. Trên server, tạo checkout session bằng SDK này (xem Tích hợp Ktor) và trả về checkout_url.
  2. Trong ứng dụng, lấy checkout_url từ server của bạn và mở bằng Android SDK, SDK này không chứa API key.

Xác thực Response

Theo mặc định, SDK chỉ ném DodoPaymentsInvalidDataException khi bạn đọc một property có type không như mong đợi. Để kiểm tra toàn bộ response trước, hãy bật validation cho một request hoặc gọi validate() trên response:

Tính năng nâng cao

Cấu hình Proxy

Để gửi request thông qua proxy, hãy truyền một java.net.Proxy vào builder:

Cấu hình tạm thời

withOptions trả về một client với các cài đặt đã thay đổi, dùng chung connection pool và thread pool của client ban đầu. Client ban đầu không thay đổi:

Tích hợp Ktor

Tạo client một lần và gọi nó từ một route:

Tài nguyên

GitHub Repository

Mã nguồn, các bản phát hành và danh sách đầy đủ các method.

API Reference

Mọi endpoint, parameter và response.

Discord Community

Đặt câu hỏi và trao đổi với các developer khác.

Report Issues

Báo cáo bug hoặc yêu cầu tính năng.

Hỗ trợ

Để được trợ giúp về Kotlin SDK:

Đóng góp

Để đóng góp, hãy đọc hướng dẫn đóng góp.
Lần sửa đổi cuối 26 tháng 9, 2026