Skip to content
Learni
Voir tous les tutoriels
Paiements et fraude

Comment configurer Stripe Radar avancé en 2026

18 minADVANCED
Read in English

Introduction

Stripe Radar protège les paiements grâce à un moteur de détection de fraude alimenté par l'apprentissage automatique. En 2026, les entreprises traitent des volumes élevés de transactions internationales, rendant les règles statiques insuffisantes. Ce tutoriel montre comment créer des règles dynamiques, automatiser les revues et intégrer des signaux contextuels. Vous apprendrez à réduire les faux positifs tout en bloquant les fraudes sophistiquées. Chaque étape inclut du code TypeScript fonctionnel prêt à déployer.

Prérequis

  • Compte Stripe avec Radar activé (plan Pro ou supérieur)
  • Node.js 20+ et TypeScript
  • Clés API Stripe (test et live)
  • Connaissances solides des webhooks et des transactions

Initialisation du client Stripe

lib/stripe.ts
import Stripe from 'stripe';

export const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
  apiVersion: '2025-12-31.acacia',
  typescript: true,
});

Initialisez le client avec la dernière version d'API. Stockez la clé dans les variables d'environnement et activez le typage strict pour éviter les erreurs de runtime.

Création d'une règle Radar personnalisée

scripts/createRadarRule.ts
import { stripe } from '../lib/stripe';

async function createRadarRule() {
  const rule = await stripe.radar.valueLists.create({
    alias: 'high_risk_countries_2026',
    name: 'Pays à risque élevé 2026',
    items: [
      { value: 'NG' },
      { value: 'RU' }
    ]
  });

  const radarRule = await stripe.radar.rules.create({
    action: 'review',
    predicate: `card.country in ${rule.id}`,
    scope: 'all'
  });
  console.log('Règle créée:', radarRule.id);
}

createRadarRule();

Cette règle déclenche une revue manuelle pour les pays à haut risque. Utilisez des value lists pour maintenir facilement la liste sans modifier le code.

Gestion des événements de revue via webhook

app/api/webhooks/stripe/route.ts
import { stripe } from '@/lib/stripe';
import { headers } from 'next/headers';

export async function POST(req: Request) {
  const body = await req.text();
  const sig = headers().get('stripe-signature')!;

  let event;
  try {
    event = stripe.webhooks.constructEvent(body, sig, process.env.STRIPE_WEBHOOK_SECRET!);
  } catch (err) {
    return new Response('Webhook signature invalide', { status: 400 });
  }

  if (event.type === 'review.created' || event.type === 'review.closed') {
    const review = event.data.object;
    await handleRadarReview(review);
  }
  return new Response('OK', { status: 200 });
}

async function handleRadarReview(review: any) {
  console.log('Revue Radar:', review.id, review.reason);
  // Logique métier : notifier l'équipe ou bloquer l'utilisateur
}

Vérifiez la signature du webhook pour sécuriser l'endpoint. Traitez les événements review.created et review.closed pour automatiser les décisions et les notifications internes.

Mise à jour dynamique des value lists

scripts/updateValueList.ts
import { stripe } from '../lib/stripe';

async function updateValueList(listId: string, newCountries: string[]) {
  const list = await stripe.radar.valueLists.retrieve(listId);
  const existing = list.items.map((i: any) => i.value);
  const toAdd = newCountries.filter(c => !existing.includes(c));

  for (const country of toAdd) {
    await stripe.radar.valueListItems.create({
      value_list: listId,
      value: country
    });
  }
  console.log('Liste mise à jour avec', toAdd.length, 'nouveaux pays');
}

Ajoutez dynamiquement des pays sans recréer la liste. Évitez les doublons pour garder les règles performantes et éviter les coûts inutiles.

Requête de décision Radar en temps réel

lib/radarDecision.ts
import { stripe } from './stripe';

export async function evaluateWithRadar(paymentIntentId: string) {
  const pi = await stripe.paymentIntents.retrieve(paymentIntentId, {
    expand: ['latest_charge']
  });

  const charge = pi.latest_charge as any;
  if (charge && charge.outcome && charge.outcome.risk_score > 75) {
    await stripe.paymentIntents.cancel(paymentIntentId);
    return { blocked: true, reason: 'Radar score élevé' };
  }
  return { blocked: false };
}

Récupérez le score de risque après la création du PaymentIntent. Annulez automatiquement les transactions à haut risque pour réduire les pertes.

Bonnes pratiques

  • Testez toujours les règles en mode test avant de passer en live
  • Utilisez des value lists plutôt que des prédicats en dur
  • Surveillez les métriques de faux positifs hebdomadairement
  • Combinez Radar avec 3D Secure pour les scores intermédiaires
  • Documentez chaque règle avec son impact attendu sur le taux de fraude

Erreurs courantes à éviter

  • Oublier de vérifier la signature des webhooks (risque de spoofing)
  • Créer trop de règles contradictoires qui se neutralisent
  • Ignorer les événements review.closed et accumuler des revues manuelles
  • Ne pas mettre à jour les value lists avec des données fraîches

Pour aller plus loin

Approfondissez l'automatisation avec nos formations Learni sur Stripe et la fraude.

Comment configurer Stripe Radar avancé en 2026 | Learni