haybtech / php-sdk
SDK PHP officiel pour l'API HayBTech — agrégateur de paiement Afrique de l'Ouest.
Requires
- php: ^8.2
- ext-curl: *
- ext-json: *
Requires (Dev)
- phpunit/phpunit: ^11.0
README
SDK PHP officiel pour l'API HayBTech -- paiement mobile en Afrique de l'Ouest .
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 :
- Plugin WooCommerce :
haybtech-woocommerce-gateway(PHP 7.4+, polyfills inclus) pour les boutiques WordPress sur hebergement mutualise. - Integration REST directe : l'API
https://app.haybtech.com/v1est 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
ApiExceptionfiltrent 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
- packagist.org > Submit
- 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