Mode WebSocket
Alternative aux webhooks pour un serveur qui garde une connexion ouverte : vous initiez les opérations et recevez leurs résultats sur la même connexion.
Connexion
wss://paygate.nebyron.com/management/ws/partner
Authentification par l’en-tête X-API-Key (ou ?apiKey=…). À l’ouverture : {"type":"CONNECTED","environment":"LIVE","livemode":true,"partner":{…},"serverTime":"…"}. La connexion prend l’environnement de sa clé : avec pk_test_, vous ne recevez que des évènements de test. Une clé invalide ou un service suspendu est refusé (401).
Node.js (ws)
import WebSocket from "ws";
const ws = new WebSocket("wss://paygate.nebyron.com/management/ws/partner", {
headers: { "X-API-Key": process.env.NEBRYON_API_KEY },
});
ws.on("open", () => {
setInterval(() => ws.send(JSON.stringify({ type: "PING" })), 30000);
ws.send(JSON.stringify({
type: "INITIATE_PAYMENT",
requestId: "r1",
amount: 3000,
phoneNumber: "70998877",
network: "ORANGE_MONEY",
externalReference: "CMD-2001",
}));
});
const seen = new Set();
ws.on("message", (raw) => {
const message = JSON.parse(raw);
if (message.type === "ACK") showInstructions(message.transaction); // collectionNumber, expiresAt
if (message.type === "EVENT" && !seen.has(message.notification.id)) {
seen.add(message.notification.id);
handleNotification(message.notification); // payment.succeeded…
}
if (message.type === "ERROR") console.error(message.code, message.message);
});
ws.on("close", () => scheduleReconnect()); // reconnecter avec un délai croissantMessages que vous envoyez
requestId est libre et renvoyé dans la réponse, pour que vous la rapprochiez de votre demande.
Envoi
{ "type": "INITIATE_PAYMENT", "requestId": "r1", "amount": 3000, "phoneNumber": "70998877", "network": "ORANGE_MONEY", "externalReference": "CMD-2001" }
{ "type": "INITIATE_WITHDRAWAL", "requestId": "r2", "amount": 15000, "phoneNumber": "75443322", "network": "ORANGE_MONEY", "externalReference": "RET-779" }
{ "type": "GET_TRANSACTION", "requestId": "r3", "reference": "PAY261005O4UMEHUIAV" }
{ "type": "PING" }Réponses
ACK confirme la création (avec, pour un paiement, le collectionNumber à afficher au client). Les codes d’erreur sont ceux de la page Erreurs.
Réception
{ "type": "ACK", "requestId": "r1", "transaction": { "reference": "PAY261005O4UMEHUIAV", "status": "PENDING", "collectionNumber": "+22670000001", "...": "…" } }
{ "type": "TRANSACTION", "requestId": "r3", "transaction": { "...": "…" } }
{ "type": "PONG", "serverTime": "2026-10-05T17:40:30.898163" }
{ "type": "ERROR", "requestId": "r2", "code": "BAD_REQUEST", "message": "Le montant doit être compris entre 100 et 1000000 !" }Résultats
Pour une opération initiée en WebSocket, le résultat arrive sur la connexion.
- Si vous n’êtes pas connecté au moment du résultat, il est envoyé sur votre webhook s’il est configuré, sinon à votre prochaine connexion (dans les 24 h).
- Envoyez un
PINGtoutes les 30 secondes et reconnectez-vous automatiquement en cas de coupure. - Plusieurs connexions simultanées sont possibles : chaque évènement est envoyé à toutes ; dédoublonnez par
notification.id.
Le contenu de
notification est le même que celui d’un webhook.Évènement
{ "type": "EVENT", "notification": { "id": "…", "event": "payment.succeeded", "sequence": 1, "data": { "...": "…" } } }