Go SDK 提供了一个干净且符合习惯的 Go 接口,用于将 Dodo Payments 集成到您的应用程序中。它支持上下文,强类型响应,中间件功能,并且安全地支持并发使用。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.
安装
使用 Go 模块安装 SDK:go get github.com/dodopayments/dodopayments-go
go get -u 'github.com/dodopayments/dodopayments-go@v1.97.3'
SDK 需要 Go 1.22 或更高版本,利用现代 Go 功能以实现最佳性能。
快速开始
初始化客户端并创建您的第一个结账会话:package main
import (
"context"
"fmt"
"log"
"github.com/dodopayments/dodopayments-go"
"github.com/dodopayments/dodopayments-go/option"
)
func main() {
client := dodopayments.NewClient(
option.WithBearerToken("My Bearer Token"), // defaults to os.LookupEnv("DODO_PAYMENTS_API_KEY")
option.WithEnvironmentTestMode(), // defaults to option.WithEnvironmentLiveMode()
)
checkoutSessionResponse, err := client.CheckoutSessions.New(context.TODO(), dodopayments.CheckoutSessionNewParams{
CheckoutSessionRequest: dodopayments.CheckoutSessionRequestParam{
ProductCart: dodopayments.F([]dodopayments.ProductItemReqParam{{
ProductID: dodopayments.F("product_id"),
Quantity: dodopayments.F(int64(1)),
}}),
},
})
if err != nil {
panic(err.Error())
}
fmt.Printf("Session ID: %s\n", checkoutSessionResponse.SessionID)
}
始终使用环境变量安全地存储 API 密钥。切勿将它们硬编码在源代码中。
核心特性
Context Support
完整支持 context.Context,以实现取消和超时
Strong Typing
强类型请求和响应,确保编译时安全性
Middleware
可扩展的中间件支持用于日志记录、指标和自定义逻辑
Goroutine Safe
为并发操作设计的线程安全客户端
配置
上下文和超时
利用 Go 的上下文进行超时和取消:import (
"context"
"time"
"github.com/dodopayments/dodopayments-go"
"github.com/dodopayments/dodopayments-go/option"
)
// Create a context with timeout
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
payment, err := client.Payments.Create(ctx, dodopayments.PaymentCreateParams{
Amount: 5000,
Currency: "USD",
CustomerID: "cus_123",
})
if err != nil {
if ctx.Err() == context.DeadlineExceeded {
log.Println("Request timed out")
} else {
log.Fatal(err)
}
}
重试配置
配置自动重试行为:// Configure default for all requests (default is 2)
client := dodopayments.NewClient(
option.WithMaxRetries(0), // disable retries
)
// Override per-request
client.CheckoutSessions.New(
context.TODO(),
dodopayments.CheckoutSessionNewParams{
CheckoutSessionRequest: dodopayments.CheckoutSessionRequestParam{
ProductCart: dodopayments.F([]dodopayments.ProductItemReqParam{{
ProductID: dodopayments.F("product_id"),
Quantity: dodopayments.F(int64(0)),
}}),
},
},
option.WithMaxRetries(5),
)
常见操作
创建结账会话
生成一个结账会话:session, err := client.CheckoutSessions.New(ctx, dodopayments.CheckoutSessionNewParams{
CheckoutSessionRequest: dodopayments.CheckoutSessionRequestParam{
ProductCart: dodopayments.F([]dodopayments.ProductItemReqParam{{
ProductID: dodopayments.F("prod_123"),
Quantity: dodopayments.F(int64(1)),
}}),
ReturnURL: dodopayments.F("https://yourdomain.com/return"),
},
})
if err != nil {
log.Fatal(err)
}
fmt.Printf("Checkout URL: %s\n", session.CheckoutURL)
管理客户
创建和检索客户信息:// Create a customer
customer, err := client.Customers.New(ctx, dodopayments.CustomerNewParams{
Email: dodopayments.F("customer@example.com"),
Name: dodopayments.F("John Doe"),
Metadata: dodopayments.F(map[string]string{
"user_id": "12345",
}),
})
if err != nil {
log.Fatal(err)
}
// Retrieve customer
customer, err = client.Customers.Get(ctx, "cus_123")
if err != nil {
log.Fatal(err)
}
fmt.Printf("Customer: %s (%s)\n", customer.Name, customer.Email)
处理订阅
创建和管理定期订阅:import "time"
// Create a subscription
subscription, err := client.Subscriptions.New(ctx, dodopayments.SubscriptionNewParams{
Billing: dodopayments.F(dodopayments.BillingAddressParam{
Country: dodopayments.F(dodopayments.CountryCodeUs),
City: dodopayments.F("San Francisco"),
State: dodopayments.F("CA"),
Street: dodopayments.F("1 Market St"),
Zipcode: dodopayments.F("94105"),
}),
Customer: dodopayments.F[dodopayments.CustomerRequestUnionParam](
dodopayments.AttachExistingCustomerParam{
CustomerID: dodopayments.F("cus_123"),
},
),
ProductID: dodopayments.F("pdt_456"),
Quantity: dodopayments.F(int64(1)),
})
if err != nil {
log.Fatal(err)
}
// Charge an on-demand subscription
// ProductPrice is in the lowest currency denomination (e.g., 2500 = $25.00 USD)
chargeResponse, err := client.Subscriptions.Charge(ctx, subscription.SubscriptionID,
dodopayments.SubscriptionChargeParams{
ProductPrice: dodopayments.F(int64(2500)),
},
)
if err != nil {
log.Fatal(err)
}
// Get usage history (for metered subscriptions)
usageHistory, err := client.Subscriptions.GetUsageHistory(
ctx,
subscription.SubscriptionID,
dodopayments.SubscriptionGetUsageHistoryParams{
StartDate: dodopayments.F(time.Date(2024, 1, 1, 0, 0, 0, 0, time.UTC)),
EndDate: dodopayments.F(time.Date(2024, 3, 31, 23, 59, 59, 0, time.UTC)),
},
)
if err != nil {
log.Fatal(err)
}
Billing 需要至少两个字母的 ISO Country 代码。Customer 是一个 CustomerRequestUnionParam — 对于现有客户传递 AttachExistingCustomerParam{CustomerID: ...},或对于新客户传递 NewCustomerParam{Email: ..., Name: ...}。ProductPrice 是最低货币单位。基于使用的计费
引入使用事件
跟踪自定义事件:import "github.com/dodopayments/dodopayments-go"
response, err := client.UsageEvents.Ingest(ctx, dodopayments.UsageEventIngestParams{
Events: dodopayments.F([]dodopayments.UsageEventIngestParamsEvent{{
EventID: dodopayments.F("api_call_12345"),
CustomerID: dodopayments.F("cus_abc123"),
EventName: dodopayments.F("api_request"),
Timestamp: dodopayments.F("2024-01-15T10:30:00Z"),
Metadata: dodopayments.F(map[string]string{
"endpoint": "/api/v1/users",
"method": "GET",
"tokens_used": "150",
}),
}}),
})
if err != nil {
log.Fatal(err)
}
列出使用事件
// List events with filters
params := dodopayments.UsageEventListParams{
CustomerID: dodopayments.F("cus_abc123"),
EventName: dodopayments.F("api_request"),
}
events, err := client.UsageEvents.List(ctx, params)
if err != nil {
log.Fatal(err)
}
for _, event := range events.Data {
fmt.Printf("Event %s: %s at %s\n", event.EventID, event.EventName, event.Timestamp)
}
错误处理
处理特定错误类型:payment, err := client.Payments.Create(ctx, dodopayments.PaymentCreateParams{
Amount: 5000,
Currency: "USD",
})
if err != nil {
if apiErr, ok := err.(*dodopayments.APIError); ok {
fmt.Printf("API Error: %s\n", apiErr.Message)
fmt.Printf("Status Code: %d\n", apiErr.StatusCode)
fmt.Printf("Request ID: %s\n", apiErr.RequestID)
// Handle specific error types
switch apiErr.Type {
case dodopayments.ErrorTypeAuthentication:
log.Println("Authentication failed")
case dodopayments.ErrorTypeInvalidRequest:
log.Println("Invalid request parameters")
case dodopayments.ErrorTypeRateLimit:
log.Println("Rate limit exceeded")
default:
log.Printf("API error: %s\n", apiErr.Message)
}
} else {
log.Fatal(err)
}
}
中间件
添加用于日志或指标的自定义中间件:func Logger(req *http.Request, next option.MiddlewareNext) (res *http.Response, err error) {
// Before the request
start := time.Now()
log.Printf("Request: %s %s\n", req.Method, req.URL)
// Forward the request to the next handler
res, err = next(req)
// After the request
end := time.Now()
log.Printf("Response: %d in %v\n", res.StatusCode, end.Sub(start))
return res, err
}
client := dodopayments.NewClient(
option.WithMiddleware(Logger),
)
并发
客户端安全支持并发使用:package main
import (
"context"
"sync"
"log"
"github.com/dodopayments/dodopayments-go"
)
func main() {
client := dodopayments.NewClient()
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(idx int) {
defer wg.Done()
payment, err := client.Payments.Create(context.Background(), dodopayments.PaymentCreateParams{
Amount: 1000,
Currency: "USD",
CustomerID: "cus_123",
})
if err != nil {
log.Printf("Failed to create payment %d: %v", idx, err)
return
}
log.Printf("Created payment %d: %s", idx, payment.ID)
}(i)
}
wg.Wait()
}
资源
GitHub Repository
查看源代码并贡献
API Reference
完整的 API 文档
Discord Community
获取帮助并与开发者联系
Report Issues
报告错误或请求新功能
支持
需要 Go SDK 的帮助?- Discord:加入我们的社区服务器获取实时支持
- 电子邮件:通过 support@dodopayments.com 联系我们
- GitHub:在仓库上提交问题