Bien démarrer¶
De zéro à vos premiers appels à l'API Pennylane en quelques minutes.
1. Installer le paquet¶
composer require goatandcow7/pennylane-sdk
PHP 8.2 ou supérieur est requis. Le SDK dialogue en HTTP via PSR-18 ; si aucun client PSR-18 ni fabriques PSR-17 ne sont déjà présents dans votre projet, ajoutez Guzzle :
composer require guzzlehttp/guzzle
et autorisez le plugin de découverte une fois dans composer.json :
"config": {
"allow-plugins": {
"php-http/discovery": true
}
}
2. Obtenir un jeton d'API¶
Le SDK dialogue avec deux API Pennylane distinctes, chacune avec son propre jeton :
Company API (vous gérez la comptabilité et la facturation d'une seule société) :
- Connectez-vous à Pennylane avec un compte administrateur.
- Allez dans Paramètres > Connectivité > Développeurs.
- Créez un jeton : donnez-lui un nom, choisissez les permissions (lecture seule, ou lecture et écriture) et une date d'expiration.
- Copiez-le immédiatement : Pennylane ne l'affiche qu'une seule fois.
Firm API (vous êtes un cabinet d'expertise comptable travaillant sur plusieurs dossiers clients) : générez un jeton Firm depuis les paramètres de votre compte cabinet.
3. Configurer le jeton¶
La méthode recommandée est une variable d'environnement, pour que le jeton ne se retrouve jamais dans votre code :
export PENNYLANE_API_TOKEN="your-token" # Company API
export PENNYLANE_FIRM_API_TOKEN="your-token" # Firm API
<?php
use Pennylane\Sdk\Pennylane;
$client = new Pennylane(); // récupère PENNYLANE_API_TOKEN
Vous pouvez aussi le passer explicitement, par exemple lorsqu'un même processus gère plusieurs sociétés :
$client = new Pennylane(apiToken: 'your-token');
4. Premiers appels¶
Récupérez l'identité liée au jeton courant :
$me = $client->me->retrieve();
print_r($me);
Si le jeton est valide, vous récupérez le profil de votre société. Sinon, le SDK lève une Pennylane\Sdk\Exception\AuthenticationException.
Lister des factures :
foreach ($client->customerInvoices->list(limit: 20) as $invoice) {
echo $invoice->invoiceNumber . ' ' . $invoice->currencyAmount . PHP_EOL;
}
Créer un produit :
use Pennylane\Sdk\Exception\ValidationException;
try {
$product = $client->products->create(
label: 'Journée de conseil',
priceBeforeTax: '450.00',
vatRate: 'FR_200',
);
echo $product->id . PHP_EOL;
} catch (ValidationException $e) {
echo $e->getMessage() . PHP_EOL;
}
Les montants sont toujours passés sous forme de chaînes numériques ('450.00'), jamais de flottants PHP : les flottants perdraient de la précision décimale sur des données comptables, et le SDK les rejette.
5. Gestion des erreurs, les bases¶
Toute exception levée par le SDK dérive de Pennylane\Sdk\Exception\PennylaneException, il suffit donc de l'intercepter pour gérer n'importe quel échec du SDK en un seul endroit :
use Pennylane\Sdk\Exception\PennylaneException;
try {
$client->customerInvoices->finalize($invoiceId);
} catch (PennylaneException $e) {
echo $e->getMessage() . PHP_EOL;
}
Pour une gestion plus fine, interceptez plutôt la sous-classe spécifique (AuthenticationException, PermissionDeniedException, ValidationException, RateLimitException...). Voir le guide des erreurs et nouvelles tentatives pour la hiérarchie complète et la politique de nouvelles tentatives.
6. Explorer les ressources¶
Le client expose une propriété par ressource de l'API, en camelCase. Quelques exemples :
| Propriété | Ce qu'elle gère |
|---|---|
$client->customerInvoices |
Factures de vente et avoirs : création, finalisation, envoi, import de PDF et de factures électroniques |
$client->quotes |
Devis, et leur transformation en factures |
$client->customers |
Clients, avec ->companies (B2B) et ->individuals (B2C) |
$client->products |
Catalogue produits |
$client->supplierInvoices |
Factures d'achat, imports, statut de paiement |
$client->transactions |
Transactions bancaires, rapprochement avec les factures |
$client->ledgerEntries |
Écritures comptables |
$client->ledgerEntryLines |
Lignes d'écriture, lettrage |
$client->trialBalance |
Balance générale |
$client->exports |
Exports FEC, grand livre et analytiques |
$client->changelogs |
Flux de modifications pour synchroniser les données de façon incrémentale |
La liste complète se trouve dans le contrat de conception.
7. Options du client¶
$client = new Pennylane(
apiToken: null, // par défaut : variable d'environnement PENNYLANE_API_TOKEN
baseUrl: null, // à surcharger pour les proxys
httpClient: null, // utilisez votre propre client PSR-18
requestFactory: null, // utilisez votre propre fabrique de requêtes PSR-17
streamFactory: null, // utilisez votre propre fabrique de flux PSR-17
autoThrottle: true, // cadence les requêtes sous la limite de débit de l'API
maxRetries: 3, // nouvelles tentatives automatiques (429, erreurs réseau transitoires)
timeout: 60.0, // secondes, nécessite Guzzle ou un client injecté
);
Pour aller plus loin¶
- Authentification : scopes des jetons, OAuth, bonnes pratiques.
- Pagination et filtrage : curseurs, filtres, tri.
- Erreurs, retries et limites de débit : hiérarchie des exceptions, politique de nouvelles tentatives, régulation de débit.