We need a few libs to get this all going. Run the following to fetch prerequisite packages:
# Gin server lib
go get -u github.com/gin-gonic/gin
# Stripe Go API
go get github.com/stripe/stripe-go
# Dotenv package for Golang
go get github.com/joho/godotenv
Setting up main.go
The Golang API (in my opinion) has some more complexity as opposed to others for setting up a basic charge.
Reading over Stripe's example tests on Github is the perfect way to see how to conform and adhere to the types -- particularly for our basic example.
package main
import (
"log"
"net/http"
"os"
"github.com/gin-gonic/gin"
"github.com/joho/godotenv"
"github.com/stripe/stripe-go"
"github.com/stripe/stripe-go/charge"
)
// ChargeJSON incoming data for Stripe API
type ChargeJSON struct {
Amount int64 `json:"amount"`
ReceiptEmail string `json:"receiptEmail"`
}
func main() {
// load .env file
err := godotenv.Load()
if err != nil {
log.Fatal("Error loading .env file")
}
// set up server
r := gin.Default()
// basic hello world GET route
r.GET("/", func(c *gin.Context) {
c.JSON(200, gin.H{
"message": "Hello, World!",
})
})
// our basic charge API route
r.POST("/api/charges", func(c *gin.Context) {
// we will bind our JSON body to the `json` var
var json ChargeJSON
c.BindJSON(&json)
// Set Stripe API key
apiKey := os.Getenv("SK_TEST_KEY")
stripe.Key = apiKey
// Attempt to make the charge.
// We are setting the charge response to _
// as we are not using it.
_, err := charge.New(&stripe.ChargeParams{
Amount: stripe.Int64(json.Amount),
Currency: stripe.String(string(stripe.CurrencyUSD)),
Source: &stripe.SourceParams{Token: stripe.String("tok_visa")}, // this should come from clientside
ReceiptEmail: stripe.String(json.ReceiptEmail)})
if err != nil {
// Handle any errors from attempt to charge
c.String(http.StatusBadRequest, "Request failed")
return
}
c.String(http.StatusCreated, "Successfully charged")
})
r.Run(":8080")
}
Making A Test Charge
We can run our server with the following:
go run main.go
In another terminal, run http POST http://localhost:8080/api/charges amount:=1700 receiptEmail=hello_gin@example.com (using HTTPie) and we will get back Successfully charged! Hooray! We made it.
I chose to use HTTPie because I feel it is a fun tool that more should know about! Alternative, you could do the above using curl as well (or anything that can make a POST request for a matter of fact).