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)
}
}