haybtech/php-sdk

SDK PHP officiel pour l'API HayBTech — agrégateur de paiement Afrique de l'Ouest.

Maintainers

Package info

github.com/HayBTech/haybtech-php-sdk-

pkg:composer/haybtech/php-sdk

Statistics

Installs: 0

Dependents: 1

Suggesters: 0

Stars: 0

Open Issues: 0

v1.0.0 2026-05-22 16:22 UTC

This package is auto-updated.

Last update: 2026-05-22 17:26:31 UTC


README

SDK PHP officiel pour l'API HayBTech -- paiement mobile en Afrique de l'Ouest .

Packagist PHP License

Installation

composer require haybtech/php-sdk

Versions PHP supportees

Le SDK manipule des cles secretes marchand (sk_live_*) et signe/verifie des webhooks HMAC. A ce titre, HayBTech ne supporte que les versions de PHP qui recoivent encore des correctifs de securite upstream par l'equipe php.net.

Version PHP Statut SDK Fin du support securite upstream
8.4 Support actif 31 dec 2028
8.3 Support actif 31 dec 2027
8.2 Support actif (min) 31 dec 2026
8.1 Non supporte (EOL) 31 dec 2025
8.0 Non supporte (EOL) 26 nov 2023
7.4 Non supporte (EOL) 28 nov 2022

Reference officielle : php.net/supported-versions.php

Politique d'EOL

HayBTech retire le support d'une version PHP au plus tard 3 mois apres son EOL upstream. Cette regle est appliquee dans composer.json (require.php) et fait l'objet d'une release MAJOR (semver) avec entree CHANGELOG dediee.

Vous etes bloque sur PHP < 8.2 ? Deux options :

  1. Plugin WooCommerce : haybtech-woocommerce-gateway (PHP 7.4+, polyfills inclus) pour les boutiques WordPress sur hebergement mutualise.
  2. Integration REST directe : l'API https://app.haybtech.com/v1 est documentee et utilisable sans SDK depuis n'importe quel runtime capable de signer un HMAC SHA-256.

Configuration (Zéro-Config)

Si vous utilisez un framework (Laravel, Symfony) ou un fichier .env, vous n'avez rien à configurer. Ajoutez simplement votre clé dans votre environnement :

HAYBTECH_SECRET_KEY=sk_live_votre_cle_secrete

Le SDK détectera automatiquement votre clé. Vous pouvez directement utiliser l'API n'importe où dans votre code :

use HayBTech\HayBTech;

$result = HayBTech::payments()->create([...]);

(Optionnel) Si vous préférez initialiser manuellement, appelez configure() une seule fois au démarrage :

HayBTech::configure('sk_live_votre_cle_secrete');

Paiements

Creer un paiement

Le SDK propose une interface fluide pour rediriger vos clients instantanement :

$result = HayBTech::payments()->create([
    'merchant_ref' => 'CMD-' . uniqid(),
    'amount'       => 25000,
    'currency'     => 'XOF',
    'return_url'   => 'https://monsite.sn/succes',
    'cancel_url'   => 'https://monsite.sn/annulation',
    'callback_url' => 'https://monsite.sn/webhook',
]);

// Redirection automatique vers le guichet de paiement
$result->redirect();

Si vous souhaitez recuperer manuellement l'URL ou d'autres donnees :

$paymentUrl = $result['data']['payment_url'];
$txnId      = $result['data']['id'];

if ($result->successful()) {
    // La requete API a reussi
}

Webhooks

1. Verification des signatures (Inbound)

HayBTech envoie un POST signe a votre callback_url. Utilisez le helper pour securiser votre endpoint :

use HayBTech\Exceptions\SignatureException;

try {
    $event = HayBTech::webhook()::constructEvent(
        file_get_contents('php://input'),
        $_SERVER['HTTP_X_HAYBTECH_SIGNATURE'] ?? '',
        getenv('HAYBTECH_WEBHOOK_SECRET')
    );
} catch (SignatureException $e) {
    // Signature invalide ou attaque par rejeu detectee
    http_response_code(403);
    exit;
}

// Traitement de l'evenement
if ($event['event'] === 'payment.success') {
    $orderId = $event['data']['merchant_ref'];
}

1.bis Verification AUTO (sans HAYBTECH_WEBHOOK_SECRET)

