Commet
  • Pricing
Log InTry out
Introducción

Inicio rápido

Integrar con PHPIntegrar con LaravelIntegrar con Symfony

Aprender

Recursos

Referencia del SDKVersionado de APIManejo de erroresTestingCLI

Plugins

Better Auth
DocumentaciónRecursosConstruir con AIAPI ReferenceWebhooks

Integrar con Laravel

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

Instalar

composer require commet/commet-php

Configurar

.env
COMMET_API_KEY=ck_sandbox_xxx
COMMET_WEBHOOK_SECRET=whsec_xxx
app/Providers/AppServiceProvider.php
<?php

namespace App\Providers;

use Commet\Commet;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    public function register(): void
    {
        $this->app->singleton(Commet::class, function () {
            return new Commet(
                apiKey: config('services.commet.api_key'),
            );
        });
    }
}
config/services.php
'commet' => [
    'api_key' => env('COMMET_API_KEY'),
    'webhook_secret' => env('COMMET_WEBHOOK_SECRET'),
],

Suscribir

app/Http/Controllers/BillingController.php
<?php

namespace App\Http\Controllers;

use Commet\Commet;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class BillingController extends Controller
{
    public function __construct(
        private Commet $commet,
    ) {}

    public function subscribe(Request $request): JsonResponse
    {
        $request->validate([
            'email' => 'required|email',
            'customer_id' => 'required|string',
        ]);

        $this->commet->customers->create(
            email: $request->input('email'),
            id: $request->input('customer_id'),
        );

        $subscription = $this->commet->subscriptions->create(
            customerId: $request->input('customer_id'),
            planCode: 'pro',
        );

        return response()->json([
            'checkout_url' => $subscription->data['checkout_url'],
        ]);
    }
}

Verificar acceso

app/Http/Controllers/BillingController.php
public function getSubscription(string $customerId): JsonResponse
{
    $subscription = $this->commet->subscriptions->get($customerId);

    return response()->json([
        'status' => $subscription->data['status'],
    ]);
}

public function checkFeature(string $feature, string $customerId): JsonResponse
{
    $result = $this->commet->features->check(code: $feature, customerId: $customerId);

    return response()->json([
        'allowed' => $result->data['allowed'],
    ]);
}

Trackear uso

app/Http/Controllers/BillingController.php
public function trackUsage(Request $request): JsonResponse
{
    $request->validate([
        'customer_id' => 'required|string',
    ]);

    $this->commet->usage->track(
        customerId: $request->input('customer_id'),
        feature: 'api_calls',
        value: 1,
    );

    return response()->json(['tracked' => true]);
}

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

Portal del Cliente

app/Http/Controllers/BillingController.php
use Illuminate\Http\RedirectResponse;

public function portal(): RedirectResponse
{
    $result = $this->commet->portal->getUrl(customerId: 'user_123');

    return redirect($result->data['portal_url']);
}

Webhooks

app/Http/Controllers/WebhookController.php
<?php

namespace App\Http\Controllers;

use Commet\Webhooks;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;

class WebhookController extends Controller
{
    public function handle(Request $request): JsonResponse
    {
        $webhooks = new Webhooks();

        $payload = $webhooks->verifyAndParse(
            rawBody: $request->getContent(),
            signature: $request->header('x-commet-signature'),
            secret: config('services.commet.webhook_secret'),
        );

        if ($payload === null) {
            return response()->json(['error' => 'Invalid signature'], 401);
        }

        match ($payload['event']) {
            'subscription.activated' => $this->handleActivated($payload),
            'subscription.canceled' => $this->handleCanceled($payload),
            default => null,
        };

        return response()->json(['ok' => true]);
    }

    private function handleActivated(array $payload): void
    {
        // manejar activación
    }

    private function handleCanceled(array $payload): void
    {
        // manejar cancelación
    }
}

Excluye la ruta del webhook de la verificación CSRF:

bootstrap/app.php
->withMiddleware(function (Middleware $middleware) {
    $middleware->validateCsrfTokens(except: [
        'webhooks/commet',
    ]);
})

Rutas

routes/api.php
<?php

use App\Http\Controllers\BillingController;
use App\Http\Controllers\WebhookController;
use Illuminate\Support\Facades\Route;

Route::post('/billing/subscribe', [BillingController::class, 'subscribe']);
Route::get('/billing/subscription/{customerId}', [BillingController::class, 'getSubscription']);
Route::get('/billing/features/{feature}/{customerId}', [BillingController::class, 'checkFeature']);
Route::post('/billing/usage', [BillingController::class, 'trackUsage']);
Route::get('/billing/portal', [BillingController::class, 'portal']);
Route::post('/webhooks/commet', [WebhookController::class, 'handle']);

Relacionado

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

¿Cómo está esta guía?

Integrar con PHP

Instala y configura el SDK de Commet para PHP.

Integrar con Symfony

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

En esta página

Instalar
Configurar
Suscribir
Verificar acceso
Trackear uso
Portal del Cliente
Webhooks
Rutas
Relacionado