Secrets et accès
Secrets dans un gestionnaire de secrets
apiSecret et webhookSecret ne doivent figurer ni dans votre code, ni dans un dépôt Git, ni dans vos journaux, ni dans une variable d’environnement partagée avec un front.Une clé de production distincte par environnement
label explicite. En cas de fuite, vous révoquez la bonne sans interrompre le reste.Adresses IP de sortie déclarées
GET /merchants/me/ip-check depuis chaque environnement.Procédure de rotation écrite et testée
lastUsedAt, révoquer. Le jour d’une fuite, ce n’est pas le moment de découvrir la procédure.Idempotence et références
Idempotency-Key dérivée de votre identifiant métier
cashin-${order.id}, jamais une constante ni un UUID régénéré à chaque tentative. Une clé régénérée ne protège de rien.externalReference renseignée sur chaque opération
Logique de reprise correcte
503 et 504, réessayer avec la même clé. Sur 400, 402, 403 et 422, ne pas réessayer tel quel. Voir Idempotence.Notifications
Endpoint en HTTPS, répondant 2xx en moins de 15 secondes
Vérification de signature testée
POST /merchants/me/webhooks/test. Vérifiez aussi que votre code refuse une signature falsifiée et une signature périmée — un contrôle qui accepte tout ne se voit pas en test.Traitement idempotent, déduplication sur id
Pare-feu applicatif configuré
Supervision de la file d'échecs
FAILED et ABANDONED dans GET /merchants/me/webhooks.Flux
AWAITING_PAYER géré
requiresPayerAction et redirigez vers payerActionUrl. Sans cela, les encaissements Orange, Wave et Djamo n’aboutiront jamais.Rattrapage par consultation en place
expiresAt. Les notifications ne sont pas la source de vérité.available surveillé, pas balance
available bas vous évite une rafale de 402.Montants en entiers de bout en bout
Exploitation
requestId journalisé
x-request-id, ou celui que vous fournissez. C’est ce qui rend une demande de support instantanément exploitable.Logique branchée sur error.code
error.message.Rapprochement périodique du relevé
GET /merchants/me/wallet/statement contre votre comptabilité. Chaque ligne porte balanceAfter : le rapprochement est ligne à ligne. Triez sur sequence.Alerte sur les opérations bloquées
PENDING dont expiresAt est dépassé sans passage à un état définitif mérite un regard.Test de bout en bout avant ouverture
Un encaissement réussi, sur un opérateur à redirection
cashin.succeeded.Un encaissement réussi, sur un opérateur à validation téléphone
Un encaissement échoué
cashin.failed et son failure.code.Un transfert réussi
CASHOUT_HOLD, puis CASHOUT_RELEASE + CASHOUT_DEBIT + CASHOUT_FEE.Un transfert refusé
available retrouve son niveau.Un rejeu idempotent
POST /cashin avec la même clé et le même corps : vous devez obtenir 200 et la réponse initiale, sans seconde opération.Un rejeu de notification
POST /merchants/me/webhooks/{id}/replay : vérifiez que votre déduplication fonctionne et que vous ne traitez pas deux fois.