Saltar al contenido principal
El SDK de PHP proporciona una forma robusta y flexible de integrar Dodo Payments en tus aplicaciones PHP. Construido siguiendo los estándares modernos de PHP con autoloading PSR-4, ofrece una amplia cobertura de pruebas y documentación detallada.

Instalación

Instala el SDK con Composer:
composer require "dodopayments/client 5.8.1"
El SDK requiere PHP 8.1.0 o superior y Composer para la gestión de dependencias.

Inicio rápido

Inicializa el cliente y crea una sesión de pago:
<?php

use Dodopayments\Client;

$client = new Client(
  bearerToken: getenv('DODO_PAYMENTS_API_KEY') ?: 'My Bearer Token',
  environment: 'test_mode',
);

$checkoutSessionResponse = $client->checkoutSessions->create(
  productCart: [["productID" => "product_id", "quantity" => 1]]
);

var_dump($checkoutSessionResponse->session_id);
Guarda tus claves de API de forma segura utilizando variables de entorno. Nunca las expongas en tu código ni las incluyas en el control de versiones.

Características principales

PSR-4 Compliant

Cumple con las Recomendaciones de Estándares de PHP para el desarrollo moderno en PHP

Modern PHP

Diseñado para PHP 8.1+ con declaraciones de tipo y tipos estrictos

Extensive Testing

Cobertura de pruebas integral para garantizar fiabilidad y estabilidad

Exception Handling

Tipos de excepción claros para distintos escenarios de error

Objetos de valor

El SDK utiliza parámetros nombrados para especificar argumentos opcionales. Puedes inicializar objetos de valor usando el constructor estático with:
<?php

use Dodopayments\Customers\AttachExistingCustomer;

// Recommended: Use static 'with' constructor with named parameters
$customer = AttachExistingCustomer::with(customerID: "customer_id");
También hay constructores disponibles como patrón alternativo:
<?php

use Dodopayments\Customers\AttachExistingCustomer;

// Alternative: Use builder pattern
$customer = (new AttachExistingCustomer)->withCustomerID("customer_id");

Configuración

Configuración de reintentos

Ciertos errores se reintentan automáticamente 2 veces por defecto con un retroceso exponencial corto. Los siguientes errores activan reintentos automáticos:
  • Errores de conexión (problemas de conectividad de red)
  • 408 Request Timeout
  • 409 Conflict
  • 429 Rate Limit
  • 500+ Internal errors
  • Timeouts
Configura el comportamiento de reintentos de forma global o por solicitud:
<?php

use Dodopayments\Client;

// Configure default for all requests (disable retries)
$client = new Client(requestOptions: ['maxRetries' => 0]);

// Or, configure per-request
$result = $client->checkoutSessions->create(
  productCart: [["productID" => "product_id", "quantity" => 1]],
  requestOptions: ['maxRetries' => 5],
);

Operaciones comunes

Crear una sesión de pago

Genera una sesión de pago:
$session = $client->checkoutSessions->create(
  productCart: [
    ["productID" => "prod_123", "quantity" => 1]
  ],
  returnUrl: "https://yourdomain.com/return"
);

header('Location: ' . $session->url);

Gestionar clientes

Crea y recupera información de clientes:
// Create a customer
$customer = $client->customers->create(
  email: "customer@example.com",
  name: "John Doe",
  metadata: [
    "user_id" => "12345"
  ]
);

// Retrieve customer
$customer = $client->customers->retrieve("cus_123");
echo "Customer: {$customer->name} ({$customer->email})";

Gestionar suscripciones

Crea y administra suscripciones recurrentes:
// Create a subscription
$subscription = $client->subscriptions->create(
  customerID: "cus_123",
  productID: "prod_456",
  priceID: "price_789"
);

// Cancel subscription
$client->subscriptions->cancel($subscription->id);

Paginación

Trabaja con respuestas de listas paginadas:
$page = $client->payments->list();

var_dump($page);

// Fetch items from the current page
foreach ($page->getItems() as $item) {
  var_dump($item->brand_id);
}

