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 :

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 :

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 :

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.