WordPressPHP 8.0+ · WordPress 6+ · sans WooCommerce

Intégrer MonCash avec WordPress

Ce guide montre comment intégrer les paiements MonCash directement dans WordPress sans WooCommerce, en utilisant les fonctions natives wp_remote_post() et l'API REST WordPress pour les webhooks. Pour WooCommerce, consultez la section dédiée plus bas.

Sandbox

Commencez en Sandbox

Avant d'implémenter le code ci-dessous avec votre clé live (sk_proj_…), nous recommandons de tester d'abord en mode Sandbox avec sk_test_proj_…. Le code est identique — vous ne changez que la valeur de la variable d'environnement. Lisez le Guide Sandbox avant de continuer.

Prérequis

  • WordPress 6+
  • PHP 8.0+
  • Un projet MonCashConnect avec clé secrète — créer un projet
  • HTTPS activé sur votre site (obligatoire pour les webhooks)

Configuration

Stockez les clés en tant qu'options WordPress (dans le tableau de bord sous Réglages → MonCashConnect, ou directement via wp_options). Ne les mettez jamais en dur dans le code source.

<?php
// Une seule fois, pour sauvegarder les clés (page de réglages ou wp-cli)
update_option('mcc_secret_key',     'sk_proj_xxxx', false); // false = non autoloaded
update_option('mcc_webhook_secret', 'whsec_xxxx',   false);

// Pour lire les clés dans le code
$secret_key     = get_option('mcc_secret_key');
$webhook_secret = get_option('mcc_webhook_secret');
Pour une configuration plus robuste, vous pouvez définir les constantes dans wp-config.php : define('MCC_SECRET_KEY', 'sk_proj_…'); puis les lire avec MCC_SECRET_KEY.

Créer un paiement

Ajoutez dans functions.php de votre thème (ou dans un plugin personnalisé) :

<?php

/**
 * Lance un paiement MonCash et redirige vers la page de paiement.
 *
 * @param int    $amount      Montant en HTG
 * @param string $reference   Référence unique de la commande
 * @param string $return_url  URL de retour après paiement
 */
function mcc_initiate_payment(int $amount, string $reference, string $return_url): void {
    $secret_key = get_option('mcc_secret_key');

    $response = wp_remote_post('https://hvlmeoqyxaguzcujpmit.supabase.co/functions/v1/pay-create', [
        'headers' => [
            'Authorization' => 'Bearer ' . $secret_key,
            'Content-Type'  => 'application/json',
        ],
        'body'    => wp_json_encode([
            'amount'      => $amount,
            'referenceId' => $reference,
            'returnUrl'   => $return_url,
        ]),
        'timeout' => 20,
    ]);

    if (is_wp_error($response)) {
        wp_die('Erreur réseau : ' . $response->get_error_message());
    }

    $code = wp_remote_retrieve_response_code($response);
    $data = json_decode(wp_remote_retrieve_body($response), true);

    if ($code !== 200 || empty($data['paymentUrl'])) {
        $error = $data['error'] ?? "Erreur API ($code)";
        wp_die(esc_html($error));
    }

    wp_redirect($data['paymentUrl']);
    exit;
}

// Exemple d'utilisation depuis un shortcode ou une page template :
// mcc_initiate_payment(500, 'commande_' . get_the_ID(), home_url('/payment-return/'));

Endpoint webhook via REST API WordPress

Enregistrez un endpoint REST WordPress pour recevoir les webhooks MonCashConnect. Ajoutez dans functions.php :

<?php

add_action('rest_api_init', function () {
    register_rest_route('moncashconnect/v1', '/webhook', [
        'methods'             => 'POST',
        'callback'            => 'mcc_handle_webhook',
        'permission_callback' => '__return_true', // Auth via signature HMAC
    ]);
});

function mcc_handle_webhook(WP_REST_Request $request): WP_REST_Response {
    $raw_body  = $request->get_body();
    $signature = $request->get_header('x_mcc_signature') ?? '';
    $timestamp = $request->get_header('x_mcc_timestamp') ?? '';

    if (!mcc_verify_webhook($raw_body, $signature, $timestamp)) {
        return new WP_REST_Response(['error' => 'Invalid signature'], 401);
    }

    $event = json_decode($raw_body, true);

    if ($event['event'] === 'payment.completed') {
        // Mettez à jour votre BDD ici
        // update_post_meta($order_id, '_mcc_status', 'paid');
        do_action('mcc_payment_completed', $event['reference'], $event);
    } elseif ($event['event'] === 'payment.failed') {
        do_action('mcc_payment_failed', $event['reference'], $event);
    }

    return new WP_REST_Response(['ok' => true], 200);
}
L'URL webhook à configurer dans MonCashConnect sera : https://votresite.com/wp-json/moncashconnect/v1/webhook

Vérifier la signature HMAC

Ajoutez la fonction de vérification dans functions.php :

<?php

function mcc_verify_webhook(string $raw_body, string $signature, string $timestamp): bool {
    if (empty($raw_body) || empty($signature) || empty($timestamp)) {
        return false;
    }

    // Rejeter les webhooks de plus de 5 minutes (protection anti-replay)
    if (abs(time() - (int) $timestamp) > 300) {
        return false;
    }

    $secret   = get_option('mcc_webhook_secret');
    $expected = 'sha256=' . hash_hmac('sha256', $raw_body, $secret);

    // hash_equals() est résistant aux attaques par timing
    return hash_equals($expected, $signature);
}
WordPress peut modifier le corps de la requête avant de le passer au callback REST. Utilisez $request->get_body() (pas file_get_contents('php://input')) pour garantir que vous lisez le corps brut non modifié.

Avec WooCommerce

Si vous utilisez WooCommerce, installez directement le plugin officiel MonCashConnect. Il gère automatiquement la création de paiement, la vérification de signature webhook et la mise à jour du statut de commande WooCommerce.

Plugin WooCommerce MonCashConnect

1. Téléchargez le plugin depuis GitHub → packages/wordpress-plugin

2. Installez-le dans Extensions → Ajouter → Téléverser

3. Configurez via WooCommerce → Réglages → Paiements → MonCashConnect

# Clé secrète :       sk_proj_…           (Développeur → Projets)
# Webhook secret :    whsec_…             (Développeur → Projets → Webhooks)
# URL webhook auto :  /wc-api/WC_Gateway_MonCashConnect/

Liste de contrôle avant mise en production

Les clés sont stockées dans wp_options (non autoloaded) ou wp-config.php — jamais en dur dans le code

HTTPS est activé sur votre site (obligatoire pour les webhooks)

mcc_verify_webhook() utilise hash_equals() (résistant aux timing attacks)

La vérification du timestamp rejette les webhooks de plus de 5 minutes

Le handler webhook est idempotent (can receive le même événement plusieurs fois)

L'URL https://votresite.com/wp-json/moncashconnect/v1/webhook est configurée dans le tableau de bord MonCashConnect