La sécurité des paiements : un enjeu de confiance
Au Sénégal, la peur de l’arnaque en ligne est le premier frein à l’achat. Vos clients se demandent : « Est-ce que mon argent est en sécurité ? », « Est-ce que je vais vraiment recevoir mon produit ? ». Sécuriser vos paiements n’est pas seulement technique, c’est avant tout un signal de confiance envoyé à vos clients.
Les fondamentaux : certificat SSL
Le certificat SSL (le cadenas dans la barre d’adresse + https://) est obligatoire pour toute boutique en ligne :
- Chiffre les données entre le navigateur du client et votre serveur
- Google le prend en compte pour le référencement (SEO)
- WooCommerce l’exige pour activer les passerelles de paiement
- Let’s Encrypt est gratuit et inclus chez la plupart des hébergeurs (O2Switch, Hostinger)
Vérifiez dans WooCommerce > État du système que la ligne « Forcé SSL » est activé. Si non, allez dans WooCommerce > Réglages > Avancé et cochez « Forcer le checkout sécurisé ».
Sécuriser WooCommerce
Mises à jour régulières
80% des piratages WordPress exploitent des failles connues dans des versions obsolètes :
- Mettez à jour WordPress, WooCommerce et tous les plugins chaque semaine
- Mettez à jour votre thème
- Supprimez les plugins et thèmes inactifs
- Faites un backup avant chaque mise à jour (plugin UpdraftPlus gratuit)
Plugin de sécurité : Wordfence
Installez Wordfence Security (gratuit) :
- Firewall : bloque les attaques avant qu’elles n’atteignent WordPress
- Scan malware : détecte les fichiers modifiés ou malveillants
- Protection brute force : limite les tentatives de connexion
- Authentification 2FA : double vérification pour la connexion admin
Sécuriser wp-config.php
// Ajouter dans wp-config.php
// Désactiver l'éditeur de fichiers dans l'admin
define('DISALLOW_FILE_EDIT', true);
// Forcer SSL pour l'admin
define('FORCE_SSL_ADMIN', true);
// Changer le préfixe de table (lors de l'installation)
// $table_prefix = 'wp_'; → $table_prefix = 'itsc_';
// Clés de sécurité uniques (générez-les sur api.wordpress.org/secret-key)
define('AUTH_KEY', 'votre_clé_unique');
define('SECURE_AUTH_KEY', 'votre_clé_unique');
// etc.
Sécurité des passerelles de paiement
Wave et Orange Money
Les paiements Wave et Orange Money sont intrinsèquement sécurisés car :
- Le client valide avec son code secret personnel sur son téléphone
- Vous ne voyez jamais les identifiants du client
- La transaction est confirmée par un callback serveur-à-serveur
- Pas de données de carte bancaire à stocker
Règles de sécurité pour les clés API :
- Stockez les clés API dans
wp-config.php, jamais dans le code du plugin - Utilisez le mode sandbox/test pour développer
- Vérifiez le montant dans chaque callback (un attaquant pourrait envoyer 100 FCFA au lieu de 10 000)
- Loguez toutes les transactions pour l’audit
Vérifier les callbacks de paiement
// Vérification sécurisée du callback de paiement
function verifier_callback_paiement($payload) {
// 1. Vérifier que le montant correspond
$order_id = intval($payload['order_id']);
$order = wc_get_order($order_id);
if (!$order) {
error_log('Callback: commande introuvable - ' . $order_id);
return false;
}
$montant_attendu = floatval($order->get_total());
$montant_recu = floatval($payload['amount']);
if (abs($montant_attendu - $montant_recu) > 1) {
error_log('Callback: montant incorrect - attendu: ' . $montant_attendu . ' reçu: ' . $montant_recu);
$order->add_order_note('ALERTE : montant callback incorrect');
return false;
}
// 2. Vérifier que la commande n'est pas déjà payée
if ($order->is_paid()) {
error_log('Callback: commande déjà payée - ' . $order_id);
return false;
}
// 3. Tout est OK, confirmer le paiement
$order->payment_complete($payload['transaction_id']);
return true;
}
Paiement par carte bancaire
Si vous acceptez les cartes bancaires via PayDunya, CinetPay ou Stripe :
- Ne stockez JAMAIS les données de carte sur votre serveur. Les passerelles gèrent cela pour vous (conformité PCI-DSS)
- Utilisez toujours la page de paiement hébergée par la passerelle (le client est redirigé vers PayDunya/CinetPay pour payer, puis revient sur votre site)
- Vérifiez que la passerelle est certifiée PCI-DSS
Protéger contre la fraude
Fraudes courantes au Sénégal
| Type de fraude | Comment ça marche | Comment s’en protéger |
|---|---|---|
| Faux paiement COD | Le client prétend avoir payé par Wave mais n’a rien envoyé | Toujours vérifier dans votre app Wave avant d’expédier |
| Capture d’écran falsifiée | Le client envoie un faux screenshot de transfert Wave | Vérifiez dans VOTRE app, pas sur le screenshot |
| Commande massive + refus | Grosse commande COD, le client ne répond plus | Confirmation téléphonique + acompte Wave pour les commandes > 50 000 FCFA |
| Chargeback carte | Le client conteste le paiement après réception | Gardez les preuves de livraison, photos, échanges WhatsApp |
Mesures anti-fraude WooCommerce
// Bloquer les commandes COD au-dessus d'un certain montant
add_filter('woocommerce_available_payment_gateways', 'limiter_cod');
function limiter_cod($gateways) {
if (is_admin()) return $gateways;
if (isset($gateways['cod']) && WC()->cart->get_total('') > 50000) {
unset($gateways['cod']);
}
return $gateways;
}
// Exiger la confirmation téléphonique pour les grosses commandes
add_action('woocommerce_checkout_process', 'verifier_telephone');
function verifier_telephone() {
if (empty($_POST['billing_phone'])) {
wc_add_notice('Le numéro de téléphone est obligatoire.', 'error');
}
}
Rassurer vos clients
La sécurité technique ne suffit pas. Vous devez aussi communiquer la sécurité :
- Badges de confiance au checkout : logos SSL, Wave, Orange Money, « Paiement sécurisé »
- Politique de retour visible : « Satisfait ou remboursé sous 7 jours »
- Coordonnées visibles : adresse, téléphone, WhatsApp. Un business qui se cache n’inspire pas confiance
- Avis clients : les témoignages d’autres acheteurs sont votre meilleure preuve de sécurité
- Mentions légales : NINEA, CGV, politique de confidentialité
Checklist sécurité paiement
- Certificat SSL actif (https:// + cadenas)
- WordPress, WooCommerce et plugins à jour
- Wordfence installé et configuré
- Authentification 2FA pour l’admin
- Clés API stockées dans wp-config.php
- Callbacks de paiement vérifiés (montant, statut commande)
- Backup quotidien automatisé (UpdraftPlus)
- Mot de passe admin fort (12+ caractères)
- COD limité à 50 000 FCFA max
- Badges de confiance visibles au checkout
Pour étoffer le tableau
- Intégrer Wave
- Intégrer Orange Money
- Sécuriser votre email professionnel
- Créer votre boutique WooCommerce
- Wordfence Security — site officiel
- Let’s Encrypt — certificat SSL gratuit
Faire concevoir un site web professionnel
Site vitrine ou e-commerce, livré clé en main avec domaine, hébergement, formation et support inclus.
À partir de 350 000 FCFA
Etape 1 : Cartographier les modes de paiement utilises au Senegal et en Cote d Ivoire
Avant de securiser, il faut savoir ce qui circule. Au Senegal, la majorite des paiements en ligne combine Wave (instant, frais 1 % cote marchand), Orange Money, Mixx by Yas (ex Free Money) et carte bancaire (Visa et Mastercard, principalement via SGS et CBAO). En Cote d Ivoire : Orange Money, MTN Mobile Money, Moov Money, Wave et carte bancaire. Au Benin : MTN MoMo, Moov Money, carte. Listez tous les canaux acceptes par votre boutique avant tout audit.
Sortie attendue : un tableau (canal, frais, pays vises, integration technique). Cette cartographie sert de base pour l etape 2 et conditionne le choix du PSP (prestataire de services de paiement).
Etape 2 : Choisir un PSP conforme PCI-DSS
Un PSP serieux possede une certification PCI-DSS valide (norme de securite cartes). En 2026, les acteurs reconnus en Afrique de l Ouest francophone sont CinetPay, PayDunya, FedaPay, Touch et Hub2. Verifiez la certification sur la liste publique du PCI Security Standards Council (https://www.pcisecuritystandards.org/assessors_and_solutions/). Si le PSP n est pas liste, fuyez : vos clients seront responsables en cas de fuite carte.
# Tester rapidement la conformite TLS du PSP
nmap --script ssl-enum-ciphers -p 443 api.cinetpay.com
# Resultat attendu : TLS 1.2 et 1.3 uniquement, aucun cipher faible
Si le scan revele TLS 1.0 ou 1.1, le PSP n est pas a niveau. Aucun paiement carte ne devrait transiter par une connexion sub-TLS 1.2 en 2026.
Etape 3 : Activer le 3D Secure 2 sur les cartes
3DS2 ajoute une authentification forte (biometrie, OTP, app bancaire) au moment du paiement. La directive PSD2 europeenne l impose pour tout paiement vers l UE, et les banques senegalaises et ivoiriennes l ont generalisee depuis 2024. Activez 3DS2 dans le tableau de bord du PSP, rubrique Securite ou Authentification.
Resultat attendu : au paiement test, la banque emettrice envoie un OTP par SMS ou pousse une notification dans son app mobile. Le client valide, le paiement passe. Sans 3DS2, votre taux de chargeback explose et vous perdez l acquereur en quelques mois.
Etape 4 : Tokeniser les cartes au lieu de les stocker
Stocker un numero de carte en base (meme chiffre) est une bombe a retardement reglementaire et technique. Utilisez plutot la tokenisation : le PSP retourne un identifiant opaque (token) que vous stockez. Pour rejouer le paiement, vous transmettez le token, jamais le PAN.
// Exemple cote serveur Node.js 22 LTS avec un PSP fictif
const r = await fetch('https://api.psp.io/v1/charges',{
method:'POST',
headers:{'Authorization':'Bearer '+process.env.PSP_KEY,'Content-Type':'application/json'},
body: JSON.stringify({amount:5000,currency:'XOF',source:'tok_visa_xyz'})
});
console.log(await r.json());
Sortie attendue : un objet JSON avec status: succeeded et un id de transaction. Aucun PAN n a transite par votre serveur, ce qui sort 90 % de vos systemes du perimetre PCI-DSS.
Etape 5 : Verifier les webhooks de notification
Le client redirige vers la banque, paie, revient. Mais le retour navigateur n est pas fiable (fermeture onglet, perte reseau). La verite vient du webhook serveur-a-serveur que le PSP envoie. Verifiez sa signature HMAC, sinon n importe qui peut faire passer un paiement comme valide.
// Verification signature webhook
const crypto = require('crypto');
const expected = crypto.createHmac('sha256',process.env.PSP_WEBHOOK_SECRET)
.update(req.rawBody).digest('hex');
if(expected !== req.headers['x-psp-signature']) return res.status(401).end();
Sortie attendue : si la signature ne correspond pas, le serveur retourne 401 et n enregistre pas la commande. C est la defense numero un contre les faux callbacks de paiement.
Etape 6 : Imposer HTTPS partout (HSTS preload)
Un certificat Let s Encrypt suffit techniquement, mais il faut aussi forcer le navigateur a refuser tout fallback HTTP. Configurez l en-tete HSTS avec preload sur votre domaine, puis soumettez-le sur https://hstspreload.org. Apres validation (3 a 6 semaines), Chrome, Firefox et Safari refuseront toute connexion HTTP, meme tapee a la main.
# Nginx : entete HSTS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
Resultat attendu : sur https://hstspreload.org, statut Eligible for preloading. Aucune session de paiement ne pourra etre interceptee par un attaquant Wi-Fi public dans un cyber a Pikine ou un cafe a Cocody.
Etape 7 : Limiter les tentatives et detecter la fraude
Un script qui teste 10 000 numeros voles sur votre formulaire en deux minutes signale immediatement la fraude. Mettez en place un rate-limit (5 tentatives par IP par minute) et un score de risque sur chaque transaction. Les PSP serieux exposent un Risk Score (0 a 100) que vous pouvez consulter avant de capturer le paiement.
# Nginx : rate-limit basique
limit_req_zone $binary_remote_addr zone=pay:10m rate=5r/m;
location /checkout { limit_req zone=pay burst=10 nodelay; }
Sortie attendue : la 11e requete dans la meme minute retourne un 503. Combine au score PSP, vous bloquez 95 % des attaques de carding sans faux positifs sur les vrais clients.
Etape 8 : Securiser le panier cote client
Un attaquant peut modifier le prix dans le formulaire (Inspecter, modifier la valeur). Ne jamais faire confiance au montant envoye par le navigateur. Recalculez toujours le total cote serveur a partir des IDs produits et des quantites.
// Cote serveur, recalcul systematique
const total = items.reduce((s,it)=> s + (catalogPrices[it.id] * it.qty), 0);
if(total !== req.body.total) return res.status(400).send('Total mismatch');
Sortie attendue : toute manipulation cote client renvoie un 400. Cette regle a sauve d innombrables boutiques WooCommerce en Afrique francophone qui faisaient confiance au prix transmis.
Etape 9 : Journaliser et alerter en temps reel
Chaque transaction (succes, echec, refus 3DS, signature webhook invalide) doit aller dans un journal centralise. Un SIEM open source comme Wazuh, ou simplement un Loki + Grafana, suffit. Configurez une alerte Telegram ou email pour : plus de 20 echecs en 5 minutes, score de risque maximal, signature webhook invalide.
# Exemple regle Loki vers alertmanager
- alert: PaymentFraud
expr: sum(rate({app="checkout",status="failed"}[5m])) > 0.4
for: 2m
Sortie attendue : si le taux d echecs depasse 24 par minute (0,4 par seconde), l alerte se declenche dans Telegram en moins de 3 minutes. Vous coupez le formulaire avant que les pertes ne s accumulent.
Etape 10 : Auditer trimestriellement et tester avec un pentest leger
Tous les 90 jours, repassez les neuf etapes : nouveau certificat TLS, version du PSP a jour, regles WAF testees, journaux conserves au moins 12 mois. Faites tourner un scan OWASP ZAP en mode passif sur votre tunnel de paiement, et corrigez chaque finding High avant le scan suivant.
# Scan passif OWASP ZAP en CLI
docker run -v $(pwd):/zap/wrk/:rw --rm owasp/zap2docker-stable \
zap-baseline.py -t https://votre-boutique.com/checkout -r rapport.html
Sortie attendue : un rapport HTML avec les findings classes par severite. Sur le même thème, consultez notre tutoriel Wi-Fi securise et notre guide Wazuh SIEM.
Bonus : choisir entre paiement direct et redirection
Deux integrations existent. Redirection : le client quitte votre site pour la page hebergee du PSP (CinetPay, PayDunya), paye, revient. Avantage : aucune donnee carte ne touche votre serveur, perimetre PCI-DSS minimal (SAQ A). Inconvenient : moins controle visuel. Direct (formulaire integre via iframe ou JS PSP) : meilleure UX, mais perimetre PCI-DSS etendu (SAQ A-EP).
Pour 95 % des boutiques en Afrique francophone, la redirection reste le choix sur. Les frais sont identiques chez la plupart des PSP, le taux de conversion ne baisse que de 2 a 4 % selon les retours terrain a Dakar et Abidjan.
Bonus : segmenter les remboursements et les refunds
Un attaquant qui obtient un acces au back-office peut declencher des remboursements vers son propre compte. Limitez le role Remboursement a deux personnes maximum, exigez une double validation pour tout refund superieur a 50 000 FCFA, et journalisez chaque action avec horodatage et IP. Auditez ce log chaque debut de mois.