Skip to main content
Go SDK cung cấp cho các ứng dụng Go quyền truy cập có kiểu tới REST API của Dodo Payments. Mỗi phương thức nhận một context.Context, các tham số request sử dụng wrapper Field để phân biệt các giá trị zero với các trường bị bỏ qua, và bạn có thể thêm middleware vào mọi request.

Cài đặt

Thêm module vào project của bạn:
Để cố định một phiên bản cụ thể:
SDK yêu cầu Go 1.22 trở lên.

Bắt đầu nhanh

Tạo client, sau đó tạo một checkout session:
Nếu bạn bỏ qua option.WithBearerToken, NewClient sẽ đọc biến môi trường DODO_PAYMENTS_API_KEY. Nếu bạn bỏ qua option.WithEnvironmentTestMode(), client sẽ kết nối tới live mode. API key của test mode chỉ hoạt động trong test mode.
Lưu API key trong biến môi trường hoặc trình quản lý secrets. Không bao giờ hardcode chúng trong source code.

Tính năng cốt lõi

Context Support

Mỗi phương thức nhận một context.Context để hủy và thiết lập timeout.

Strong Typing

Các tham số request và struct response có kiểu để kiểm tra tại thời điểm biên dịch.

Middleware

Thêm middleware với option.WithMiddleware để ghi log, thu thập metrics và xử lý logic tùy chỉnh.

Goroutine Safe

Chia sẻ một client giữa các goroutine.

Cấu hình

NewClient đọc DODO_PAYMENTS_API_KEY, DODO_PAYMENTS_WEBHOOK_KEY (webhook signing secret của bạn) và DODO_PAYMENTS_BASE_URL từ môi trường. Các tùy chọn bạn truyền vào, chẳng hạn như option.WithBearerToken, option.WithWebhookKey và option.WithBaseURL, sẽ ghi đè các giá trị đó. Để xác minh webhook, truyền raw request body và headers tới client.Webhooks.Unwrap(rawBody, r.Header). Phương thức này kiểm tra signature bằng webhook key của bạn và trả về event đã được parse. client.Webhooks.UnsafeUnwrap(rawBody) parse body mà không xác minh, vì vậy chỉ sử dụng nó để testing. Xem Webhooks. Các ví dụ trên trang này sử dụng client từ Quick Start.

Context và timeout

Theo mặc định, request không có timeout. Deadline của context giới hạn toàn bộ lời gọi, bao gồm cả retry. Để giới hạn từng lần thử, thêm option.WithRequestTimeout():

Cấu hình retry

SDK retry các lỗi kết nối và các response có status 408, 409, 429 hoặc từ 500 trở lên. Theo mặc định, SDK retry hai lần với exponential backoff. Đặt option.WithMaxRetries trên client hoặc trên một request riêng lẻ:

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

Các ví dụ trong phần này cũng sử dụng context, chẳng hạn như ctx := context.Background().

Tạo Checkout Session

Tạo một checkout session, sau đó chuyển hướng khách hàng tới CheckoutURL được trả về:
Mỗi checkout URL chỉ hoạt động một lần và hết hạn sau 24 giờ. Để xem mọi tùy chọn của session, hãy xem Checkout Sessions.

Quản lý khách hàng

Tạo một khách hàng với địa chỉ email và tên, sau đó truy xuất khách hàng theo ID. Các giá trị metadata sử dụng union type từ package shared:

Xử lý subscription

Tạo một subscription, tính phí cho một on-demand subscription và đọc lịch sử sử dụng của subscription.
POST /subscriptions (phương thức Subscriptions.New của SDK) đã deprecated. Phương thức này vẫn hoạt động cho các integration hiện có, nhưng integration mới nên tạo subscription thông qua một Checkout Session.
Billing chỉ yêu cầu Country, là mã quốc gia ISO gồm hai chữ cái. Customer là một CustomerRequestUnionParam: truyền AttachExistingCustomerParam{CustomerID: ...} cho khách hàng hiện có hoặc NewCustomerParam{Email: ..., Name: ...} để tạo khách hàng mới. Charge dành cho on-demand subscriptions, còn ProductPrice được tính theo đơn vị nhỏ nhất của loại tiền tệ. GetUsageHistory trả về một trang kết quả; GetUsageHistoryAutoPaging lặp qua mọi trang.

Tính phí dựa trên mức sử dụng

Nạp sự kiện sử dụng

Gửi các sự kiện sử dụng cho một khách hàng:
EventID là idempotency key, vì vậy hãy cung cấp một giá trị duy nhất cho mỗi event. Nếu cùng một EventID xuất hiện hai lần trong một request, toàn bộ request sẽ bị từ chối. Nếu một EventID đã được ingest trước đó, event mới sẽ bị bỏ qua. Một request chấp nhận tối đa 1.000 event. Timestamp mặc định là thời điểm hiện tại và sẽ bị từ chối nếu sớm hơn hiện tại quá 1 giờ hoặc muộn hơn hiện tại quá 5 phút.

Liệt kê sự kiện sử dụng

Liệt kê các event được lọc theo khách hàng và tên event:
List trả về một trang. Để lặp qua mọi trang, hãy gọi client.UsageEvents.ListAutoPaging(ctx, params) và lặp với iter.Next(), iter.Current() và iter.Err(). Các phương thức list khác cũng có biến thể AutoPaging tương tự, và mỗi trang có phương thức GetNextPage().

Xử lý lỗi

Khi API trả về status code không thành công, SDK trả về một error có type *dodopayments.Error. Error này có StatusCode, *http.Request và *http.Response, cùng JSON của error body. Sử dụng errors.As để kiểm tra error, và rẽ nhánh dựa trên StatusCode để xử lý các trường hợp cụ thể:
Các error khác được trả về mà không bọc. Ví dụ, nếu HTTP transport thất bại, bạn có thể nhận được một *url.Error bọc một *net.OpError. apiErr.DumpRequest(true) trả về request đã được serialize.

Middleware

Thêm middleware bằng option.WithMiddleware. Middleware nhận mỗi request và một function next để gửi request đó:
Nhiều middleware trong một lời gọi option.WithMiddleware sẽ chạy từ trái sang phải. Middleware được truyền vào NewClient sẽ chạy trước middleware được truyền vào một request riêng lẻ.

Đồng thời

Client an toàn khi sử dụng đồng thời, vì vậy bạn có thể chia sẻ một client giữa các goroutine:

Tài nguyên

GitHub Repository

Source code, các bản phát hành và danh sách đầy đủ các phương thức.

API Reference

Mọi endpoint, tham số 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 hỗ trợ về Go 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