main.go
package main
 
import (
   "bytes"
   "encoding/json"
   "fmt"
   "net/http"
)
 
const checkoutUrl = "https://checkout.developers.ar.ua.la"
 
// Genera la URL completa del endpoint de pagos
var paymentUrl = fmt.Sprintf("%s/v2/api/checkout", checkoutUrl)
 
// Estructuras para el manejo de datos
type (
   // Checkout contiene los datos necesarios para realizar un pago
   Checkout struct {
   	Amount            string `json:"amount"`
   	Description       string `json:"description"`
   	NotificationURL   string `json:"notification_url"`
   	CallbackFail      string `json:"callback_fail"`
   	CallbackSuccess   string `json:"callback_success"`
   	ExternalReference string `json:"external_reference"`
   }
 
   // Links contiene las URLs relevantes en la respuesta
   Links struct {
   	CheckoutLink string `json:"checkout_link"`
   	Success      string `json:"success"`
   	Failed       string `json:"failed"`
   }
 
   // Response representa la estructura de la respuesta de la API
   Response struct {
   	UUID              string `json:"uuid"`
   	Status            string `json:"status"`
   	ExternalReference string `json:"external_reference"`
   	Links             Links  `json:"links"`
   	Amount            int    `json:"amount"`
   }
 
   // Process define un comportamiento para procesar pagos
   Process interface {
   	Pay(token string) (Response, error)
   }
)
 
// Convierte el objeto Checkout en un JSON
func (checkout *Checkout) toJson() ([]byte, error) {
   return json.Marshal(checkout)
}
 
// Realiza el pago llamando al endpoint de la API
func (checkout *Checkout) Pay(token string) (Response, error) {
   var response Response
 
   // Configurar el encabezado de autorización
   accessToken := fmt.Sprintf("Bearer %s", token)
 
   // Convertir los datos del Checkout a JSON
   data, err := checkout.toJson()
   if err != nil {
   	return response, fmt.Errorf("error serializando los datos: %v", err)
   }
 
   // Crear una solicitud HTTP POST
   request, err := http.NewRequest("POST", paymentUrl, bytes.NewBuffer(data))
   if err != nil {
   	return response, fmt.Errorf("error creando la solicitud HTTP: %v", err)
   }
 
   // Configurar los encabezados de la solicitud
   request.Header.Set("Content-Type", "application/json")
   request.Header.Set("Authorization", accessToken)
 
   // Crear un cliente HTTP y enviar la solicitud
   client := &http.Client{}
   resp, err := client.Do(request)
   if err != nil {
   	return response, fmt.Errorf("error realizando la solicitud HTTP: %v", err)
   }
   defer resp.Body.Close()
 
   // Validar el código de respuesta HTTP
   if resp.StatusCode != http.StatusOK {
   	return response, fmt.Errorf("error: código de respuesta HTTP %d", resp.StatusCode)
   }
 
   // Decodificar la respuesta JSON
   if err = json.NewDecoder(resp.Body).Decode(&response); err != nil {
   	return response, fmt.Errorf("error decodificando la respuesta: %v", err)
   }
 
   return response, nil
}
 
func main() {
   // Configurar los datos del checkout
   checkout := Checkout{
   	Amount:            "10.90",
   	Description:       "Venta",
   	NotificationURL:   "your-notification-url",
   	CallbackFail:      "your-fail-url",
   	CallbackSuccess:   "your-success-url",
   	ExternalReference: "your-external-reference",
   }
 
   // Token de acceso (reemplaza con un token válido)
   token := "your-access-token"
 
   // Realizar el pago
   response, err := checkout.Pay(token)
   if err != nil {
   	fmt.Printf("Error al procesar el pago: %v\n", err)
   } else {
   	fmt.Printf("Respuesta del servidor: %+v\n", response)
   }
}