SenePay pour WooCommerce
Acceptez Orange Money, Wave et Free Money sur votre boutique WooCommerce via SenePay.
by SenePay — Millennium Capital Invest LLC · github.com/dominiqk77/senepay-wordpress-plugin · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/dominiqk77/senepay-wordpress-plugin/archive/refs/heads/main.zipAcceptez Orange Money, Wave et Free Money sur votre boutique WooCommerce.
Le client choisit « Mobile Money » au moment de payer, il est redirigé vers une page de paiement sécurisée SenePay, valide sur son téléphone, et revient sur votre boutique. La commande passe en « traitement » uniquement lorsque SenePay a confirmé l'encaissement.
Installation
- Téléchargez
senepay-woocommerce.php. - Dans WordPress : Extensions → Ajouter → Téléverser une extension.
- Activez l'extension.
- Rendez-vous dans WooCommerce → Réglages → Paiements → SenePay.
- Renseignez votre clé API (
pk_live_…) et votre secret API (sk_live_…), disponibles dans votre tableau de bord sur sene-pay.com. - Cochez « Activer ».
Tant que les deux clés ne sont pas renseignées, le moyen de paiement reste masqué à vos clients : mieux vaut ne rien afficher qu'afficher une option qui échouerait au moment de payer.
Prérequis
| WooCommerce | 6.0 ou plus récent |
| PHP | 7.4 ou plus récent |
| Devise | XOF (franc CFA) |
| Montant minimum | 200 FCFA |
| HTTPS | requis en production |
Le stockage haute performance des commandes (HPOS) est pris en charge.
Le numéro de téléphone est obligatoire
SenePay refuse toute transaction sans numéro de téléphone du client. Assurez-vous que le champ « Téléphone » est requis dans vos réglages de commande WooCommerce, sinon vos clients verront un message d'erreur au moment de payer.
Un numéro sénégalais à 9 chiffres commençant par 7 reçoit automatiquement
l'indicatif 221. Un numéro déjà au format international est transmis tel quel,
ce qui permet à la diaspora de régler par carte bancaire.
Ce qui a changé en version 2.0.0
La version 1 ne pouvait pas encaisser, et exposait chaque boutique qui l'installait. Si vous utilisez encore la version 1, mettez à jour sans attendre.
1. Elle appelait une API qui n'est pas la nôtre
La version 1 postait sur /api/v1/checkout/sessions avec un en-tête
Authorization: Bearer. L'API SenePay expose /api/v1/payments/initiate et
s'authentifie par deux en-têtes, X-Api-Key et X-Api-Secret. Aucun
paiement n'a donc jamais pu être initié.
2. Elle aurait facturé cent fois le montant
$amount = intval($order->get_total() * 100); // version 1
Cette conversion en centimes vaut pour l'euro ou le dollar. Le franc CFA n'a pas de sous-unité. Une commande de 5 000 FCFA aurait été présentée au client comme 500 000 FCFA.
3. Son webhook était falsifiable par n'importe qui
// version 1 — le point d'entrée /wc-api/senepay_webhook est PUBLIC
if (!empty($payload['order_id']) && $payload['status'] === 'PAID') {
$order->payment_complete();
}
Une simple requête POST annonçant {"order_id":123,"status":"PAID"} marquait
la commande payée et déclenchait l'expédition — sans qu'un franc ait été
encaissé. Sur une boutique en ligne, cela signifie des marchandises envoyées
gratuitement, à volonté, par quiconque connaît l'adresse du webhook.
La version 2 applique la règle qui vaut pour toute passerelle de paiement :
Le corps d'un webhook n'est jamais une preuve de paiement. Il signale qu'il s'est passé quelque chose. C'est ensuite au serveur d'aller demander à SenePay, avec ses propres clés, si la transaction est réellement réglée.
Chaque rappel déclenche donc une vérification GET /api/v1/{jeton}/status
authentifiée. La commande n'est complétée que si SenePay le confirme.
Comment la version 2 traite les cas limites
SenePay est injoignable au moment du rappel. Le plugin ne conclut rien et
répond 503, ce qui invite SenePay à relancer. Marquer un échec ici
condamnerait le paiement d'un client qui a pourtant payé.
SenePay refuse dans une réponse 200. L'API peut répondre
{"statut": true, "message": "Paiement initié.", "status": "Failed"}. Le champ
statut dit seulement que la demande a été reçue ; c'est status qui dit si la
transaction vit. Le plugin lit le bon champ et affiche la cause réelle au client.
Le client revient avant le rappel. Le retour depuis la page de paiement déclenche lui aussi une vérification, pour éviter que le client contemple une commande « en attente » alors qu'il vient de régler.
Le rappel arrive deux fois. payment_complete() est idempotent et le plugin
sort immédiatement si la commande est déjà payée : aucun doublon d'e-mail ni de
décrément de stock.
Journalisation
Activez « Journalisation » dans les réglages pour consigner les échanges avec
SenePay dans WooCommerce → État → Journaux (source senepay). Les clés API
n'y sont jamais écrites.
Limites connues
- Le remboursement n'est pas encore implémenté. Le plugin ne déclare
volontairement pas la capacité
refunds: afficher un bouton qui échouerait silencieusement serait pire que de ne pas l'afficher. - Le paiement par carte bancaire dépend de l'activation de ce canal sur votre compte marchand.
Sécurité
Votre secret API (sk_live_…) ne doit jamais apparaître dans une page web,
un fichier JavaScript, un dépôt public ou une capture d'écran. Il est stocké
côté serveur par WordPress et n'est jamais transmis au navigateur.
Pour signaler une vulnérabilité : security@sene-pay.com.
Licence
MIT — Millennium Capital Invest LLC.