WP Manifestindependent plugin directory
manifest / ecommerce / senepay-wordpress-plugin

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

0stars
0forks

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.zip

Acceptez 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

  1. Téléchargez senepay-woocommerce.php.
  2. Dans WordPress : Extensions → Ajouter → Téléverser une extension.
  3. Activez l'extension.
  4. Rendez-vous dans WooCommerce → Réglages → Paiements → SenePay.
  5. Renseignez votre clé API (pk_live_…) et votre secret API (sk_live_…), disponibles dans votre tableau de bord sur sene-pay.com.
  6. 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.