Si vous voulez eviter la double configuration (HAYBTECH_SECRET_KEY + HAYBTECH_WEBHOOK_SECRET), utilisez AutoVerifier : il recupere seul le secret HMAC depuis l'API HayBTech (via votre sk_live_*/sk_test_*) et le cache localement. Pattern recommande pour les nouvelles integrations.

use HayBTech\HayBTechClient;
use HayBTech\Webhook\AutoVerifier;
use HayBTech\Webhook\FilesystemWebhookSecretCache;

$client = new HayBTechClient(getenv('HAYBTECH_SECRET_KEY'));
$cache  = new FilesystemWebhookSecretCache(__DIR__ . '/storage/hayb-cache');
$auto   = new AutoVerifier($client, $cache);

try {
    $event = $auto->constructEvent(
        file_get_contents('php://input'),
        $_SERVER['HTTP_X_HAYBTECH_SIGNATURE'] ?? '',
        getenv('HAYBTECH_WEBHOOK_ENDPOINT_ID')
    );
} catch (\HayBTech\Exceptions\SignatureException $e) {
    http_response_code(403); exit;
} catch (\HayBTech\Exceptions\HayBTechException $e) {
    http_response_code(503); exit; // HayBTech injoignable → laisse retry
}

Sur rotation cote HayBTech, le cache est automatiquement invalide a la prochaine signature mismatch (un seul retry, pas de boucle). Exemple complet avec fallback safe : examples/webhook-auto-verify.php.

Pour les workers daemon (Horizon, RoadRunner, queue listeners) sans I/O disque, remplacez FilesystemWebhookSecretCache par InMemoryWebhookSecretCache.

2. Gestion des endpoints (Outbound)

Gerez vos URLs de notification programmatique :

// Lister vos endpoints
$endpoints = HayBTech::webhooks()->all();

// Creer un nouvel endpoint
HayBTech::webhooks()->create([
    'url' => 'https://api.monsite.com/hooks',
    'subscribed_events' => ['payment.success']
]);

// Recuperer le secret HMAC d'un endpoint (utilise par AutoVerifier sous le capot).
// L'auth se fait via votre sk_live_*/sk_test_* ; pas d'OTP cote API merchant.
$res = HayBTech::webhooks()->revealSecret($id);
echo $res['secret'];

// Verifier qu'un endpoint joint correctement HayBTech (ping de test).
HayBTech::webhooks()->sendTestPing($id);

// Rechercher un endpoint par URL exacte (anti-doublon a l'installation).
HayBTech::webhooks()->lookup('https://monsite.sn/hooks');

Evenements disponibles

Liste complete des event envoyes a vos endpoints webhook. Abonnez-vous a ce dont vous avez besoin via subscribed_events sur l'endpoint.

Paiements

Evenement Description
payment.initiated Transaction creee, en attente du payeur
payment.pending PSP a accepte, en attente de confirmation finale
payment.success Paiement confirme
payment.failed Paiement echoue (refus PSP, fonds insuffisants…)
payment.cancelled Annule par le client
payment.expired Delai d'attente PSP depasse
payment.updated Metadata ou statut intermediaire mis a jour

Payouts (transferts sortants)

Evenement Description
payout.success Payout confirme cote PSP
payout.failed Payout rejete (KYC, beneficiaire invalide)
payout.cancelled Annule avant execution
payout.refunded Retourne dans le wallet HayBTech
payout.partially_refunded Retour partiel

Remboursements

Evenement Description
refund.success Remboursement abouti
refund.failed Remboursement refuse par le PSP

Gestion des erreurs

use HayBTech\Exceptions\ApiException;
use HayBTech\Exceptions\HayBTechException;

try {
    $result = HayBTech::payments()->create($params);
} catch (ApiException $e) {
    $e->getMessage();    // message lisible
    $e->getHttpStatus(); // 400, 422, 500...
    $e->getErrorCode();  // ex. "insufficient_funds"
    $e->isRetryable();   // true si 5xx ou 429 -> retry avec backoff
} catch (HayBTechException $e) {
    // SDK non configure, curl indisponible, cle invalide...
    $e->getMessage();
}

Mode test

HayBTech::configure('sk_test_...'); // aucun debit reel

Utilisation avancee

