Stripe en 2023-2024 : un acteur incontournable des paiements en ligne
En 2023, Stripe a annoncé avoir traité plus de 1 trillion de dollars de paiements — soit 1 000 milliards de dollars — pour plus de 4 millions d'entreprises dans 46 pays. Fondée en 2010 par les frères Collison, la société est aujourd'hui valorisée à environ 65 milliards de dollars et reste l'une des fintech privées les plus influentes au monde.
En 2024, Stripe a renforcé sa présence en France avec des partenariats bancaires locaux facilitant l'onboarding des entreprises françaises, notamment pour les professions réglementées (avocats, médecins, artisans) qui avaient parfois du mal à obtenir un compte Stripe. Le paiement fractionné (3x, 4x) et la conformité PSD2/SCA sont également devenus plus accessibles pour les développeurs européens.
Pourquoi nous utilisons Stripe sans SDK officiel
Stripe propose des SDK officiels pour PHP, Python, Node.js, etc. Ces SDK sont excellents et nous les recommandons pour les grands projets. Chez ADRD, nous avons cependant opté pour une approche cURL native sans dépendance Composer sur nos projets Hostinger pour trois raisons :
- Portabilité maximale : fonctionne sur n'importe quel hébergement PHP sans accès SSH ni Composer
- Zéro dépendance externe : pas de risque de breaking change lors d'une mise à jour du SDK
- Compréhension profonde : forcer à lire la documentation API directement donne une meilleure maîtrise des cas limites
Notre StripeManager — Architecture complète
Voici la structure de notre includes/stripe.php utilisé sur Stoubook et RecruteX :
class StripeManager {
private string $secretKey;
private string $baseUrl = 'https://api.stripe.com/v1';
public function __construct() {
$pdo = getDbConnection();
$stmt = $pdo->prepare("SELECT value FROM settings WHERE key_name = 'stripe_secret_key'");
$stmt->execute();
$this->secretKey = $stmt->fetchColumn();
}
private function request(string $method, string $endpoint, array $data = []): array {
$ch = curl_init($this->baseUrl . $endpoint);
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_USERPWD => $this->secretKey . ':',
CURLOPT_HTTPHEADER => ['Content-Type: application/x-www-form-urlencoded']
]);
if ($method === 'POST') {
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($data));
}
$response = json_decode(curl_exec($ch), true);
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if ($httpCode >= 400) {
throw new Exception($response['error']['message'] ?? 'Stripe error ' . $httpCode);
}
return $response;
}
public function createCustomer(string $email, string $name): string {
$customer = $this->request('POST', '/customers', [
'email' => $email,
'name' => $name
]);
return $customer['id']; // cus_xxxxx
}
public function createSubscription(string $customerId, string $priceId): array {
return $this->request('POST', '/subscriptions', [
'customer' => $customerId,
'items[0][price]' => $priceId,
'payment_behavior' => 'default_incomplete',
'expand[]' => 'latest_invoice.payment_intent'
]);
}
public function cancelSubscription(string $subscriptionId): array {
return $this->request('POST', "/subscriptions/{$subscriptionId}", [
'cancel_at_period_end' => 'true'
]);
}
}
La clé secrète Stripe est stockée dans la table settings de la base de données, jamais en dur dans le code. C'est notre standard ADRD pour toutes les clés API.
Les webhooks : la partie que les tutoriels oublient
La majorité des tutoriels d'intégration Stripe s'arrêtent à la création d'un paiement. Mais en production, les webhooks sont absolument critiques. Ils permettent à Stripe de notifier votre serveur de tout événement asynchrone : paiement réussi, échec, abonnement résilié, remboursement...
// webhook.php — Point d'entrée Stripe
$payload = file_get_contents('php://input');
$sigHeader = $_SERVER['HTTP_STRIPE_SIGNATURE'] ?? '';
$secret = getSettingFromDb('stripe_webhook_secret');
// Vérification de la signature obligatoire
$parts = explode(',', $sigHeader);
$timestamp = str_replace('t=', '', $parts[0]);
$sigV1 = str_replace('v1=', '', $parts[1]);
$expected = hash_hmac('sha256', $timestamp . '.' . $payload, $secret);
if (!hash_equals($expected, $sigV1)) {
http_response_code(400);
exit('Signature invalide');
}
$event = json_decode($payload, true);
switch ($event['type']) {
case 'invoice.payment_succeeded':
// Activer/renouveler l'abonnement en BDD
activateSubscription($event['data']['object']['customer']);
break;
case 'customer.subscription.deleted':
// Désactiver l'accès
deactivateSubscription($event['data']['object']['customer']);
break;
case 'invoice.payment_failed':
// Notifier l'utilisateur + passer en statut "past_due"
handlePaymentFailed($event['data']['object']['customer']);
break;
}
Notre modèle de données BDD pour les abonnements Stripe
Deux colonnes sont indispensables dans votre table users :
ALTER TABLE users ADD COLUMN stripe_customer_id VARCHAR(50) NULL;
ALTER TABLE users ADD COLUMN stripe_subscription_id VARCHAR(50) NULL;
Jamais de données de carte en base. Jamais. Stripe gère tout le stockage des moyens de paiement — c'est précisément pourquoi on l'utilise.
Gestion des cas d'échec : ce que coûte l'imprévision
Sur Stoubook, notre première version ne gérait pas correctement les échecs de paiement. Résultat : des utilisateurs dont l'abonnement avait expiré continuaient d'accéder aux fonctionnalités premium. Le correctif a représenté 1 journée de développement. Désormais, notre workflow inclut systématiquement :
- Vérification du statut d'abonnement à chaque requête sur les pages premium
- Email de relance J+1, J+3, J+7 après un échec de paiement
- Rétrogradation automatique au plan gratuit après 14 jours sans paiement
- Journalisation de tous les événements Stripe dans une table
billing_logs
Stripe ou PayPlug ? Le choix pour les PME françaises
PayPlug (filiale de Natixis) est une alternative française à Stripe avec des frais similaires (1,4 % + 0,25 € pour les cartes européennes) et un support en français. Nous recommandons :
- Stripe pour les projets avec dimension internationale, abonnements récurrents, ou besoins de customisation avancée
- PayPlug pour les projets 100 % français B2C avec besoin de support téléphonique en français
Vous avez besoin d'intégrer Stripe ou un système de paiement dans votre application ? Contactez l'équipe ADRD — nous livrons des intégrations paiement robustes et testées en 3 à 5 jours.