Commet
  • Pricing
Log InTry out
Introducción

Inicio rápido

Integrar con GoIntegrar con Encore

Aprender

Recursos

Referencia del SDKVersionado de APIManejo de erroresTestingCLI

Plugins

Better Auth
DocumentaciónRecursosConstruir con AIAPI ReferenceWebhooks

Integrar con Go

Agrega cobros y pagos a tu aplicación de Go usando net/http.

Instalar

go get github.com/commet-labs/commet-go

Configurar

.env
COMMET_API_KEY=ck_sandbox_xxx
COMMET_WEBHOOK_SECRET=whsec_xxx
billing/client.go
package billing

import (
	"log"
	"os"

	commet "github.com/commet-labs/commet-go"
)

var Client *commet.Client

func Init() {
	var err error
	Client, err = commet.New(
		os.Getenv("COMMET_API_KEY"),
		commet.WithEnvironment(commet.Sandbox),
	)
	if err != nil {
		log.Fatal(err)
	}
}

Suscribir

billing/handlers.go
package billing

import (
	"encoding/json"
	"net/http"

	commet "github.com/commet-labs/commet-go"
)

type subscribeRequest struct {
	Email      string `json:"email"`
	CustomerID string `json:"customer_id"`
}

func Subscribe(w http.ResponseWriter, r *http.Request) {
	var req subscribeRequest
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	_, err := Client.Customers.Create(r.Context(), &commet.CreateCustomerParams{
		Email:      req.Email,
		ID: req.CustomerID,
	})
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	subscription, err := Client.Subscriptions.Create(r.Context(), &commet.CreateSubscriptionParams{
		CustomerID: req.CustomerID,
		PlanCode:   "pro",
	})
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(map[string]any{"checkout_url": subscription.Data["checkout_url"]})
}

Verificar acceso

billing/handlers.go
func GetSubscription(w http.ResponseWriter, r *http.Request) {
	customerID := r.PathValue("customerID")

	sub, err := Client.Subscriptions.Get(r.Context(), customerID)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(map[string]any{"status": sub.Data["status"]})
}

func CheckFeature(w http.ResponseWriter, r *http.Request) {
	feature := r.PathValue("feature")
	customerID := r.PathValue("customerID")

	result, err := Client.Features.Check(r.Context(), feature, customerID)
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(map[string]any{"allowed": result.Data["allowed"]})
}

Trackear uso

billing/handlers.go
func intPtr(i int) *int { return &i }

type usageRequest struct {
	CustomerID string `json:"customer_id"`
}

func TrackUsage(w http.ResponseWriter, r *http.Request) {
	var req usageRequest
	if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
		http.Error(w, err.Error(), http.StatusBadRequest)
		return
	}

	_, err := Client.Usage.Track(r.Context(), &commet.TrackUsageParams{
		CustomerID: req.CustomerID,
		Feature:    "api_calls",
		Value:      intPtr(1),
	})
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(map[string]any{"tracked": true})
}

El uso se agrega y se cobra al final del período.

Portal del Cliente

billing/handlers.go
func Portal(w http.ResponseWriter, r *http.Request) {
	result, err := Client.Portal.GetURL(r.Context(), &commet.GetPortalURLParams{
		CustomerID: "user_123",
	})
	if err != nil {
		http.Error(w, err.Error(), http.StatusInternalServerError)
		return
	}

	http.Redirect(w, r, result.Data["portal_url"].(string), http.StatusTemporaryRedirect)
}

Webhooks

billing/webhooks.go
package billing

import (
	"io"
	"net/http"
	"os"

	commet "github.com/commet-labs/commet-go"
)

func HandleWebhook(w http.ResponseWriter, r *http.Request) {
	rawBody, err := io.ReadAll(r.Body)
	if err != nil {
		http.Error(w, "Failed to read body", http.StatusBadRequest)
		return
	}

	webhooks := &commet.Webhooks{}
	payload, err := webhooks.VerifyAndParse(
		string(rawBody),
		r.Header.Get("x-commet-signature"),
		os.Getenv("COMMET_WEBHOOK_SECRET"),
	)
	if err != nil {
		http.Error(w, "Invalid signature", http.StatusUnauthorized)
		return
	}

	switch payload["event"] {
	case "subscription.activated":
		// manejar activación
	}

	w.Header().Set("Content-Type", "application/json")
	w.Write([]byte(`{"ok":true}`))
}

Iniciar el servidor

main.go
package main

import (
	"billing"
	"log"
	"net/http"
)

func main() {
	billing.Init()
	defer billing.Client.Close()

	mux := http.NewServeMux()

	mux.HandleFunc("POST /billing/subscribe", billing.Subscribe)
	mux.HandleFunc("GET /billing/subscription/{customerID}", billing.GetSubscription)
	mux.HandleFunc("GET /billing/features/{feature}/{customerID}", billing.CheckFeature)
	mux.HandleFunc("POST /billing/usage", billing.TrackUsage)
	mux.HandleFunc("GET /billing/portal", billing.Portal)
	mux.HandleFunc("POST /webhooks/commet", billing.HandleWebhook)

	log.Println("Listening on :3000")
	log.Fatal(http.ListenAndServe(":3000", mux))
}

Relacionado

  • Suscripciones
  • Trackear Uso
  • Portal del Cliente
  • Referencia del SDK

¿Cómo está esta guía?

Integrar con Java

Instala y configura el SDK de Commet para Java.

Integrar con Encore

Agrega cobros y pagos a tu aplicación de Encore.

En esta página

Instalar
Configurar
Suscribir
Verificar acceso
Trackear uso
Portal del Cliente
Webhooks
Iniciar el servidor
Relacionado