Pular para o conteúdo principal
O SDK PHP fornece uma maneira robusta e flexível de integrar os pagamentos Dodo em suas aplicações PHP. Construído seguindo os padrões modernos de PHP com autoloading PSR-4, oferece ampla cobertura de testes e documentação detalhada.
A Biblioteca API PHP dos Pagamentos Dodo está atualmente em beta. Estamos empolgados para que você experimente! Por favor, compartilhe quaisquer sugestões, relatórios de bugs ou solicitações de recursos abrindo uma issue.

Instalação

Instale o SDK usando o Composer:
composer require "dodopayments/client:^3.5.0"
O SDK requer PHP 8.1.0 ou superior e Composer para gerenciamento de dependências.

Início Rápido

Inicialize o cliente e crie uma sessão de checkout:
<?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);
Armazene suas chaves de API de forma segura usando variáveis de ambiente. Nunca as exponha em seu código ou as comite no controle de versão.

Recursos Principais

Compatível com PSR-4

Segue as Recomendações de Padrões PHP para desenvolvimento moderno em PHP

PHP Moderno

Construído para PHP 8.1+ com declarações de tipo e tipos estritos

Testes Abrangentes

Cobertura de testes abrangente para confiabilidade e estabilidade

Tratamento de Exceções

Tipos de exceção claros para diferentes cenários de erro

Objetos de Valor

O SDK usa parâmetros nomeados para especificar argumentos opcionais. Você pode inicializar objetos de valor usando o construtor estático with:
<?php

use Dodopayments\Customers\AttachExistingCustomer;

// Recommended: Use static 'with' constructor with named parameters
$customer = AttachExistingCustomer::with(customerID: "customer_id");
Os construtores também estão disponíveis como um padrão alternativo:
<?php

use Dodopayments\Customers\AttachExistingCustomer;

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

Configuração

Configuração de Retentativas

Certos erros são automaticamente tentados 2 vezes por padrão com um curto backoff exponencial. Os seguintes erros acionam tentativas automáticas:
  • Erros de conexão (problemas de conectividade de rede)
  • 408 Tempo de Solicitação Esgotado
  • 409 Conflito
  • 429 Limite de Taxa
  • Erros Internos 500+
  • Timeouts
Configure o comportamento de retentativa globalmente ou por solicitação:
<?php

use Dodopayments\Client;
use Dodopayments\RequestOptions;

// Configure default for all requests (disable retries)
$client = new Client(maxRetries: 0);

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

Operações Comuns

Criar uma Sessão de Checkout

Gere uma sessão de checkout:
$session = $client->checkoutSessions->create(
  productCart: [
    ["productID" => "prod_123", "quantity" => 1]
  ],
  returnUrl: "https://yourdomain.com/return"
);

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

Gerenciar Clientes

Crie e recupere informações de clientes:
// Create a customer
$customer = $client->customers->create(
  email: "[email protected]",
  name: "John Doe",
  metadata: [
    "user_id" => "12345"
  ]
);

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

Gerenciar Assinaturas

Crie e gerencie assinaturas recorrentes:
// Create a subscription
$subscription = $client->subscriptions->create(
  customerID: "cus_123",
  productID: "prod_456",
  priceID: "price_789"
);

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

Paginação

Trabalhe com respostas de lista 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);
}

Tratamento de Erros

Quando a biblioteca não consegue se conectar à API ou recebe um código de status não-sucedido (4xx ou 5xx), uma subclasse de APIException é lançada:
<?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 Erro

CausaTipo de Erro
HTTP 400BadRequestException
HTTP 401AuthenticationException
HTTP 403PermissionDeniedException
HTTP 404NotFoundException
HTTP 409ConflictException
HTTP 422UnprocessableEntityException
HTTP 429RateLimitException
HTTP >= 500InternalServerException
Outro erro HTTPAPIStatusException
TimeoutAPITimeoutException
Erro de RedeAPIConnectionException
Sempre envolva chamadas de API em blocos try-catch para tratar potenciais erros de forma elegante e fornecer feedback significativo aos usuários.

Uso Avançado

Endpoints Não Documentados

Faça solicitações para endpoints não documentados:
<?php

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

Parâmetros Não Documentados

Envie parâmetros não documentados para qualquer endpoint ou leia propriedades de resposta não documentadas:
<?php

use Dodopayments\RequestOptions;

$checkoutSessionResponse = $client->checkoutSessions->create(
  productCart: [["productID" => "product_id", "quantity" => 1]],
  requestOptions: RequestOptions::with(
    extraQueryParams: ["my_query_parameter" => "value"],
    extraBodyParams: ["my_body_parameter" => "value"],
    extraHeaders: ["my-header" => "value"],
  ),
);
Os parâmetros extra* com o mesmo nome substituem os parâmetros documentados.

Integração com Frameworks

Laravel

Crie um serviço para aplicações 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')
        );
    }
}
Adicione configuração em config/services.php:
'dodo' => [
    'api_key' => env('DODO_API_KEY'),
    'environment' => env('DODO_ENVIRONMENT', 'sandbox')
],

Symfony

Crie um serviço no 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
        );
    }
}
Registre em config/services.yaml:
services:
    App\Service\DodoPaymentService:
        arguments:
            $apiKey: '%env(DODO_API_KEY)%'

Recursos

Suporte

Precisa de ajuda com o SDK PHP?

Contribuindo

Agradecemos contribuições! Confira as diretrizes de contribuição para começar.