Passer au contenu principal
Le SDK PHP offre un moyen robuste et flexible d’intégrer Dodo Payments dans vos applications PHP. Construit selon les normes PHP modernes avec autoloading PSR-4, il offre une couverture de test étendue et une documentation détaillée.
La bibliothèque API PHP de Dodo Payments est actuellement en bêta. Nous sommes impatients que vous l’expérimentiez ! Veuillez partager vos suggestions, rapports de bogues ou demandes de fonctionnalités en déposant un problème.

Installation

Installez le SDK en utilisant Composer :
composer require "dodopayments/client:^3.5.0"
Le SDK nécessite PHP 8.1.0 ou supérieur et Composer pour la gestion des dépendances.

Démarrage rapide

Initialisez le client et créez une session de paiement :
<?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);
Conservez vos clés API en toute sécurité en utilisant des variables d’environnement. Ne les exposez jamais dans votre code ou ne les engagez pas dans le contrôle de version.

Fonctionnalités principales

Conforme à PSR-4

Suit les recommandations de normes PHP pour le développement PHP moderne

PHP moderne

Conçu pour PHP 8.1+ avec des déclarations de type et des types stricts

Tests étendus

Couverture de test complète pour la fiabilité et la stabilité

Gestion des exceptions

Types d’exceptions clairs pour différents scénarios d’erreur

Objets de valeur

Le SDK utilise des paramètres nommés pour spécifier des arguments optionnels. Vous pouvez initialiser des objets de valeur en utilisant le constructeur statique with :
<?php

use Dodopayments\Customers\AttachExistingCustomer;

// Recommended: Use static 'with' constructor with named parameters
$customer = AttachExistingCustomer::with(customerID: "customer_id");
Des constructeurs sont également disponibles comme un modèle alternatif :
<?php

use Dodopayments\Customers\AttachExistingCustomer;

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

Configuration

Configuration de réessai

Certaines erreurs sont automatiquement réessayées 2 fois par défaut avec un court délai exponentiel. Les erreurs suivantes déclenchent des réessais automatiques :
  • Erreurs de connexion (problèmes de connectivité réseau)
  • 408 Délai d’attente de la requête
  • 409 Conflit
  • 429 Limite de taux
  • Erreurs internes 500+
  • Délai d’attente
Configurez le comportement de réessai globalement ou par requête :
<?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),
);

Opérations courantes

Créer une session de paiement

Générez une session de paiement :
$session = $client->checkoutSessions->create(
  productCart: [
    ["productID" => "prod_123", "quantity" => 1]
  ],
  returnUrl: "https://yourdomain.com/return"
);

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

Gérer les clients

Créez et récupérez des informations sur les clients :
// 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})";

Gérer les abonnements

Créez et gérez des abonnements récurrents :
// Create a subscription
$subscription = $client->subscriptions->create(
  customerID: "cus_123",
  productID: "prod_456",
  priceID: "price_789"
);

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

Pagination

Travaillez avec des réponses de liste paginées :
$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);
}

Gestion des erreurs

Lorsque la bibliothèque ne peut pas se connecter à l’API ou reçoit un code d’état non réussi (4xx ou 5xx), une sous-classe de APIException est lancée :
<?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();
}

Types d’erreurs

CauseType d’erreur
HTTP 400BadRequestException
HTTP 401AuthenticationException
HTTP 403PermissionDeniedException
HTTP 404NotFoundException
HTTP 409ConflictException
HTTP 422UnprocessableEntityException
HTTP 429RateLimitException
HTTP >= 500InternalServerException
Autre erreur HTTPAPIStatusException
Délai d’attenteAPITimeoutException
Erreur réseauAPIConnectionException
Enveloppez toujours les appels API dans des blocs try-catch pour gérer les erreurs potentielles de manière élégante et fournir des retours significatifs aux utilisateurs.

Utilisation avancée

Points de terminaison non documentés

Faites des requêtes vers des points de terminaison non documentés :
<?php

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

Paramètres non documentés

Envoyez des paramètres non documentés à n’importe quel point de terminaison ou lisez des propriétés de réponse non documentées :
<?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"],
  ),
);
Les paramètres extra* portant le même nom remplacent les paramètres documentés.

Intégration de framework

Laravel

Créez un service pour les applications 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')
        );
    }
}
Ajoutez la configuration dans config/services.php :
'dodo' => [
    'api_key' => env('DODO_API_KEY'),
    'environment' => env('DODO_ENVIRONMENT', 'sandbox')
],

Symfony

Créez un service dans 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
        );
    }
}
Enregistrez dans config/services.yaml :
services:
    App\Service\DodoPaymentService:
        arguments:
            $apiKey: '%env(DODO_API_KEY)%'

Ressources

Support

Besoin d’aide avec le SDK PHP ?

Contribuer

Nous accueillons les contributions ! Consultez les directives de contribution pour commencer.