// Client explicite (multi-compte, timeout custom)
// N'affecte pas le client partage configure via configure()
// Le mode test/live est determine par la cle (sk_test_… vs sk_live_…), pas par l'URL.
$client = HayBTech::client('sk_test_autre_compte', [
    'timeout' => 60,
]);

$client->payments->create([...]);

Securite et Confidentialite

Le SDK integre des mecanismes de protection avances :

  • Masquage Automatique : Vos cles secretes sont masquees dans les var_dump() pour eviter les fuites dans les logs.
  • Sanitisation des Erreurs : Les exceptions ApiException filtrent automatiquement les donnees sensibles (CVV, PIN, Secrets) des traces de pile.
  • Protection DoS : Limite de taille sur les payloads webhooks (1 Mo) pour eviter l'epuisement de la memoire.
  • Anti-Injection : Protection native contre les injections CRLF dans les headers HTTP.
  • Zero Dependance : Aucun risque d'attaque par chaine d'approvisionnement (Supply Chain).

Ressources API

Ressource Description
HayBTech::payments() Creer, recuperer, lister, verifier des paiements + splits marketplace
HayBTech::refunds() Initier des remboursements (totaux ou partiels)
HayBTech::payouts() Envoyer des fonds vers un wallet mobile money
HayBTech::payoutRequests() Soumettre une demande de retrait soumise a approbation ops

| HayBTech::balance() | Solde disponible et reserve par devise | | HayBTech::providers() | Liste des PSP actifs (Orange Money SN/CI, Wave, OMD…) | | HayBTech::status() | Statut transaction avec pull PSP si non-terminal (cas webhook perdu) | | HayBTech::disputes() | Lister et repondre aux disputes mobile money | | HayBTech::settlements() | Lister les virements vers le compte marchand | | HayBTech::webhooks() | Gerer vos endpoints de notification (sortants) | | HayBTech::webhook() | Verifier les signatures de webhooks entrants | | HayBTech::health() | Endpoint de healthcheck (sondes uptime) |

Parametres avances pour payments->create()

En plus des champs documentes ci-dessus (merchant_ref, amount, currency, return_url, cancel_url, callback_url), payments->create() accepte :

Champ Valeurs Description
payin_fee_mode merchant / customer / split Qui supporte les frais HayBTech. merchant = vous (defaut). customer = montant majore au payeur.
metadata.payment_channel push Active la branche Orange Money Push (paiement direct sans saisie code marchand cote payeur). Necessite l'activation om_push_payment_enabled cote admin + provider account configure (MSISDN partenaire + PIN chiffre).
metadata.* scalar libre Tout couple cle/valeur relaye intact dans les webhooks (commande interne, user_id, etc.).

Exemple OM Push :

$result = HayBTech::payments()->create([
    'merchant_ref' => 'CMD-' . uniqid(),
    'amount'       => 25000,
    'currency'     => 'XOF',
    'provider'     => 'orange_money_sn',
    'callback_url' => 'https://monsite.sn/webhook',
    'metadata'     => [
        'payment_channel' => 'push',
        'customer_msisdn' => '+221771234567',
    ],
]);

Statut d'une transaction (cas webhook PSP perdu)

// payments->retrieve() lit la ligne locale uniquement (rapide, peut etre perime).
$txn = HayBTech::payments()->retrieve('TXN-abc123');

// status->retrieve() pull aussi le PSP si la ligne locale est non-terminale.
// A privilegier quand vous soupconnez un statut periode (sandbox, timeout, etc.).
$txn = HayBTech::status()->retrieve('TXN-abc123');

Publier sur Packagist

Cette section s'adresse aux mainteneurs du SDK.

1. Pousser sur GitHub

git remote add origin https://github.com/haybtech/php-sdk.git
git push -u origin main --tags

2. Soumettre sur Packagist

  1. packagist.org > Submit
  2. URL : https://github.com/haybtech/php-sdk > Check > Submit

3. Webhook GitHub (mises a jour automatiques)

GitHub > Settings > Webhooks > Add webhook :

Champ Valeur
Payload URL https://packagist.org/api/github?username=haybtech
Content type application/json
Secret votre token API Packagist
Events Just the push event

4. Publier une nouvelle version

git tag v1.1.0 && git push origin main --tags
# Packagist est notifie automatiquement

Respectez semver : PATCH (bug fix) . MINOR (nouvelle feature) . MAJOR (breaking change).

MIT License