This library provides a simple wrapper around the GoCardless API.
- "Getting started" guide with copy and paste Go code samples
- API Reference
Make sure your project is using Go Modules (it will have a go.mod file in its
root if it already is):
go mod init
go mod tidyThen, reference gocardless-pro-go in a Go program with import:
import (
gocardless "github.com/gocardless/gocardless-pro-go/v5"
)Run any of the normal go commands (build/install/test). The Go
toolchain will resolve and fetch the gocardless-pro-go module automatically.
Alternatively, you can also explicitly go get the package into a project:
go get -u github.com/gocardless/[email protected]
The client is initialised with an access token, and is configured to use GoCardless live environment by default:
token := "your_access_token"
config, err := gocardless.NewConfig(token)
if err != nil {
fmt.Printf("got err in initialising config: %s", err.Error())
return
}
client, err := gocardless.New(config)
if err != nil {
fmt.Printf("error in initialisating client: %s", err.Error())
return
}Optionally, the client can be customised with endpoint, for ex: sandbox environment
config, err := gocardless.NewConfig(token, gocardless.WithEndpoint(gocardless.SandboxEndpoint))
if err != nil {
fmt.Printf("got err in initialising config: %s", err.Error())
return
}
client, err := gocardless.New(config)
if err != nil {
fmt.Printf("error in initialisating client: %s", err.Error())
return
}the client can also be initialised with a customised http client, for ex;
customHttpClient := &http.Client{
Timeout: time.Second * 10,
}
config, err := gocardless.NewConfig(token, gocardless.WithClient(customHttpClient))
if err != nil {
fmt.Printf("got err in initialising config: %s", err.Error())
return
}
client, err := gocardless.New(config)
if err != nil {
fmt.Printf("error in initialisating client: %s", err.Error())
return
}To fetch single item, use the Get method
ctx := context.TODO()
customer, err := client.Customers.Get(ctx, "CU123")To fetch items in a collection, there are two options:
- Fetching items one page at a time using
Listmethod:
ctx := context.TODO()
customerListParams := gocardless.CustomerListParams{}
customers, err := client.Customers.List(ctx, customerListParams)
for _, customer := range customers.Customers {
fmt.Printf("customer: %v", customer)
}
cursor := customers.Meta.Cursors.After
customerListParams.After = cursor
nextPageCustomers, err := client.Customers.List(ctx, customerRemoveParams)- Iterating through all of the items using a
Allmethod to get a lazily paginated list.Allwill deal with making extra API requests to paginate through all the data for you:
ctx := context.TODO()
customerListParams := gocardless.CustomerListParams{}
customerListIterator := client.Customers.All(ctx, customerListParams)
for customerListIterator.Next() {
customerListResult, err := customerListIterator.Value(ctx)
if err != nil {
fmt.Printf("got err: %s", err.Error())
} else {
fmt.Printf("customerListResult is %v", customerListResult)
}
}Resources can be created with the Create method:
ctx := context.TODO()
customerCreateParams := gocardless.CustomerCreateParams{
AddressLine1: "9 Acer Gardens"
City: "Birmingham",
PostalCode: "B4 7NJ",
CountryCode: "GB",
Email: "[email protected]",
GivenName: "Bender Bending",
FamilyName: "Rodgriguez",
}
customer, err := client.Customers.Create(ctx, customerCreateParams)Resources can be updates with the Update method:
ctx := context.TODO()
customerUpdateParams := CustomerUpdateParams{
GivenName: "New Name",
}
customer, err := client.Customers.Update(ctx, "CU123", customerUpdateParams)Resources can be removed with the Remove method:
ctx := context.TODO()
customerRemoveParams := CustomerRemoveParams{}
customer, err := client.Customers.Remove(ctx, "CU123", customerRemoveParams)The library will attempt to retry most failing requests automatically (with the exception of those which are not safe to retry).
GET requests are considered safe to retry, and will be retried automatically. Certain POST requests are made safe to retry by the use of an idempotency key, generated automatically by the library, so we'll automatically retry these too. Currently its retried for 3 times. If you want to override this behaviour(for example, to provide your own retry mechanism), then you can use the WithoutRetries. This will not retry and return response object.
requestOption := gocardless.WithoutRetries()
customersCreateResult, err := client.Customers.Create(ctx, customerCreateParams, requestOption)You shouldn't generally need to customise the headers sent by the library, but you wish to
in some cases (for example if you want to send an Accept-Language header when creating a mandate PDF).
headers := make(map[string]string)
headers["Accept-Language"] = "fr"
requestOption := gocardless.WithHeaders(headers)
customersCreateResult, err := client.Customers.Create(ctx, customerCreateParams, requestOption)Custom headers you specify will override any headers generated by the library itself (for
example, an Idempotency-Key header with a randomly-generated value or one you've configured
manually). Custom headers always take precedence.
requestOption := gocardless.WithIdempotencyKey("test-idemptency-key-123")
customersCreateResult, err := client.Customers.Create(ctx, customerCreateParams, requestOption)GoCardless supports webhooks, allowing you to receive real-time notifications when things happen in your account, so you can take automatic actions in response, for example:
- When a customer cancels their mandate with the bank, suspend their club membership
- When a payment fails due to lack of funds, mark their invoice as unpaid
- When a customer’s subscription generates a new payment, log it in their “past payments” list
The client allows you to validate that a webhook you receive is genuinely from GoCardless, and to parse it into Event objects(defined in event_service.go) which are easy to work with:
http.HandleFunc("/webhookEndpoint", func(w http.ResponseWriter, r *http.Request) {
wh, err := NewWebhookHandler("secret", EventHandlerFunc(func(event gocardless.Event) error {
parseEvent(event)
}))
wh.ServeHTTP(w,r)
})
func parseEvents(event Event) {
// work through list of events
}When the library returns an error defined by us rather than the stdlib, it can be converted into a gocardless.APIError using errors.As:
billingRequest, err := client.BillingRequests.Create(ctx, billingRequestCreateParams)
if err != nil {
var apiErr *gocardless.APIError
if errors.As(err, &apiErr) {
fmt.Printf("got err: %v", apiErr.Message)
}
return nil, err
}This library requires go 1.20 and above.
TODO
This client is auto-generated from Crank, a toolchain that we hope to soon open source. Issues should for now be reported on this repository. Please do not modify the source code yourself, your changes will be overridden!