Notifications

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 croissant

Messages 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 PING toutes 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": { "...": "…" } } }