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 …