> ## Documentation Index
> Fetch the complete documentation index at: https://commet.co/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Integrar con PHP

> Instala y configura el SDK de Commet para PHP.

Instala la Commet Skill para que tu agente integre el SDK actual y valide su trabajo contra el contrato vivo de la API.

```bash theme={null}
npx skills add commet-labs/skills --skill commet
```

<Steps>
  <Step title="Instalar">
    ```bash theme={null}
    composer require commet/commet-php
    ```
  </Step>

  <Step title="Configurar">
    ```bash title=".env" theme={null}
    COMMET_API_KEY=ck_sandbox_xxx
    ```

    ```php title="commet.php" theme={null}
    <?php

    require_once __DIR__ . '/vendor/autoload.php';

    use Commet\Commet;

    $commet = new Commet(
        apiKey: $_ENV['COMMET_API_KEY'],
    );
    ```
  </Step>

  <Step title="Crear cliente y suscribir">
    `customers->create` es idempotente — si ya existe un cliente con el mismo `id`, devuelve el registro existente.

    ```php theme={null}
    $commet->customers->create(
        email: 'user@example.com',
        id: 'user_123',
    );

    $subscription = $commet->subscriptions->create(
        customerId: 'user_123',
        planCode: 'pro',
    );

    $checkoutUrl = $subscription->checkoutUrl;
    ```

    El cliente es redirigido al checkout para completar el pago.
  </Step>

  <Step title="Verificar acceso">
    ```php theme={null}
    $sub = $commet->subscriptions->getActive('user_123');
    $status = $sub?->status->value;

    $access = $commet->featureAccess->get(code: 'custom_branding', customerId: 'user_123');
    $allowed = $access->allowed;
    ```
  </Step>

  <Step title="Trackear uso">
    ```php theme={null}
    $commet->usage->track(
        customerId: 'user_123',
        featureCode: 'api_calls',
        value: 1,
    );
    ```

    El uso se agrega y se cobra al final del período.
  </Step>

  <Step title="Webhooks">
    ```php theme={null}
    <?php

    use Commet\Resources\WebhooksResource;

    $webhooks = new WebhooksResource();

    $payload = $webhooks->verifyAndParse(
        rawBody: file_get_contents('php://input'),
        signature: $_SERVER['HTTP_X_COMMET_SIGNATURE'] ?? '',
        secret: $_ENV['COMMET_WEBHOOK_SECRET'],
    );

    if ($payload === null) {
        http_response_code(401);
        echo json_encode(['error' => 'Invalid signature']);
        exit;
    }

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

    echo json_encode(['ok' => true]);
    ```
  </Step>
</Steps>

## Relacionado

* [Laravel](/docs/es/integrate-with-laravel)
* [Symfony](/docs/es/integrate-with-symfony)
* [Referencia del SDK](/docs/es/sdk-reference)


## Related topics

- [Integrar con Laravel](/docs/es/integrate-with-laravel.md)
- [Integrar con Symfony](/docs/es/integrate-with-symfony.md)
- [Integrar con Flask](/docs/es/integrate-with-flask.md)
- [Integrar con Java](/docs/es/integrate-with-java.md)
- [Integrar con Django](/docs/es/integrate-with-django.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.