Go SDK tillhandahåller ett rent och idiomatiskt Go-gränssnitt för att integrera Dodo Payments i dina applikationer. Det erbjuder kontextstöd, starkt typade svar, middleware-funktioner och är säkert för samtidig användning.
Installation
Installera SDK:n med Go-moduler:
go get github.com/dodopayments/dodopayments-go
Eller för att fästa vid en specifik version:
go get -u 'github.com/dodopayments/dodopayments-go@v1.97.3'
SDK:n kräver Go 1.22 eller senare versioner och utnyttjar moderna Go-funktioner för optimal prestanda.
Snabbstart
Initiera klienten och skapa din första checkout-session:
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 )
}
Spara alltid dina API-nycklar säkert med hjälp av miljövariabler. Låt dem aldrig vara hårdkodade i källkoden.
Kärnfunktioner
Context Support Fullt stöd för context.Context för avbokning och timeout
Strong Typing Starkt typade förfrågningar och svar för kompileringstidssäkerhet
Middleware Utbyggbart middleware-stöd för loggning, mätvärden och egen logik
Goroutine Safe Trådsäker klient utformad för samtidiga operationer
Konfiguration
Kontext och tidsgränser
Utnyttja Gos kontext för tidsgränser och avbrytande:
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 . New ( ctx , dodopayments . PaymentNewParams {
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" ),
},
),
ProductCart : dodopayments . F ([] dodopayments . OneTimeProductCartItemParam {{
ProductID : dodopayments . F ( "pdt_456" ),
Quantity : dodopayments . F ( int64 ( 1 )),
}}),
})
if err != nil {
if ctx . Err () == context . DeadlineExceeded {
log . Println ( "Request timed out" )
} else {
log . Fatal ( err )
}
}
Återförsökskonfiguration
Konfigurera automatisk återförsöksbeteende:
// 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 ),
)
Vanliga operationer
Skapa en checkout-session
Generera en checkout-session:
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 )
Hantera kunder
Skapa och hämta kundinformation:
// 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 )
Hantera prenumerationer
Skapa och hantera återkommande prenumerationer:
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 kräver minst den tvåbokstavskod för ISO Country. Customer är en CustomerRequestUnionParam — skicka AttachExistingCustomerParam{CustomerID: ...} för en befintlig kund eller NewCustomerParam{Email: ..., Name: ...} för en ny. ProductPrice är i den lägsta valören för valutan.
Användningsbaserad Debitering
Ingång för Användningshändelser
Spåra anpassade händelser:
import " github.com/dodopayments/dodopayments-go "
response , err := client . UsageEvents . Ingest ( ctx , dodopayments . UsageEventIngestParams {
Events : dodopayments . F ([] dodopayments . EventInputParam {{
EventID : dodopayments . F ( "api_call_12345" ),
CustomerID : dodopayments . F ( "cus_abc123" ),
EventName : dodopayments . F ( "api_request" ),
Timestamp : dodopayments . F ( time . Date ( 2024 , 1 , 15 , 10 , 30 , 0 , 0 , time . UTC )),
}}),
})
if err != nil {
log . Fatal ( err )
}
Lista Användningshändelser
// 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 . Items {
fmt . Printf ( "Event %s : %s at %s \n " , event . EventID , event . EventName , event . Timestamp )
}
Felhantering
När API:et returnerar en icke-lyckad statuskod, returnerar SDK:n ett fel av typen *dodopayments.Error. Den exponerar StatusCode, den underliggande *http.Request och *http.Response, samt JSON av felmeddelandekroppen. Använd mönstret errors.As för att inspektera det och förgren på StatusCode för att hantera specifika fall:
payment , err := client . Payments . New ( ctx , dodopayments . PaymentNewParams {
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" )},
),
ProductCart : dodopayments . F ([] dodopayments . OneTimeProductCartItemParam {{
ProductID : dodopayments . F ( "pdt_456" ),
Quantity : dodopayments . F ( int64 ( 1 )),
}}),
})
if err != nil {
var apiErr * dodopayments . Error
if errors . As ( err , & apiErr ) {
fmt . Printf ( "Status Code: %d \n " , apiErr . StatusCode )
fmt . Println ( string ( apiErr . DumpResponse ( true ))) // Serialized HTTP response
// Handle specific status codes
switch apiErr . StatusCode {
case 401 :
log . Println ( "Authentication failed" )
case 422 :
log . Println ( "Invalid request parameters" )
case 429 :
log . Println ( "Rate limit exceeded" )
default :
log . Printf ( "API error: %s " , apiErr . Error ())
}
} else {
log . Fatal ( err )
}
}
Middleware
Lägg till anpassad middleware för loggning eller mätvärden:
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 ),
)
Konkurrens
Klienten är säker att använda samtidigt:
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 . New ( context . Background (), dodopayments . PaymentNewParams {
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" )},
),
ProductCart : dodopayments . F ([] dodopayments . OneTimeProductCartItemParam {{
ProductID : dodopayments . F ( "pdt_456" ),
Quantity : dodopayments . F ( int64 ( 1 )),
}}),
})
if err != nil {
log . Printf ( "Failed to create payment %d : %v " , idx , err )
return
}
log . Printf ( "Created payment %d : %s " , idx , payment . PaymentID )
}( i )
}
wg . Wait ()
}
Resurser
GitHub Repository Visa källkod och bidra
API Reference Komplett API-dokumentation
Discord Community Få hjälp och anslut med utvecklare
Report Issues Rapportera buggar eller be om funktioner
Support
Behöver du hjälp med Go SDK?
Att bidra
Vi välkomnar bidrag! Kolla riktlinjer för bidra för att komma igång.