// Auto-paginate: fetch items from all pages
foreach ($page->pagingEachItem() as $item) {
  var_dump($item->brand_id);
}

Manejo de errores

Cuando la biblioteca no puede conectarse a la API o recibe un código de estado que no indica éxito (4xx o 5xx), se lanza una subclase de APIException:
<?php

use Dodopayments\Core\Exceptions\APIConnectionException;
use Dodopayments\Core\Exceptions\RateLimitException;
use Dodopayments\Core\Exceptions\APIStatusException;

try {
  $checkoutSessionResponse = $client->checkoutSessions->create(
    productCart: [["productID" => "product_id", "quantity" => 1]]
  );
} catch (APIConnectionException $e) {
  echo "The server could not be reached", PHP_EOL;
  var_dump($e->getPrevious());
} catch (RateLimitException $_) {
  echo "A 429 status code was received; we should back off a bit.", PHP_EOL;
} catch (APIStatusException $e) {
  echo "Another non-200-range status code was received", PHP_EOL;
  echo $e->getMessage();
}

Tipos de errores

CausaTipo de error
HTTP 400BadRequestException
HTTP 401AuthenticationException
HTTP 403PermissionDeniedException
HTTP 404NotFoundException
HTTP 409ConflictException
HTTP 422UnprocessableEntityException
HTTP 429RateLimitException
HTTP >= 500InternalServerException
Otro error HTTPAPIStatusException
Tiempo de espera agotadoAPITimeoutException
Error de redAPIConnectionException
Siempre envuelve las llamadas a la API en bloques try-catch para manejar errores potenciales con gracia y ofrecer retroalimentación significativa a los usuarios.

Uso avanzado

Endpoints no documentados

Realiza solicitudes a endpoints no documentados:
<?php

$response = $client->request(
  method: "post",
  path: '/undocumented/endpoint',
  query: ['dog' => 'woof'],
  headers: ['useful-header' => 'interesting-value'],
  body: ['hello' => 'world']
);

Parámetros no documentados

Envía parámetros no documentados a cualquier endpoint o lee propiedades no documentadas de la respuesta:
<?php

use Dodopayments\RequestOptions;

$checkoutSessionResponse = $client->checkoutSessions->create(
  productCart: [["productID" => "product_id", "quantity" => 1]],
  requestOptions: [
    'extraQueryParams' => ["my_query_parameter" => "value"],
    'extraBodyParams' => ["my_body_parameter" => "value"],
    'extraHeaders' => ["my-header" => "value"],
  ],
);
Los parámetros extra* con el mismo nombre reemplazan los parámetros documentados.

Integración con frameworks

Laravel

Crea un servicio para aplicaciones Laravel:
<?php

namespace App\Services;

use Dodopayments\Client;

class PaymentService
{
    protected $client;

    public function __construct()
    {
        $this->client = new Client(
            bearerToken: config('services.dodo.api_key')
        );
    }

    public function createCheckout(array $items)
    {
        return $this->client->checkoutSessions->create(
            productCart: $items,
            returnUrl: route('checkout.return')
        );
    }
}
Agrega la configuración en config/services.php:
'dodo' => [
    'api_key' => env('DODO_API_KEY'),
    'environment' => env('DODO_ENVIRONMENT', 'sandbox')
],

Symfony

Crea un servicio en Symfony:
<?php

namespace App\Service;

use Dodopayments\Client;

class DodoPaymentService
{
    private Client $client;

    public function __construct(string $apiKey)
    {
        $this->client = new Client(bearerToken: $apiKey);
    }

    public function createPayment(int $amount, string $currency, string $customerId): object
    {
        return $this->client->payments->create(
            amount: $amount,
            currency: $currency,
            customerID: $customerId
        );
    }
}
Regístralo en config/services.yaml:
services:
  App\Service\DodoPaymentService:
    arguments:
      $apiKey: "%env(DODO_API_KEY)%"

Recursos

Soporte

¿Necesitas ayuda con el SDK de PHP?

Contribuir

¡Aceptamos contribuciones! Consulta las directrices de contribución para comenzar.