Logo Lanfrica

openDataSenegal/panongbene-pay

Domaine:

digital infrastructure

Type de record:

software
Créateur:
ope
Hôte:
Client Python pour l'API Business PI-SPI de la BCEAO — paiements instantanés interbancaires dans les 8 pays de l'UEMOA (Bénin, Burkina Faso, Côte d'Ivoire, Guinée-Bissau, Mali, Niger, Sénégal, Togo). # panongbene-pay **Client Python pour l'API Business PI-SPI de la BCEAO** — paiements instantanés interbancaires dans les 8 pays de l'UEMOA (Bénin, Burkina Faso, Côte d'Ivoire, Guinée-Bissau, Mali, Niger, Sénégal, Togo). Encapsule OAuth 2.0 + mTLS + ISO 20022 derrière une API Python idiomatique, typée, production-ready. Supporte sync et async, batch G2P, refund/reversal, réconciliation camt.054, et l'observabilité (hooks, circuit breaker, anti-rejeu webhook). ``` ┌──────────┐ OAuth2 + mTLS ┌──────────┐ ISO 20022 ┌──────────┐ │ Votre │ ──────────────────► │ API │ ────────────────► │ PI-SPI │ │ appli │ │ Business │ │ Core │ └──────────┘ panongbene-pay └──────────┘ **Mobile Pay** — Un MSISDN n'est **pas** un `AliasType` enregistrable (seuls `SHID` et `MCOD` le sont) mais c'est un **identifiant routable** : le directory PI-SPI résout le numéro vers le compte si l'IFP du destinataire l'a enrôlé. Utiliser `panongbene_pay.normalize_msisdn(raw, default_country=Country.SN)` pour normaliser en E.164. Voir docs/exemples.md § 12. ### Paiement marchand P2B et QR e-commerce ```python from datetime import datetime, timedelta, timezone from panongbene_pay import format_iso8601 qr = client.qr_codes.creer_dynamique( compte_numero="CI-TEST-B001", montant_xof=125_000, expiration=format_iso8601(datetime.now(timezone.utc) + timedelta(minutes=15)), motif="Commande #2026-042", ) # Rendu PNG natif (extra [qr]) from panongbene_pay.qr import to_png png_bytes = to_png(qr["qrCodeData"]) ``` ### Remboursement (pacs.004) et annulation (pacs.007) ```python # Remboursement partiel refund = client.paiements.rembourser( compte_numero="CI-TEST-B001", paiement_id="TXN-PISPI-20260512-001", montant_xof=25_000, motif="Annulation partielle commande #2026-042", ) # Annulation avant settlement (paiement encore PENDING) client.paiements.annuler("CI-TEST-B001", "TXN-PISPI-20260512-001", motif="oups") ``` ### Paiements en m …

Licenses